【问题标题】:Why use concurrent statements in VHDL?为什么在 VHDL 中使用并发语句?
【发布时间】:2023-03-25 12:27:01
【问题描述】:

我刚开始学习 vhdl。 考虑这里的代码:-http://esd.cs.ucr.edu/labs/tutorial/jkff.vhd

我不明白什么是并发语句,为什么这里需要它们? 如果我们直接在进程 p 中修改 Q 和 Qbar 而不使用内部信号“状态”,是否正确?还有为什么 J,K 不在 sn-p 中进程 p 的敏感列表中?

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    您可能知道,并发语句在纯功能意义上(即不考虑硬件实现)不会产生任何延迟。所以当你写

    Q <= state;
    

    在功能上,Q 完全遵循 state 没有任何延迟。

    我猜测之所以使用中间信号state,而不是在进程内部直接分配Q,是因为如果您在该过程中直接分配一个输出Q,那么您无法“读取”输出以导出您的 Qbar 信号。

    也就是说,你不能这样做:

    Qbar <= not Q;
    

    这是因为在 VHDL 中读取输出信号并不是严格允许的。通过使用“状态”,您可以获得一个内部信号,您可以从中得出QQbar

    另一种等效的实现是在状态机中的每种情况下都分配QQbar,并完全消除中间state 信号。但是,这似乎有点复杂,因为对于等效功能,您将拥有几乎两倍的代码行数。


    回答你的第二个问题:J,K 不在敏感列表中,因为进程p 是一个同步进程。您正在描述一个内存元素 (JK FlipFlop),根据定义,它仅在 clockreset 更改时更新其输出。输入信号JK 可以更改,并且进程不会更新其输出。每次出现时钟沿,或reset 被断言时,进程“唤醒”并评估输入,并确定输出应该是什么。即使在 J,K 中包含在敏感度列表中,只要您的输出仅在 rising_edge(clock) 上更新,那么整体功能将是相同的(尽管您的代码会令人困惑)。

    【讨论】:

    【解决方案2】:

    没有理由不在进程中分配QQbar。不过你需要小心一点。

    无论何时分配一个信号,该值都不会更新,直到模拟器进入下一个“增量周期”。这意味着在进程中,当您分配给信号时,您实际上只是 调度 和更新,如果您读取信号,您将获得“旧”值。为了获得您可能期望的那种顺序更新,您使用了一个变量。所以你可以像这样对 JKFF 建模:

    architecture behv of JK_FF is
    begin
        p : process(clock, reset) is
        variable state : std_logic;
            variable input : std_logic_vector(1 downto 0);
        begin
            if (reset = '1') then
                state := '0';
            elsif (rising_edge(clock)) then
                input := J & K;
                case (input) is
                    when "11" =>
                        state := not state;
                    when "10" =>
                        state := '1';
                    when "01" =>
                        state := '0';
                    when others =>
                        null;
                end case;
            end if;
            Q  <= state;
            Qbar <= not state;
        end process;
    end behv;
    

    综合说明:对 Q 和 Qbar 的分配发生在 if rising_edge(clk) 之外,因此将被解释为就像并发驱动程序一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多