You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现信号被赋值(即使值与旧值相同)时触发进程?

解决VHDL中信号赋值(值未变化时)触发进程的问题

这确实是VHDL开发里一个挺常见的需求——默认情况下,只有当信号的实际值发生变化时,才会触发依赖该信号的进程或者wait on语句。但如果我们需要捕捉每一次赋值动作(哪怕值和之前完全一样),可以用下面两种实用方法:

方法1:利用信号的'transaction属性

VHDL从93标准开始,给每个信号都内置了一个'transaction属性。这是一个隐式的bit类型信号,每当原信号被赋值(不管新旧值是否相同),它都会自动翻转状态(0变1,1变0)。我们只需要把进程的等待目标改成这个属性就行。

举个例子,原来的进程是这样的:

process
begin
    wait on my_signal;
    -- 这里只有my_signal值变化时才会执行
end process;

修改后:

process
begin
    wait on my_signal'transaction;
    -- 现在每次my_signal被赋值,不管值变不变,都会触发这里的逻辑
end process;

注意:要确认你的综合/仿真工具支持VHDL-93及以上标准,现在主流工具(比如Modelsim、Vivado)都没问题,但一些非常老旧的工具可能不支持这个属性。

方法2:手动添加辅助触发信号

如果你的项目需要兼容老版本工具,或者不想依赖语言属性,可以手动创建一个辅助触发信号,每次给目标信号赋值时,同步翻转这个触发信号。

示例代码:

-- 定义目标信号和辅助触发信号
signal my_signal : std_logic := '1';
signal assign_trigger : bit := '0';

-- 赋值操作的地方,每次给my_signal赋值时同步更新触发信号
my_signal <= '1'; -- 哪怕值和之前一样
assign_trigger <= not assign_trigger; -- 翻转触发信号

-- 进程部分,监听触发信号
process
begin
    wait on assign_trigger;
    -- 每次my_signal被赋值,这里都会执行
end process;

这个方法的优势是兼容性拉满,缺点是需要修改所有给目标信号赋值的代码,确保触发信号同步更新,适合赋值点不多的场景。


内容的提问来源于stack exchange,提问作者free_horse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:47:34