Verilog:尝试使用多个频率的时钟分频器串联闪烁LED

时间:2013-11-01 20:53:40

标签: verilog led flip-flop

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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