2013-11-01 118 views
0

我試圖用兩個開關來選擇我想讓LED閃爍的頻率。我的Verilog代碼如下:Verilog:試圖在多個頻率下使用時鐘分頻器在系列中閃爍LED燈

`timescale 1ns/1ps 

module clk_divider(
    input clk, 
    input rst, 
    input [1:0] sw, 
    output led 
    ); 

reg n; 

[email protected](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

最簡單的方法是創建綁定到選擇器的多個「時鐘」。然後選擇器將確定哪個時鐘爲led供電。 – N8TRO

回答

0

對於wire [n-1:0] din;wire [n-1:0] clkdiv;,總線的寬度不能取決於輸入的值。

總線寬度是在合成時定義的,它是物理設備中存在的導線數量。根據模塊輸入或寄存器的狀態,導線不能出現或消失。

您需要將這些導線定義爲具有固定寬度而非動態寬度。也許在某些情況下不會使用所有電線,但是您仍然必須將總線定義爲您將需要的最大寬度。同樣在生成循環中,您不能更改基於n的值實例化的觸發器的數量。您必須實例化所需的許多觸發器,然後根據需要啓用/禁用某些觸發器。

此外,您稍後會單擊此單獨的問題,但您的寄存器n只是一個位,因此它不能存儲除0或1以外的任何數字。如果您打算保存更大的值,請將該寄存器放大。

+0

我對代碼進行了調整,主要是初始化了我可以用於常量的所有連線。 在啓用/禁用的說明中,我向我的dff添加了啓用/禁用輸入,但我不確定如何在循環中爲該輸入聲明'1'或'0'? – ElectricalEngineerInTraining