我尝试在ise 14.4中的vhdl上编写programm来进行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;
答案 0 :(得分: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的信号,我也将其用作循环变量,结果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位;这可能不会产生预期的结果。
没有为std_logic_vector
(VHDL-2002)定义srl,因此请考虑使用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;