首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用实参数确定计数器大小

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

Stack Overflow用户
提问于 2018-02-15 00:41:03
回答 2查看 2.3K关注 0票数 0

我试图通过传递参数(频率和所需的弹跳时间)来消除按钮/开关跳转,从而使我的反跳代码更加模块化。我就是这样处理它的:

代码语言:javascript
运行
复制
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进行的综合会引发以下错误:

代码语言:javascript
运行
复制
Xst:850 - "../../rtl/verilog/debounceCounter.v" line0: Unsupported real 
    constant

如何解决这个问题,以便根据从这个模块上面的代码中传入的参数来确定计数器大小和最大计数值?我的大部分代码都有变量大小,这是由频率泛型决定的,所以不能使用像VHDL这样的方法已经证明在我的设计中产生了问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-26 20:41:19

似乎在Vivado 2016.3上工作得很好(是我现有的最老的)。我认为问题是2014.7太老了,无法支持这一点。您没有显示‘`include’的内容,但我假设它是来自AR# 44586的。如果是这样的话,它应该接受并返回整数,它将截断您的实际浮点值。浮点算法可以很好地应用于Verilog/SystemVerilog测试台和参数。

如何解决这个问题,以便根据从这个模块上面的代码中传入的参数来确定计数器大小和最大计数值?

  • 更新到最近的版本。2017.1或2017.3对我有好处。我在2016.3上测试了下面的内容,结果也很好。
  • 尝试使用SystemVerilog (.sv),它本机支持$clog2()系统函数,而不使用“`include”。不确定.sv何时开始工作,但可能需要2015+。
  • 验证clog2.v标头中的clog2版本是否与以下内容匹配

注意:在您发布的代码中还有另一个相当严重的错误。当您想要获得包含一个常量表达式"x“所需的MSB时,模式应该是$clog2((x)+1)-1。当浮点表达式"x“的结果介于2^n和(2^n + 0.5)之间时,您只添加了0.5而不是1。例如,对于频率为87381333的情况,您错误地将常量计算为17'h0而不是18'h4_0000,但它在50 the时仍然适用于您的示例。墨菲定律说,在最坏的时候,你会意外地掉进这个狭窄的坏范围,但永远不会在测试期间:)。

作为参考,这是我所测试的,其中`包括扩展内联:

代码语言:javascript
运行
复制
`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
票数 0
EN

Stack Overflow用户

发布于 2018-03-29 17:01:54

实型别不可合成。在转换/编写HDL之前绘制/创建您的设计,您就会意识到这一点。扪心自问,“一个真正的合成在大门里是什么?”

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

行为代码,用于测试台的建模和使用,如上面所述,是一个不同的故事,因为它不是合成的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48798526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档