我试图通过传递频率和所需的反弹时间参数来消除按钮/开关反弹,从而使我的去抖代码更加模块化。这就是我接触它的方式:
module debounceCounter
#(
parameter CLOCK_FREQUENCY_Hz = 50_000_000,
parameter BOUNCE_TIME_s = 0.003
)
(
input wire sysClk, reset,
input wire i_async,
output reg o_sync
);
/* include tasks/functions */
`include "clog2.v"
/* constants */
parameter [(clog2(BOUNCE_TIME_s * CLOCK_FREQUENCY_Hz + 0.5) - 1) : 0]
MAX_COUNT = BOUNCE_TIME_s * CLOCK_FREQUENCY_Hz;
使用Xilinx ISE 14.7进行综合引发此错误:
Xst:850 - "../../rtl/verilog/debounceCounter.v" line0: Unsupported real
constant
如何解决这个问题,以便根据从heirarchy中此模块上方的代码传入的参数来确定计数器大小和最大计数值?我的大多数代码都有变量大小,并且由频率泛型决定,因此无法使用像VHDL这样的方法已经证明在我的设计中会产生问题。
答案 0 :(得分:0)
类型Real不可合成。在翻译/编写HDL之前绘制/创建您的设计,您将意识到这一点。问问自己,"真正在门中合成的是什么?"
对于那些支持"支持"的工具(例如Synplify)。输入Real,它只是供应商的解释,因此不可能支持"因为它没有被定义为任何HDL标准的一部分。暗示:如果你有一个模拟器可以单向解释Type Real,而你的合成器(可能)用另一种方式解释它,你将得到sim / syn不匹配。根据你想要完成的任务,你可能会逃脱它们,但是,它仍然被认为是糟糕的设计实践。
行为代码,用于在测试平台中进行建模和使用,如上所述,它是一个不同的故事,因为它没有被合成。