0

我正在尝试使用两个开关来选择我想让 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 不是常数”。我怎样才能避免这个错误?对我来说,它似乎应该工作。任何帮助,将不胜感激!!!

4

1 回答 1

0

关于wire [n-1:0] din;wire [n-1:0] clkdiv;,总线的宽度不能取决于输入的值。

总线宽度是在综合时定义的,它是物理设备中存在的线数。电线不能根据模块输入或寄存器的状态出现或消失。

您需要将这些线定义为具有固定宽度,而不是动态宽度。在某些情况下,可能不会使用所有电线,但您仍必须将总线定义为您将需要的最大宽度。同样,在生成循环中,您不能根据 n 的值更改实例化的触发器数量。您必须实例化尽可能多的触发器,然后根据需要启用/禁用一些触发器。

此外,您稍后会遇到这个单独的问题,但您的寄存器n只有一位,因此它不能存储除 0 或 1 以外的任何数字。如果您打算保存更大的值,请使寄存器更大。

于 2013-11-02T01:06:20.830 回答