我正在用 VHDL 实现数字设计,该设计必须低功耗。该设计有许多输入被声明为多个标准逻辑向量。如果任何输入发生任何变化,则允许唤醒设备。这必须是组合逻辑,因为设备处于断电状态。我想做的代码说明了一切:(ToggleSTDBY 是一个信号,所以这是合法的)
P_Wakeup: PROCESS (VEC1, VEC2, VEC3, Rst_N) IS
BEGIN
IF Rst_N = '0' THEN
ToggleSTDBY <= '0';
ELSIF VEC1'event OR VEC2'event OR VEC3'event THEN
ToggleSTDBY <= NOT(ToggleSTDBY);
END IF;
END PROCESS P_Wakeup;
这在模拟中是合法的,但在综合时它说“'事件仅支持单位信号”。我怎样才能解决这个问题?这些向量总共有 66 位,我真的不想编写 66 个进程来唤醒设备。对所有位进行按位“或”不会解决任何问题,因为大多数信号将为高电平,因此对所有位进行“或”将始终导致高电平。代码如下:
P_Wakeup: PROCESS (VEC, Rst_N) IS
BEGIN
IF Rst_N = '0' THEN
ToggleSTDBY <= '0';
ELSE
FOR i IN VEC'RANGE LOOP
IF VEC(i)'EVENT THEN
ToggleSTDBY <= NOT(ToggleSTDBY);
END IF;
END LOOP;
END IF;
END PROCESS P_Wakeup;
给出错误“信号属性'EVENT的前缀必须是静态信号名称”。我该如何修复它并保持代码可读?
最佳答案
VHDL的HDL部分是硬件描述语言(HDL)的缩写,
因此,您可以使用的 VHDL 结构必须能够通过综合进行映射
工具到达目标。 'event
的使用通常与顺序相关
(时钟)硬件元件,如触发器或 RAM,以及综合工具
通常要求您以特定方式编写 VHDL,因此该工具可以
确定要使用的特定硬件元素。
即使您可以为模拟器(例如 ModelSim)编写 VHDL 代码,
可以编译并模拟 'event
的使用,如您的示例中所示,综合
工具通常无法将其映射到任何可用的目标硬件
元素,因为可能不存在诸如 'event
这样的硬件元素
探测器。
但是'事件
实际上表示信号值的变化,所以你也许可以
在 VHDL 中明确编写信号值变化检测器,如下所示:
change <= '1' if (vec_now /= vec_previous) else '0';
根据可用的低功耗硬件元件,您可以启动时钟
当在 change
上异步检测到“1”时,可能通过
ToggleSTDBY
,然后处理更改。进入之前的最后一件事
sleep 模式则捕获vec_previous
中当前的vec
值,因此
在 sleep 模式下可以检测到另一个变化。
进行我认为您正在做的低功耗设计的可能性 根据描述,完全取决于提供的功能 目标 FPGA/ASIC 技术。因此,在尝试正确使用 VHDL 语法之前, 您可能想要确定最终的硬件应该是什么样子,基于 可用的低功耗功能。
关于events - std_logic_vector 上的 VHDL 事件关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20098643/