我正在尝试使用两个开关来选择我想要闪烁LED指示灯的频率。我的verilog代码如下:
`timescale 1ns / 1ps
module clk_divider(
input clk,
input rst,
input [1:0] sw,
output led
);
reg n;
always@(sw[0],sw[1])
n = (27 - sw);
wire [n-1:0] din;
wire [n-1:0] clkdiv;
dff dff_inst0 (
.clk(clk),
.rst(rst),
.D(din[0]),
.Q(clkdiv[0])
);
genvar i;
generate
for (i = 1; i < n; i=i+1)
begin : dff_gen_label
dff dff_inst (
.clk(clkdiv[i-1]),
.rst(rst),
.D(din[i]),
.Q(clkdiv[i])
);
end
endgenerate;
assign din = ~clkdiv;
assign led = clkdiv[n-1];
endmodule
当我检查语法时,它说“n不是常数”。我怎样才能避免这个错误?对我而言,似乎应该有效。任何帮助将不胜感激!!!
答案 0 :(得分:0)
对于wire [n-1:0] din;
和wire [n-1:0] clkdiv;
,您不能让总线的宽度取决于输入的值。
总线宽度在合成时定义,它是物理设备中存在的导线数。根据模块输入或寄存器的状态,导线不会出现或消失。
您需要将这些导线定义为具有固定宽度,而不是动态宽度。也许在某些情况下不会使用所有电线,但您仍必须将总线定义为您将需要的最大宽度。类似地,在生成循环中,您无法根据n的值更改实例化的触发器的数量。您必须实例化所需数量的触发器,然后根据需要启用/禁用一些触发器。
此外,您稍后会遇到这个单独的问题,但您的寄存器n
只是一个位,因此它不能存储0或1以外的任何数字。如果您想要保持更大的值,请使寄存器更大。