vhdl“解析错误,意外FOR”

时间:2013-08-27 17:40:58

标签: for-loop vhdl crc16

我尝试在ise 14.4中的vhdl上编写programm来进行crc16计算,但是不明白为什么会出现“解析错误,意外的FOR”。试图把它付诸实践,但它也不起作用。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;


entity crc16 is port(
clk : in STD_LOGIC:='0');
end crc16;

architecture Behavioral of crc16 is
signal data:std_logic_vector(15 downto 0):="1010101010101010";
signal ext_data:std_logic_vector(31 downto 0);
signal crc16_original:std_logic_vector(15 downto 0):="1100000000000010";
signal crc16:std_logic_vector(15 downto 0);
signal position:std_logic_vector(5 downto 0);
signal crc_out:std_logic_vector(14 downto 0);
signal i:std_logic_vector(5 downto 0);

begin


for i in 1 to 15 loop
    ext_data(i+16)<=data(i);
end loop;

for i in 1 to 15 loop
    ext_data(i)<='0';
end loop;

while ext_data > "111111111111111" loop
        for i in 0 to 31 loop
            if ext_data(i)="1" position=i;
        end loop;

    crc16<= crc16_original srl 31-position;
    ext_data<=ext_data xor crc16;
end loop;

for i in 0 to 14 loop
    crc_out(i)<=ext_data(i);
end loop;


end Behavioral;

1 个答案:

答案 0 :(得分:3)

有几个问题需要指出:

  • for循环必须在一个进程中,因此可能会导致您看到的“解析错误,意外FOR”。

  • >的关系比较可能会为std_logic_vector带来意外结果,因此您可以查看numeric_std广告投放包,例如unsigned(std_logic_vector)在进行比较之前。

  • 比较ext_data(i) = "1"是非法的,因为"1"被视为std_logic_vector,其中ext_data(i)std_logic;相反ext_data(i) = '1'将编译。

  • if ext_data(i) = "1" position=i;周围的非法构造,因为没有then等。

  • 有一个带有标识符i的信号,我也将其用作循环变量,结果position <= i被视为integer分配给std_logic_vector;为信号和循环变量使用不同的名称。

  • 分配给信号不是position = i而是position <= i,就像其他地方一样。

  • 表达式31-position混合了integerstd_logic_vector,这些都无法与所选的包完成。使用unsigned投射。

  • ext_data<=ext_data xor crc16使用不同大小的参数,因为ext_data是32位而crc16是16位;这可能不会产生预期的结果。

  • 没有为std_logic_vector(VHDL-2002)定义srl,因此请考虑使用unsigned进行定义良好的行为。

  • 假设您的代码是“沙盒”代码,因为它没有输出。

基于以上所述,您可以考虑使用较小的设计进行一些初步实验,以便熟悉不同的VHDL结构,并了解它如何模拟并映射到硬件;记住VHDL是“硬件描述语言”而不是编程语言。

下面是一些在ModelSim中编译的代码,不太可能给出预期的结果:

library ieee;
use ieee.std_logic_1164.all;

entity crc16 is port(
  clk : in std_logic := '0');
end crc16;


library ieee;
use ieee.numeric_std.all;

architecture Behavioral of crc16 is
  signal data : std_logic_vector(15 downto 0) := "1010101010101010";
  signal ext_data : std_logic_vector(31 downto 0);
  signal crc16_original : std_logic_vector(15 downto 0) := "1100000000000010";
  signal crc16 : std_logic_vector(15 downto 0);
  signal position : std_logic_vector(5 downto 0);
  signal crc_out : std_logic_vector(14 downto 0);
  signal i_sig : std_logic_vector(5 downto 0);

begin

  process (clk) is
  begin
    if rising_edge(clk) then

      for i in 1 to 15 loop
        ext_data(i+16) <= data(i);
      end loop;

      for i in 1 to 15 loop
        ext_data(i) <= '0';
      end loop;

      while ext_data > "111111111111111" loop
        for i in 0 to 31 loop
          if ext_data(i) = '1' then
            position <= i_sig;  -- TBD[Probably not right code, but compiles]
          end if;
        end loop;
        crc16 <= std_logic_vector(unsigned(crc16_original) srl (31 - to_integer(unsigned(position))));
        ext_data <= ext_data xor crc16;
      end loop;

      for i in 0 to 14 loop
        crc_out(i) <= ext_data(i);
      end loop;

    end if;
  end process;

end Behavioral;