For loop vhdl“;分析错误,对于“异常”;
我试图在ISE14.4中用vhdl编写crc16计算程序,但不明白为什么会在其中出现“parse error,unexpected for”。试图将其付诸实施,但效果不太理想For loop vhdl“;分析错误,对于“异常”;,for-loop,vhdl,crc16,For Loop,Vhdl,Crc16,我试图在ISE14.4中用vhdl编写crc16计算程序,但不明白为什么会在其中出现“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
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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体crc16是端口(
时钟:在标准逻辑中:='0');
末端crc16;
crc16的体系结构是
信号数据:标准逻辑向量(15到0):=“1010101010101010”;
信号外部数据:标准逻辑向量(31到0);
信号crc16_原始:标准逻辑向量(15向下至0):=“1100000000000010”;
信号crc16:标准逻辑向量(15至0);
信号位置:标准逻辑向量(5到0);
信号crc输出:标准逻辑向量(14至0);
信号i:标准逻辑向量(5到0);
开始
对于1到15循环中的i
ext_数据(i+16)有几个问题需要指出:
- for循环必须在一个进程中,因此可能会导致您看到的“parse error,unexpected for”
- 与
>
的关系比较可能会给标准逻辑向量
带来意外的结果,因此在进行比较之前,您可以查看用于强制转换的数值标准
包,例如无符号(标准逻辑向量)
- 比较
外部数据(i)=“1”
是非法的,因为将“1”
视为标准逻辑向量
,其中as外部数据(i)
是标准逻辑
;相反,将编译ext_data(i)='1'
- 如果外部数据(i)=“1”位置=i,则在
周围非法施工代码>,因为没有那么等等
- 有一个标识符为i的信号,它也被用作循环变量,其结果是
位置感谢解释。很抱歉,我没有足够的声誉投你一票。不客气;希望它能让您在VHDL领域领先;-)
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;