我想在一些参数的功能中声明一个计数器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
很好地合成了它。如果有人有线索?
答案 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
(该模块只是一个虚假的模块,可以让我能够在不担心合成器会擦除我所有代码的情况下进行合成。它不会执行任何类型的去抖动)