2013-08-27 60 views
1

我尝试在isc 14.4的vhdl上编写程序,用于crc16的计算,但不明白为什么会在其中得到“parse error,unexpected FOR”。试图把它放到过程中,但它不起作用。vhdl“parse error,unexpected 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; 

回答

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的信号,这是我也用作循环变量,以作为integer分配给该std_logic_vectorposition <= i取结果;对信号和循环变量使用不同的名称。

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

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

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

  • 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; 
+0

感谢解释。我很抱歉,但我没有足够的声望投票给你。 –

+0

不客气,希望它能在VHDL世界中领先你;-) –

相关问题