0

我想在某些参数的函数中声明一个计数器 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;

这在模拟中效果很好,icarusISE 14.7不想合成它。这给出了这个错误:

WARNING:HDLCompiler:1499 - "/src/button_deb.v" 第 4 行:空模块<button_deb>仍然是一个黑盒子。

如果我这样定义计数:

reg [22:0] count;

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

4

1 回答 1

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/mp/244440/highlight/true#M6609

(该模块只是一个假模块,我可以合成一些东西,而不必担心合成器会擦除我的所有代码。它不会执行任何类型的去抖动)

于 2015-03-14T13:57:13.567 回答