vhdl - 奇怪的 VHDL 问题:rising_edge(CLK) 未触发
问题描述
我有一个大型仿真测试平台,它正在执行两个 Kintex Ultrascale FPGA 之间的接口。我遇到了最奇怪的问题:我无法触发rising_edge(CLK) 语句。
在设计中有多个这样的例子:我将追踪一条逻辑路径,最终发现一个没有触发的上升沿(随便)。
这是踢球者:用 CLK'EVENT 和 CLK='1' 替换rising_edge 会导致逻辑正确触发,但我无法通过一千个源文件全部替换它们,然后将其推送到团队回购 - 那' d 是荒谬的(加上代码是有效的,并且已被多次使用,因此进行这样的更改将浪费大量时间)。
上升沿也等效于 CLK'LAST='0' 和 CLK'EVENT 和 CLK='1' - 此语句也不会触发。所以肯定是不满足CLK'LAST='0'吧?(如果 CLK'EVENT 和 CLK='1' 触发,并且 CLK'LAST='0' 的添加没有触发,那么它一定是导致问题的最后一项)。
但是,我查看增量视图,我看不到 0 和 1 之间的中间值 - 没有中间的高阻态,没有未定义的信号,什么也没有。它看起来很完美。
我已经用几个不同的 Modelsim 版本对此进行了测试,结果相同(只是为了确保它不是工具回归)。
到底是什么导致了这种情况?
我能想到的唯一不标准的事情是我使用外部名称将时钟/数据驱动到层次结构的几层,但它们正在将预期值更新到波形窗口。
使用外部名称来强制值是否会以某种方式导致边缘丢失,即使信号看起来正确(甚至下降到增量?)还是会导致某种波形窗口差异?是什么导致 CLK'LAST 有效丢失?
谢谢大家!
解决方案
如果类型CLK
不是bit
,例如如果是std_ulogic
或std_logic
则不是,rising_edge(CLK)
则不等价于:
CLK'EVENT and CLK='1'
或者:
CLK'LAST='0' and CLK'EVENT and CLK='1'
rising_edge(CLK)
还涉及'L'
和'H'
;'0'
对于从or'L'
到'1'
or的任何转换,它都返回 true 'H'
。也就是说,任何一个:
'L' -> 'H'
'L' -> '1'
'0' -> 'H'
'0' -> '1'
WhileCLK'EVENT and CLK='1'
对以下任何一项评估为真:
'U' -> '1'
'X' -> '1'
'0' -> '1'
'Z' -> '1'
'W' -> '1'
'L' -> '1'
'H' -> '1'
'-' -> '1'
例如,从'H'
到的转换'1'
不是 的上升沿,rising_edge(CLK)
而是的上升沿CLK'EVENT and CLK='1'
。而且,相反,从'0'
到的转变'H'
是上升沿,rising_edge(CLK)
但不是CLK'EVENT and CLK='1'
。
此问题的另一个潜在原因不太可能:您正在使用该rising_edge
函数的自定义版本......
推荐阅读
- c# - 如何使用 ComboBox 过滤 ListView?
- php - 使用二级值对二维数组进行排序
- javascript - 样式化的组件样式不适用于不同的 react-router 路由
- javascript - 数据正确返回但不能正确显示返回的数据?
- javascript - 如何设置单独的谷歌地图标记图标
- reactjs - 如何通过单击菜单访问页面
- material-ui - 将 YUP 与 Material-UI 文本字段一起使用
- oracle-data-integrator - ODI 11g 逆向工程文件修改
- java - 我如何制作一个在文件关闭时删除文件的手表服务?
- javascript - 在 Node.js 中,如果 v8 运行您的 JavaScript,那么运行 Node.js Api 的是什么?