我正在为大学项目学习VHDL。目标是在给定特定多项式的情况下编写CRC电路。我找到了使用注册的在线解决方案,但我想使用实际的D-FlipFlop来实现。
因此,我创建了D-FlipFlop,并使用generate将它们的几个实例放入我的主文件中,以使其更加灵活并能够轻松添加或删除触发器。
library IEEE;
use IEEE.std_logic_1164.all;
entity LFSR is
generic (NBit : positive := 8);
port(
clk :in std_logic;
reset :in std_logic;
din :in std_logic;
dout :out std_logic_vector(Nbit-1 downto 0)
);
end LFSR;
architecture rtl of LFSR is
component DFC
port(
clk :in std_logic;
reset :in std_logic;
d :in std_logic;
crc :out std_logic;
q :out std_logic
);
end component DFC;
signal q_s : std_logic_vector (NBit-1 downto 0):= (others => '0');
signal crc_t : std_logic_vector (NBit-1 downto 0):= (others => '0'); --registro temporaneo su cui fare le operazioni
signal int_0 :std_logic := '0';
signal int_2 :std_logic := '0';
signal int_4 :std_logic := '0';
signal int_8 :std_logic := '0';
begin
int_0<= din xor q_s(7);
int_2<= q_s(1) xor q_s(7);
int_4<= q_s(3) xor q_s(7);
GEN: for i in 0 to Nbit-1 generate
FIRST: if i=0 generate
FF1: DFC port map (
clk => clk,
reset => reset,
d => int_0,
crc => crc_t(i), --funziona benissimo se metto dout(i)
q => q_s(i)
);
end generate FIRST;
THIRD: if i=2 generate
FF2: DFC port map (
clk => clk,
reset => reset,
d => int_2,
crc => crc_t(i),
q => q_s(i)
);
end generate THIRD;
FIFTH: if i=4 generate
FF4: DFC port map (
clk => clk,
reset => reset,
d => int_4,
crc => crc_t(i),
q => q_s(i)
);
end generate FIFTH;
INTERNAL: if i>0 and i<Nbit-1 and i/= 2 and i/=4 generate
FFI: DFC port map (
clk => clk,
reset => reset,
d => q_s(i-1),
crc => crc_t(i),
q => q_s(i)
);
end generate INTERNAL;
LAST: if i=Nbit-1 generate
FFN: DFC port map (
clk => clk,
reset => reset,
d => q_s(i-1),
crc => crc_t(i),
q => q_s(i)
);
end generate LAST;
end generate GEN;
variable t : natural := 0;
begin
if(rising_edge(clk)) then
t:= t+1;
if t=24 then
dout <= crc_t;
end if;
end if;
end process;
end rtl;
当然,在第35行中,我在其中放置了“ d => din xor q_s(Nbit-1)”,编译器给了我一个错误。如何获得想要获得的结果?
我试图通过中介信号来解决此问题,但我不明白为什么它不能按预期工作。
这是DFC组件的代码:
library IEEE;
use IEEE.std_logic_1164.all;
entity DFC is
port(
clk :in std_logic;
reset :in std_logic;
d :in std_logic;
crc :out std_logic;
q :out std_logic
);
end DFC;
architecture rtl of DFC is
begin
process(clk, reset, d)
begin
if(reset = '1')then
q <= '0';
crc<= '0';
elsif (clk'event and clk='1') then
q <= d;
crc <= d;
end if;
end process;
end rtl;
谢谢大家提出的要求。 加布里埃。
编辑:我添加了所有LFSR代码和DFC代码。
答案 0 :(得分:0)
您的问题不完整,因为它没有minimal reproductible code。换句话说,很难为您提供帮助。
VHDL-2008之前的版本:
您无法执行以下操作:d => din xor q_s(Nbit-1)
,因为此行被视为操作,并且在实例化实体或组件时是不可能的。
但是,有一种解决方法,您必须创建一个新信号
请注意,当您使用代码时,错误应该类似于:Actual for formal port a is neither a static name nor a globally static expression
使用VHDL-2008:
如果看标准:http://www.fis.agh.edu.pl/~skoczen/hdl/ieee_std/ieee1076-2008.pdf 您可以在第6.5.6.3节中找到端口子句:
如果模式in的正式端口与不是全局静态的表达式相关联(请参见9.4.1),并且 形式是无约束或部分约束的复合类型,需要确定索引 根据5.3.2.2的规则从实际值开始,则表达式应为以下之一:
子类型为全局静态的对象的名称
一个索引名称,其前缀是此列表的成员之一
切片名称,其前缀是此列表的成员之一,并且其离散范围是全局静态离散范围
一个聚合,条件是所有选择都是局部静态的,并且元素关联中的所有表达式都是此列表中描述的表达式
函数调用,其返回类型标记表示全局静态子类型
合格的表达式或类型转换,其类型标记表示全局静态子类型
此列表中描述的并且括在括号中的表达式
换句话说,在VHDL-2008中,您提供的代码应该可以使用。
关于初始化问题,目前尚不清楚,哪些信号/变量未初始化?最好的办法是,如果您的第一个问题在本帖子中得到了很好的回答,请接受它的解决方案,或者编辑您的问题以使其更加清晰。然后在另一个线程中询问有关初始化问题的另一个问题。您也可以在Electronics Stackexchange
上发布您的问题