Vhdl 带进程的触发器实现。[硬件描述语言]

Vhdl 带进程的触发器实现。[硬件描述语言],vhdl,Vhdl,我的问题是关于以下代码: library ieee; use ieee.std_logic_1164.all; entity exam is port ( I,CLK,RESET : in std_logic; Q : out std_logic ); end entity; architecture exam_arc of exam is signal temp_sig : std_logic; begin process (CLK,RESET) b

我的问题是关于以下代码:

library ieee;
use ieee.std_logic_1164.all;

entity exam is port (
    I,CLK,RESET : in std_logic;
    Q : out std_logic
);
end entity;

architecture exam_arc of exam is
    signal temp_sig : std_logic;
begin
    process (CLK,RESET)
    begin
        if RESET = '1' then
            temp_sig <='0';
        elsif CLK'event and CLK='1' then
            temp_sig <= I;
        end if;
        Q <= temp_sig;
    end process;
end exam_arc;
ieee库;
使用ieee.std_logic_1164.all;
实体检查是端口(
一、 时钟,复位:在标准逻辑中;
Q:输出标准逻辑
);
终端实体;
建筑考试(以下简称考试)
信号温度信号:标准逻辑;
开始
过程(时钟、复位)
开始
如果重置='1',则

你可以自己合成它

另请参见几乎相同的
ffv3

更新
我被丢失的格式误导了——事实上,正如另一个答案已经显示的那样,它实际上是在下降边缘切换

尽管所有ASignment都是按顺序进行的,但信号分配仍发生在过程结束时,因此
temp_信号
已过半个时钟周期(下一个下降沿),并且不包含最近分配的值



你可以自己合成它

另请参见几乎相同的
ffv3

更新
我被丢失的格式误导了——事实上,正如另一个答案已经显示的那样,它实际上是在下降边缘切换

尽管所有ASignment都是按顺序进行的,但信号分配仍发生在过程结束时,因此
temp_信号
已过半个时钟周期(下一个下降沿),并且不包含最近分配的值



你模拟过吗?Q什么时候变化?为什么?信号何时更新?在上升沿期间,Q是否得到I的值?一定要模拟它

你模拟过吗?Q什么时候变化?为什么?信号何时更新?在上升沿期间,Q是否得到I的值?一定要模拟它

这是一个骗人的问题。请注意,进程在上升和下降时钟边缘都会唤醒,并且中间信号temp_sig被分配到上升沿

把它和信号分配(延迟分配)的语义放在一起,看看你得到了什么


按照Jim的建议,通过模拟进行交叉检查…

这是一个诡计问题。请注意,进程在上升和下降时钟边缘都会唤醒,并且中间信号temp_sig被分配到上升沿

把它和信号分配(延迟分配)的语义放在一起,看看你得到了什么


按照Jim的建议,通过模拟进行交叉检查…

将分配给Q的任务分离到具有相同灵敏度列表的自己的流程语句中。仿真模型的行为将是相同的,尽管它们在进程数量上有所不同

DUT:
    process (CLK,RESET)
    begin
        if RESET = '1' then
            temp_sig <='0';
        elsif CLK'event and CLK ='1' then
            temp_sig <= I;
        end if;
--        Q <= temp_sig;
    end process;

QDEVICE:
    process (CLK, RESET)
    begin
        Q <= temp_sig;
    end process;
DUT:
过程(时钟、复位)
开始
如果重置='1',则

temp_sig使用相同的灵敏度列表将Q的赋值分离到它自己的过程语句中。仿真模型的行为将是相同的,尽管它们在进程数量上有所不同

DUT:
    process (CLK,RESET)
    begin
        if RESET = '1' then
            temp_sig <='0';
        elsif CLK'event and CLK ='1' then
            temp_sig <= I;
        end if;
--        Q <= temp_sig;
    end process;

QDEVICE:
    process (CLK, RESET)
    begin
        Q <= temp_sig;
    end process;
DUT:
过程(时钟、复位)
开始
如果重置='1',则

temp_sig让我们看看以下代码行:

    elsif CLK'event and CLK='1' then
CLK是您的计时信号(也称为时钟)

CLK’事件在CLK值发生变化时触发。 CLK='1'表示时钟等于高电平

因此,如果时钟已更改,并且当前处于高状态,那么我们将在该ELSIF语句中执行代码

我们知道位变量只有两种状态,所以如果CLK改变,它变为高状态,那么它最初处于低状态。这意味着只有当时钟从低到高时,代码才会执行

如果希望在从高到低的触发器上执行,则应将语句更改为如下所示:

    elsif CLK'event and CLK='0' then

让我们看一下以下代码行:

    elsif CLK'event and CLK='1' then
CLK是您的计时信号(也称为时钟)

CLK’事件在CLK值发生变化时触发。 CLK='1'表示时钟等于高电平

因此,如果时钟已更改,并且当前处于高状态,那么我们将在该ELSIF语句中执行代码

我们知道位变量只有两种状态,所以如果CLK改变,它变为高状态,那么它最初处于低状态。这意味着只有当时钟从低到高时,代码才会执行

如果希望在从高到低的触发器上执行,则应将语句更改为如下所示:

    elsif CLK'event and CLK='0' then

正确的代码缩进可以预防眼癌——我听说……正确的代码缩进可以预防眼癌——我听说……因此,信号分配似乎是在过程结束时完成的,我做对了吗?谢谢!看来信号分配是在过程结束时完成的,我做对了吗?谢谢!