vhdl - 在 VHDL 中,如果信号不是时钟,我可以使用 signal'event 吗?
问题描述
我正在尝试清理我的 VHDL 代码。我有一个不是 clk 的信号。
我可以编写如下所示的事件更改监视器吗?如何编译它以便可以合成它?(见代码)我尝试了几种排列,但我无法编译它。如果信号不是 CLK,signal'event 会编译吗?如果是,它是如何完成的?我在网络和其他文献上看到它可以完成,但我看到的所有示例都显示 CLK'event。
signal cntr: unsigned(15 downto 0) := (others => '0');
...
process(CLK):
begin
IF rising_edge(CLK) THEN
if (cntr'event) then
do something;
end if;
or...
if(cntr(0)'event) then
do something;
end if;
END IF;
end process;
我得到以下信息和其他信息:无法合成包含孤立的“事件”预定义属性的条件
解决方案
rising_edge(CLK)
已经是一个事件,使您的设计同步,这很好。正如评论中所说,只有时钟信号应该使用它。
即使在那个时候看另一个在同步设计中也没有意义,因为这两个信号不会同时完全改变,从而产生竞争条件。或者实际上是时钟中的时钟,以及合成错误......
它可能在模拟中起作用,但不要依赖这个事实。
用 HDL 语言进行编程的常规方法是将信号的先前值保存在同一时钟上(例如cntr_d <= cntr
),并与先前的值进行比较。这允许查找信号是否上升(之前为 0,当前为 1)、下降、更改(不同)......
而且该方法非常适合合成!
推荐阅读
- laravel - 运行单元测试时如何更改请求标头“主机”?
- c# - 找到类别的参数并以正确的顺序组合它们
- python - 为什么在将图像转换为视频时总是排除最后一帧?
- python - 如何正确检测 LetsGoDigital 字体文本?
- airflow - 如何使用 Airflow 从 s3 存储桶下载最新文件到本地机器
- ios - “ImagePicker”类型的值没有成员“contentMode”
- reactjs - 为什么我的道具在发送到组件时未定义?
- c++ - 如何防止调用未初始化的 C++ 对象的非静态函数
- java - Java 枚举构造函数
- visual-studio - 无法升级超过 16.1.3 的 Visual Studio 社区版