如何在verilog中约束计数器reg大小以进行ise合成?

时间:2015-03-14 12:33:09

标签: verilog xilinx-ise

我想在一些参数的功能中声明一个计数器reg。我是这样做的:

parameter clk_freq = 95000; // clock frequency in kHz
parameter debounce_per_ms = 20;
localparam MAX_COUNT = ((debounce_per_ms * clk_freq)) + 1;
reg [$ln(MAX_COUNT)/$ln(2):0] count;

这在使用icarus进行模拟时效果很好,但ISE 14.7不想合成它。这给出了这个错误:

  

警告:HDLCompiler:1499 - “/src/button_deb.v”第4行:空模块<button_deb>仍为黑盒子。

如果我像这样定义计数:

reg [22:0] count;

ISE很好地合成了它。如果有人有线索?

1 个答案:

答案 0 :(得分:1)

这对我有用,虽然我发誓我过去使用过$ log,$ log10,$ ceil之类的功能而没有任何问题。

module param_with_log2 (
    input wire clk,
    output wire d
    );

    function integer log2;
        input integer value;
        begin
            value = value-1;
            for (log2=0; value>0; log2=log2+1)
                value = value>>1;
        end
    endfunction

    parameter clk_freq = 95000; // clock frequency in kHz
    parameter debounce_per_ms = 20;
    localparam MAX_COUNT = ((debounce_per_ms * clk_freq)) + 1;
    localparam integer UPPER = log2(MAX_COUNT);

    reg [UPPER:0] count;
    always @(posedge clk)
        count <= count + 1;
    assign d = count[UPPER];
endmodule

XST似乎在使用常量函数时遇到问题:它们只能位于参数声明表达式的右侧(正如我在第一条评论中所建议的那样)。积分和更多信息: http://www.beyond-circuits.com/wordpress/2008/11/constant-functions/

另请注意,UPPER声明为localparam integer,因此我们可以在寄存器定义上限表达式中使用它。积分将发送给此帖子的所有者:http://forums.xilinx.com/t5/Synthesis/XST-and-clog2/m-p/244440/highlight/true#M6609

(该模块只是一个虚假的模块,可以让我能够在不担心合成器会擦除我所有代码的情况下进行合成。它不会执行任何类型的去抖动)