Events 标准逻辑向量上的VHDL事件关键字

Events 标准逻辑向量上的VHDL事件关键字,events,process,vhdl,Events,Process,Vhdl,我正在用VHDL实现一个低功耗的数字设计。该设计有许多输入,它们被声明为多个标准逻辑向量。如果任何输入发生任何变化,则允许设备唤醒。这必须是组合逻辑,因为设备处于断电状态。我试图做的代码说明了一切:(ToggleSTDBY是一个信号,所以这是合法的) P_唤醒:进程(VEC1、VEC2、VEC3、Rst_N)已启动 开始 如果Rst_N='0',则 ToggleSTDBY即使可以编写一个VHDL代码来模拟您的预期行为,我相信它也不会像您期望的那样工作。我建议在编写代码之前,您尝试整理一下您的开关

我正在用VHDL实现一个低功耗的数字设计。该设计有许多输入,它们被声明为多个标准逻辑向量。如果任何输入发生任何变化,则允许设备唤醒。这必须是组合逻辑,因为设备处于断电状态。我试图做的代码说明了一切:(ToggleSTDBY是一个信号,所以这是合法的)

P_唤醒:进程(VEC1、VEC2、VEC3、Rst_N)已启动
开始
如果Rst_N='0',则

ToggleSTDBY即使可以编写一个VHDL代码来模拟您的预期行为,我相信它也不会像您期望的那样工作。我建议在编写代码之前,您尝试整理一下您的
开关设置、测试和重置的详细信息(电路图可能会有所帮助)

如果您决定将
ToggleSTDBY
作为一个向量来实现,那么“事件仅支持单位信号”问题的一个解决方案是使用
来生成
,将循环移动到进程外部:

gen: for i in ToggleSTDBY'range generate

    p_wakeup : process (vec, rst_n) is
    begin
        if rst_n = '0' then
            ToggleSTDBY(i) <= '0';
        else
            if vec(i)'event then
                ToggleSTDBY(i) <= not (ToggleSTDBY(i));
            end if;
        end if;
    end process p_wakeup;

end generate;
gen:for i in ToggleSTDBY'范围内生成
p_唤醒:进程(vec,rst_n)为
开始
如果rst_n='0',则

切换stdby(i)VHDL的HDL部分是硬件描述语言(HDL)的缩写, 因此,您可以使用的VHDL结构必须能够通过合成进行映射 工具指向目标。
事件的使用通常与顺序相关
(时钟)硬件元件,如触发器或RAM,以及合成工具
通常需要以特定的方式编写VHDL,以便该工具能够
确定要使用的特定硬件元件

即使您可以为模拟器(例如ModelSim)编写VHDL代码,但 可以编译和模拟使用
“事件”
,如您的示例中的合成 工具通常无法将其映射到任何可用的目标硬件 元素,因为可能没有像
事件这样的硬件元素
探测器

但是一个
事件实际上表明信号值发生了变化,所以你可以
用VHDL明确写入信号值变化检测器,如:

change <= '1' if (vec_now /= vec_previous) else '0';

change这是否可以在没有时钟的情况下进行?我认为“事件需要一些关于信号先前状态的信息,我认为这需要一个时钟。”。除非这可以用锁存器实现?@Russell:这是用异或和延迟线实现的。合成工具知道设备中不同块的定时,因此它可以确保XOR的每个输入的延迟是不同的,因此尽管XOR的输入是相同的信号,但XOR将脉冲高,因为瞬变先到达一侧。DFF块的时钟输入中还内置了边缘检测电路。
gen: for i in ToggleSTDBY'range generate

    p_wakeup : process (vec, rst_n) is
    begin
        if rst_n = '0' then
            ToggleSTDBY(i) <= '0';
        else
            if vec(i)'event then
                ToggleSTDBY(i) <= not (ToggleSTDBY(i));
            end if;
        end if;
    end process p_wakeup;

end generate;
change <= '1' if (vec_now /= vec_previous) else '0';