2013-08-27 58 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世界中領先你;-) –

相關問題