为什么在VHDL中使用并发语句?

为什么在VHDL中使用并发语句?,vhdl,Vhdl,我只是从学习vhdl开始。 考虑这里的代码:-< /P> 我不明白什么是并发语句,为什么这里需要它们? 如果我们在进程p中直接修改Q和Qbar而不使用内部信号“状态”是否正确?另外,为什么J,K不在代码段中进程p的敏感度列表中?您可能知道,从纯功能意义上讲(即不考虑硬件实现),并发语句不会引起任何延迟。所以当你写作的时候 Q <= state; 这是因为在VHDL中不严格允许读取输出信号。通过使用“状态”,您有一个内部信号,您可以从中导出Q和Qbar 另一种等效的实现方法是在状态机中的每

我只是从学习vhdl开始。 考虑这里的代码:-< /P> 我不明白什么是并发语句,为什么这里需要它们?
如果我们在进程p中直接修改Q和Qbar而不使用内部信号“状态”是否正确?另外,为什么J,K不在代码段中进程p的敏感度列表中?

您可能知道,从纯功能意义上讲(即不考虑硬件实现),并发语句不会引起任何延迟。所以当你写作的时候

Q <= state;
这是因为在VHDL中不严格允许读取输出信号。通过使用“状态”,您有一个内部信号,您可以从中导出
Q
Qbar

另一种等效的实现方法是在状态机中的每种情况下分配输出
Q
Qbar
,并完全消除中间
状态
信号。然而,这似乎有点复杂,因为对于一个等效的功能,代码行数几乎是原来的两倍



回答第二个问题:J,K不在敏感度列表中,因为过程
p
是一个同步过程。您描述的是一个内存元素(JK触发器),根据定义,它仅在
时钟
重置
更改时更新其输出。输入信号
J
K
可能会改变,过程不会更新其输出。每当出现时钟边缘或断言重置时,该过程“唤醒”并评估输入,并确定输出应该是什么。即使在J中,K也包括在敏感度列表中,如果输出仅在上升沿(时钟)上更新,则总体功能将是相同的(尽管代码可能会混淆)。

没有理由不在流程中分配
Q
Qbar
。不过你需要稍微小心一点

无论何时分配信号,该值都不会更新,直到模拟器进入下一个“增量循环”。这意味着,在进程中,当您分配信号时,实际上您只是在进行cheduling和update,如果您读取信号,您将获得“old”值。为了获得您可能期望的顺序更新,您使用了一个变量。因此,您可以像这样对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;
JK\U FF的架构是 开始 p:过程(时钟、复位)为 可变状态:标准逻辑; 变量输入:标准逻辑向量(1到0); 开始 如果(重置='1'),则 状态:='0'; elsif(上升沿(时钟))然后 输入:=J&K; 案例(输入)为 当“11”=> 状态:=非状态; 当“10”=> 状态:='1'; 当“01”=> 状态:='0'; 当其他人=> 无效的 终例; 如果结束;
学究模式:并发分配确实会导致增量周期延迟。
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;