使用真实参数确定计数器大小

时间:2018-02-15 00:41:03

标签: verilog xilinx

我试图通过传递频率和所需的反弹时间参数来消除按钮/开关反弹,从而使我的去抖代码更加模块化。这就是我接触它的方式:

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这样的方法已经证明在我的设计中会产生问题。

1 个答案:

答案 0 :(得分:0)

类型Real不可合成。在翻译/编写HDL之前绘制/创建您的设计,您将意识到这一点。问问自己,"真正在门中合成的是什么?"

对于那些支持"支持"的工具(例如Synplify)。输入Real,它只是供应商的解释,因此不可能支持"因为它没有被定义为任何HDL标准的一部分。暗示:如果你有一个模拟器可以单向解释Type Real,而你的合成器(可能)用另一种方式解释它,你将得到sim / syn不匹配。根据你想要完成的任务,你可能会逃脱它们,但是,它仍然被认为是糟糕的设计实践。

行为代码,用于在测试平台中进行建模和使用,如上所述,它是一个不同的故事,因为它没有被合成。