VHDL-iSIM输出未初始化,不';不能改变状态

VHDL-iSIM输出未初始化,不';不能改变状态,vhdl,simulation,Vhdl,Simulation,您好,我是Xilinx的新用户,在如何在测试台上编写刺激/模拟方面遇到了麻烦。我的输出(Kd)没有给出任何合理的值,在移动并始终保持在“1”之前的前几个时钟周期中给出了“u” 不确定我是否写了正确的刺激,但希望有人能帮我 我的VHDL代码 IEEE库; 使用IEEE.STD_LOGIC_1164.ALL; 实体代码图2b为 端口(R0:STD_逻辑中; R1:标准逻辑中; R2:标准逻辑中; R3:标准逻辑中; Kd:输出标准逻辑; 时钟:标准逻辑); 结束代码图2b; 代码图2b的体系结构是

您好,我是Xilinx的新用户,在如何在测试台上编写刺激/模拟方面遇到了麻烦。我的输出(Kd)没有给出任何合理的值,在移动并始终保持在“1”之前的前几个时钟周期中给出了“u”

不确定我是否写了正确的刺激,但希望有人能帮我

我的VHDL代码
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体代码图2b为
端口(R0:STD_逻辑中;
R1:标准逻辑中;
R2:标准逻辑中;
R3:标准逻辑中;
Kd:输出标准逻辑;
时钟:标准逻辑);
结束代码图2b;
代码图2b的体系结构是
信号Qa,Qb:STD_逻辑;
开始
进程(时钟,R0,R1,R2,R3)
开始
如果时钟='1'和时钟事件,则
Qa R2,
R3=>R3,
Kd=>Kd,
时钟=>时钟
);
--时钟进程定义
时钟进程:进程
开始

时钟无需模拟即可回答此问题。Kd的输出将变为“1”并保持不变

    process(clock, R0, R1, R2, R3)
        begin
        if clock = '1' and clock'event then
        Qa <= (R0 or R1 or R2 or R3) or (Qa and Qb);
        Qb <= Qa;
        end if;
    end process;
Kd <= Qa and Qb;  
过程(时钟、R0、R1、R2、R3)
开始
如果时钟='1'和时钟事件,则

Qa您构建的是一个顺序逻辑,这意味着输出取决于输入/输出的先前逻辑。在你的例子中,我们有Qa,Qb是Qa的最后一个值

记住这一点,您在testbench中使用的方法不是最佳的,因为您正在尝试输入的每一个组合,而没有考虑最后一个Qa实际上是重要的

情况就是这样:

Start :   Qa = U    Qb = U     =>    Kb = U
Inputs 1: Qa = 1    Qb = U     =>    Kb = U
Inputs 2: Qa = 1    Qb = 1     =>    Kb = 1
Inputs 3: Qa = 1    Qb = 1     =>    Kb = 1
Inputs 4: Qa = 1    Qb = 1     =>    Kb = 1
....
一个Rs变高,Qa就变高。根据输入组合的顺序,Qa不会再次降低。 这意味着在第二次输入组合之后,Qb得到一个已知值,Kb变高


敏感度列表

这不是答案的一部分,但这是对您编写的代码的考虑:您已将敏感度列表R0、R1、R2、R3放在上面,但考虑到您在此之后编写的内容,这是没有必要的

这个过程只有在

if clock'event and clock = 1 then
这意味着Rs上的任何事件都将被忽略。我确信synthetizer确实意识到了这一点,并且忽略了它,但是设置一个适当的灵敏度列表是一个很好的实践,并且在可能的情况下,只对顺序逻辑和有限状态机使用时钟化的进程

我还建议您使用可读性更强的上升沿(时钟)和下降沿(时钟)功能:

process(clock)
begin
    if rising_edge(clock) then
        Qa <= R0 or R1 or R2 or R3 or (Qa and Qb);
        Qb <= Qa;
    end if;
end process;
进程(时钟)
开始
如果上升沿(时钟),则

Qa很棒的测试用例。顺便说一句,非常感谢您抽出时间来解释!那么这是否意味着我的模拟结果是正确的?还有,我的刺激计划是否正确?我是否需要为所有输入都较低的第一个时钟添加刺激?再次感谢你的帮助!我认为这是一个很好的决定,你的设计要么没有用,要么你没有正确地模拟它。锁定到“1”输出的东西似乎没有用。防止这种情况的方法是每隔一个时钟将所有R0、R1、R2、R3都设置为“0”。这里有点问题,我在任何地方都找不到图2b的参考。看起来它是从一个示意图上拿的,门上有一个丢失的气泡或者什么的。嘿,谢谢你的解释!是的,我最初没有在敏感度列表中包括Rs,但当我注意到Kd有一个奇怪的输出时,我想也许我需要包括em。很高兴知道为什么我不包括它们;不过我不需要。所以我得到的模拟似乎是正确的?是的!如果你想一想,一旦Qa=Qb=1,一切都变得独立,因为(Qa和Qb)总是正确的。我在回答中添加了另一个概念:这是一件你可能已经知道的基本事情,但如果你不知道,这可能会帮你省去一些麻烦非常感谢你。这一解释澄清了很多问题。@bzrk89没问题,如果您需要帮助,请发布另一个问题,我正在监视“vhdl”标记:)如果可以,请将我的答案向上投票,并/或选择它作为您的首选答案。这有助于我为未来的答案建立声誉:)谢谢!
if clock'event and clock = 1 then
process(clock)
begin
    if rising_edge(clock) then
        Qa <= R0 or R1 or R2 or R3 or (Qa and Qb);
        Qb <= Qa;
    end if;
end process;
-- Let's assume A = 0 and B = 0 at startup
clocked_process : process(clk)
begin
    if rising_edge(clk) then
        A <= '1';
        B <= A;
        A <= '0';
    end if;
end process;
...
case A is
when "00" =>
    B <= '0';
when "01" =>
    B <= '0';
when "10" =>
    B <= '0';
when "11" =>
    B <= '1';
end case;
...
...
B <= '0';
if A = "11" then
    B <= '1';
end if;
...