VHDL内部信号分配不起作用

问题描述 投票:0回答:1

我是 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 的副本

embedded vhdl modelsim intel-fpga
1个回答
0
投票

我添加了一个测试平台,在使用 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.

© www.soinside.com 2019 - 2024. All rights reserved.