在VHDL中嵌套if(rising_edge(clk))语句

时间:2011-06-16 16:51:06

标签: clock vhdl fpga xilinx

所以我遇到了一些我必须复制的旧代码,但它不能用新的Xilinx编译器编译,所以我需要弄清楚它的作用。我有这样的事情:

if rising_edge(clk) then
   —do some things
   if rising_edge(clk) then
      —do some other things
   end if
end if

到达内部if语句需要2个时钟周期,还是第二个if语句只是冗余?

此外,赛灵思还提出错误:“信号逻辑由时钟控制,但似乎不是有效的顺序描述”

谢谢,任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:6)

鉴于第一个rising_edge(clk)的{​​{1}}为true,肯定在第二个嵌套if时仍然如此。假设在if部分内没有时间过去,这可能就是这种情况。

因此,第二个if可以被-- do some stuff替换......或者确实被遗漏了!

答案 1 :(得分:1)

在我见过的任何工具中,这都不会合成。即使是模拟,也不要这样做。

第二个语句rising_edge不是顺序语句,例如作业。这是一个涉及时间的陈述,所以你可以肯定。

答案 2 :(得分:1)

如果它在合成器故障/错误之前合成。你有多确定代码是否符合测试和确定的工作? (听起来你只有一个人的话,因为这是以前合成的正确代码。)

现有系统是否可用于比较和测试?涉及的工具版本是什么?您可以使用旧工具并验证它是否合成以及它提供了哪些警告?根据您使用的版本,您可以使用综合报告fpgaeditor(或类似)来查看实际合成的内容。
或者,您可以分析代码以查看设计人员的意图,并使用有效的HDL复制该代码。

没有你所剩下的就是反复试验。 试着假设:

  1. 嵌套上升沿内的语句始终处于活动状态。 (删除嵌套的上升沿if语句,将其包围的代码块包围起来。)
  2. 嵌套上升沿内的语句永远不会处于活动状态。删除整个嵌套的上升沿块。
  3. 你可以试试但我真的无法想象合成器会如何产生2周期延迟。你可能会被迫减少尝试这种或其他更不可能的情况。很难预测这种失败模式会是什么。

答案 3 :(得分:0)

实际上你要推断的是嵌套的时钟进程。

这不应该合成,因为它不代表有意义的硬件。

您应该根据xst.pdf重写代码(例如,如果您使用Xilinx ISE)。

亲切的问候, Nikolaos Kavvadias