如何在 ise 综合的 verilog 中限制计数器寄存器的大小?
How to constrain a counter reg size in verilog for ise synthesis?
我想在某些参数的函数中声明一个计数器 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
不想合成它。出现此错误:
WARNING:HDLCompiler:1499 - "/src/button_deb.v" Line 4: Empty module <button_deb>
remains a black box.
如果我这样定义计数:
reg [22:0] count;
ISE
合成的不错。如果有人有线索?
这对我有用,尽管我发誓我过去使用 $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
因此我们可以在寄存器定义上限表达式中使用它。鸣谢此 post 的所有者:http://forums.xilinx.com/t5/Synthesis/XST-and-clog2/m-p/244440/highlight/true#M6609
(该模块只是一个假模块,我可以合成一些东西而不用担心合成器会擦除我的所有代码。它不执行任何类型的去抖动)
我想在某些参数的函数中声明一个计数器 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
不想合成它。出现此错误:
WARNING:HDLCompiler:1499 - "/src/button_deb.v" Line 4: Empty module
<button_deb>
remains a black box.
如果我这样定义计数:
reg [22:0] count;
ISE
合成的不错。如果有人有线索?
这对我有用,尽管我发誓我过去使用 $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
因此我们可以在寄存器定义上限表达式中使用它。鸣谢此 post 的所有者:http://forums.xilinx.com/t5/Synthesis/XST-and-clog2/m-p/244440/highlight/true#M6609
(该模块只是一个假模块,我可以合成一些东西而不用担心合成器会擦除我的所有代码。它不执行任何类型的去抖动)