【问题标题】:Verilog: trying to blink leds in series using a clock divider at multiple frequenciesVerilog:尝试使用多个频率的时钟分频器使 LED 串联闪烁
【发布时间】:2013-11-01 20:53:39
【问题描述】:

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

【问题讨论】:

  • 最简单的方法是创建多个绑定到选择器的“时钟”。然后选择器将确定哪个时钟为 LED 供电。

标签: verilog led flip-flop


【解决方案1】:

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

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

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

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

【讨论】:

  • 我对代码进行了调整,主要是我将所有可以使用的连线初始化为一个常数。在启用/禁用的注释上,我向我的 dff 添加了启用/禁用输入,但我不确定如何在循环中为该输入断言“1”或“0”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多