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