2013-08-27 2 views
1

Я пытаюсь написать программу на vhdl в ise 14.4 для вычисления crc16, но не понимаю, почему в ней возникает «ошибка синтаксического анализа, неожиданное FOR». Пытался внедрить его в процесс, но он тоже не работает.vhdl "ошибка синтаксического анализа, неожиданная 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

Есть несколько вопросов, которые указывают:

  • для-петли должны быть в процессе, так что, скорее всего, чтобы вызвать «Ошибка синтаксического анализа, неожиданные для», что вы видите.

  • Отношение сравнить с > может дать неожиданный результат для 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 Смеси integer и std_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 ;-) –