1

我尝试在 ise 14.4 中的 vhdl 上编写程序以进行 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;
4

1 回答 1

3

有几个问题需要指出:

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

  • 关系 compare with>可能会给 带来意想不到的结果std_logic_vector,因此您可以在进行比较之前numeric_std查看用于强制转换的包,例如。unsigned(std_logic_vector)

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

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

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

  • 分配给信号 is not position = ibut position <= i,就像其他地方一样。

  • 表达式31-position混合integerstd_logic_vector,这不能用选定的包完成。使用强制转换unsigned

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

  • srl 没有为std_logic_vector(VHDL-2002) 定义,因此请考虑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;
于 2013-08-27T20:10:42.640 回答