Есть несколько вопросов, которые указывают:
для-петли должны быть в процессе, так что, скорее всего, чтобы вызвать «Ошибка синтаксического анализа, неожиданные для», что вы видите.
Отношение сравнить с >
может дать неожиданный результат для 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;
благодарственное для объяснения. Извините, но у меня недостаточно репутации, чтобы проголосовать за вас. –
Добро пожаловать; надеюсь, что это приведет вас в мир VHDL ;-) –