我是 VHDL 编程的新手,我在使用此 VHDL 代码(同步计数器)时遇到问题。变量 Q_AUX_4 从未分配给输出 Q_OUT,因为当我尝试使用 modelsim 运行仿真时,变量 Q_AUX_4 始终设置为“UUUU”。这更奇怪,因为 Q_AUX_4 被初始化为“0000”,所以就好像该行从未被触发。谢谢大家的每一次回复
counter4.vhdl
LIBRARY IEEE;
USE ieee.STD_LOGIC_1164.all;
ENTITY COUNTER4 IS
PORT ( EN,CK,CL: IN STD_LOGIC;
Q_OUT: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
T_OUT_4: OUT STD_LOGIC);
END COUNTER4;
ARCHITECTURE BEHAVIOR OF COUNTER4 IS
COMPONENT T_FLIP_FLOP IS
PORT ( T,CLK,CL: IN STD_LOGIC;
Q, T_OUT: OUT STD_LOGIC);
END COMPONENT;
SIGNAL Q_AUX_4 : STD_LOGIC_VECTOR(3 DOWNTO 0) := (OTHERS=>'0');
SIGNAL T_AUX: STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
F0: T_FLIP_FLOP PORT MAP(EN,CK,CL,Q_AUX_4(0),T_AUX(0));
F1: T_FLIP_FLOP PORT MAP(T_AUX(0),CK,CL,Q_AUX_4(1), T_AUX(1));
F2: T_FLIP_FLOP PORT MAP(T_AUX(1),CK,CL,Q_AUX_4(2), T_AUX(2));
F3: T_FLIP_FLOP PORT MAP(T_AUX(2),CK,CL,Q_AUX_4(3), T_AUX(3));
Q_OUT <= Q_AUX_4;
T_OUT_4 <= (T_AUX(2) AND Q_AUX_4(3));
END BEHAVIOR;
T_flip_flop.vhdl
LIBRARY IEEE;
USE ieee.std_logic_1164.all;
ENTITY T_flip_flop is
PORT ( T,CLK, CL: IN STD_LOGIC;
Q, T_OUT: OUT STD_LOGIC);
end T_flip_flop;
Architecture Behavior of T_flip_flop is
SIGNAL Q_AUX: STD_LOGIC := '0';
BEGIN
PROCESS (T,CLK,CL)
BEGIN
if ((CLK = '1' AND CLK'EVENT) AND T = '1') THEN
Q_AUX <= NOT Q_AUX;
else Q_AUX <= Q_AUX;
END IF;
IF (CL = '1') THEN Q_AUX <= '0';
END IF;
Q <= Q_AUX;
T_OUT <= (Q_AUX AND T);
END PROCESS;
END behavior;
我尝试将赋值放入由Q_AUX_4触发的进程中,但结果是相同的。我希望 Q_OUT 是 Q_AUX_4 的副本
我添加了一个测试平台,在使用 GHDL q_out 模拟原始代码时,q_out 正在计数,并且始终与“UUUU”不同。 因此,您的测试平台可能存在您未显示的问题。 在我的测试平台中,ck 的时钟上升沿为 10ns、20ns,... 我是这样刺激cl和en的:
cl <= '0'; -- for all time
en <= '0', '1' after 21 ns;
对您的设计的一些提示:
在 t_flip_flop 中,输入 cl 表现为异步复位。
在 t_flip_flop 中,输入 t 的行为类似于同步使能。
为了确保综合工具准确理解您想要的内容,大多数情况下,具有异步复位和同步启用的时钟过程是这样描述的:
process(clk, cl)
begin
if cl='1' then
q_aux <= '0';
elsif clk='1' and clk'event then
if t='1' then
q_aux <= not q_aux;
end if;
end if;
end process;
请注意,我修改了上面代码中的敏感度列表: 信号 t 不应成为灵敏度列表的一部分,因为 t 仅在存在时钟上升沿时才相关。
请注意,我移入了上面的代码
q <= q_aux;
t_out <= q_aux and t;
在这个过程中,因为在您的实现中,信号 q 总是在时钟下降沿改变其值,因为:
由于对 q_aux 的分配是在时钟进程完成后完成的,并且 q_aux 不是敏感度列表的一部分(这对于时钟进程来说是正确的), 赋值“q <= q_aux" takes place when the process is triggered the next time, which is the falling clock edge.