如何实现信号被赋值(即使值与旧值相同)时触发进程?
解决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
相关产品推荐
相关产品推荐

