我试图通过传递参数(频率和所需的弹跳时间)来消除按钮/开关跳转,从而使我的反跳代码更加模块化。我就是这样处理它的:
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
如何解决这个问题,以便根据从这个模块上面的代码中传入的参数来确定计数器大小和最大计数值?我的大部分代码都有变量大小,这是由频率泛型决定的,所以不能使用像VHDL这样的方法已经证明在我的设计中产生了问题。
发布于 2018-02-26 20:41:19
似乎在Vivado 2016.3上工作得很好(是我现有的最老的)。我认为问题是2014.7太老了,无法支持这一点。您没有显示‘`include’的内容,但我假设它是来自AR# 44586的。如果是这样的话,它应该接受并返回整数,它将截断您的实际浮点值。浮点算法可以很好地应用于Verilog/SystemVerilog测试台和参数。
如何解决这个问题,以便根据从这个模块上面的代码中传入的参数来确定计数器大小和最大计数值?
注意:在您发布的代码中还有另一个相当严重的错误。当您想要获得包含一个常量表达式"x“所需的MSB时,模式应该是$clog2((x)+1)-1
。当浮点表达式"x“的结果介于2^n和(2^n + 0.5)之间时,您只添加了0.5而不是1。例如,对于频率为87381333的情况,您错误地将常量计算为17'h0而不是18'h4_0000,但它在50 the时仍然适用于您的示例。墨菲定律说,在最坏的时候,你会意外地掉进这个狭窄的坏范围,但永远不会在测试期间:)。
作为参考,这是我所测试的,其中`包括扩展内联:
`timescale 1ns / 1ps
module debounceCounter
#(
//parameter CLOCK_FREQUENCY_Hz = 50_000_000,
parameter CLOCK_FREQUENCY_Hz = 87381333, // whoops
parameter BOUNCE_TIME_s = 0.003
)
(
input wire sysClk, reset,
input wire i_async,
output reg o_sync
);
/* include tasks/functions */
//`include "clog2.v"
function integer clog2;
input integer value;
begin
value = value-1;
for (clog2=0; value>0; clog2=clog2+1)
value = value>>1;
end
endfunction
/* constants */
//parameter [(clog2(BOUNCE_TIME_s * CLOCK_FREQUENCY_Hz + 0.5) - 1) : 0] // <- BUG!!! 0.5 should 1
parameter [(clog2(BOUNCE_TIME_s * CLOCK_FREQUENCY_Hz + 1) - 1) : 0]
MAX_COUNT = BOUNCE_TIME_s * CLOCK_FREQUENCY_Hz;
initial
$display("MAX_COUNT %d", MAX_COUNT);
endmodule
发布于 2018-03-29 17:01:54
实型别不可合成。在转换/编写HDL之前绘制/创建您的设计,您就会意识到这一点。扪心自问,“一个真正的合成在大门里是什么?”
对于那些做“支持”Type Real的工具(例如Synplify),它只是一个供应商的解释,因此不可能“支持”,因为它没有被定义为任何HDL标准的一部分。含义:如果你有一个仿真器用一种方式解释Real,而你的合成器(可能)用另一种方式解释它,你会得到sim/syn的不匹配。根据您想要完成的任务,您可能会逃脱它们,但是,它仍然会被认为是糟糕的设计实践。
行为代码,用于测试台的建模和使用,如上面所述,是一个不同的故事,因为它不是合成的。
https://stackoverflow.com/questions/48798526
复制相似问题