晚上好^^
再一次,我遇到了一个VHDL描述的问题,我似乎无法找到或识别问题。
我需要实现一个 Galois 伪随机数生成器。这是一张图片:
最后应该会变成循环冗余校验(CRC),虽然任务没有提供很清楚的描述,而且我们也没有在讲座中涉及这个话题。
问题是在仿真中,我从仿真开始到仿真结束的输出端(x_out)的所有引脚上都是'1',我无法正确解释。这似乎不是预期的行为。描述没有抛出任何警告或错误,精心设计的原理图到目前为止似乎是正确的。
编辑:(如果我将 Q_out 和 D_in 标准值从 :='1' 更改为无,则输出未定义...)
假设一:会不会是我这样接内部信号不被允许? 假设 2:D 触发器没有适当的初始值?
对于正在使用的D触发器,我最初写道: Q_out: out std_logic := '1'; -- 这样他们就可以在下一个触发器的输出端输出“1”,因为以某种方式将默认值分配给输入引脚是行不通的。 D_in: 在 std_logic := '1'; -- 由于某些未知原因,这不起作用。
也许你有一个好主意,这是另一个小问题,比如忘记了 rising_edge 检查......提前感谢你的帮助。
这里是一个说明电路应该如何构建的图表:
我知道最后我会实现它是一个通用循环,但我会首先检查这个设计是如何工作的:)
来自伪随机数生成器的代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity PZG is
generic(
nbit : integer :=4
);
Port(
clk_in_m : in std_logic;
k_in : in std_logic_vector(nbit downto 0);
x_out : out std_logic_vector(nbit-1 downto 0)
);
end PZG;
architecture Behavioral of PZG is
component D_FF
Port(
clk_in : in std_logic;
D_in : in std_logic := '1';
Q_out : out std_logic := '1'
);
end component;
signal internal_and : std_logic_vector(nbit downto 0);
signal internal_out : std_logic_vector(nbit-1 downto 0);
signal internal_xor : std_logic_vector(nbit-2 downto 0);
begin
X0: D_FF port map(D_in=>internal_and(0),clk_in=>clk_in_m,Q_out=>internal_out(0));
X1: D_FF port map(D_in=>internal_xor(0),clk_in=>clk_in_m,Q_out=>internal_out(1));
X2: D_FF port map(D_in=>internal_xor(1),clk_in=>clk_in_m,Q_out=>internal_out(2));
X3: D_FF port map(D_in=>internal_xor(2),clk_in=>clk_in_m,Q_out=>internal_out(3));
internal_and(0)<= k_in(0) and internal_and(nbit);
internal_and(1) <= k_in(1) and internal_and(nbit);
internal_and(2) <= k_in(2) and internal_and(nbit);
internal_and(3) <= k_in(3) and internal_and(nbit);
internal_and(4) <= k_in(4) and internal_out(3);
internal_xor(0) <= internal_out(0) xor internal_and(1);
internal_xor(1) <= internal_out(1) xor internal_and(2);
internal_xor(2) <= internal_out(2) xor internal_and(3);
x_out(0) <= internal_out(0);
x_out(1) <= internal_out(1);
x_out(2) <= internal_out(2);
x_out(3) <= internal_out(3);
end Behavioral;
Code from the D-Flip-Flop:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity D_FF is
Port(
clk_in : in std_logic;
D_in : in std_logic := '1';
Q_out : out std_logic := '1'
);
end D_FF;
architecture Behavioral of D_FF is
signal internal_signal : std_logic := '1';
begin
process(clk_in)
begin
if(rising_edge(clk_in)) then
Q_out <= D_in;
end if;
end process;
end Behavioral;