2016-09-20 283 views
0

我正在使用verilog的秒錶和反應計時器。我有我的秒錶工作,但我有反應計時器的一部分的麻煩。我們的目標是打一個按鈕,然後一段隨機的時間後,一個LED燈亮起並啓動計時器,並且您可以自己計時多久才能在LED導通後停止計時器。總之,當我點擊反應計時器啓動按鈕時(當Cen == 2'b10時),計時器開始計數。我想知道如何在按鈕按下和計時器啓動之間添加延遲。你現在可以看到當Cen == 2'b10時,我有一個延遲使用寄存器「count」的嘗試,但它似乎不起作用。我現在只想做一個固定的延遲,然後我會稍後實現隨機數發生器,但是使用我的「count」方法的延遲不起作用。有任何想法嗎?讓我知道你是否需要任何澄清。謝謝!在Verilog中添加延遲

module Counter4dig(
    input [1:0] Cen, 
    //input incIn, 
    input clk, rst, inc, 
    output reg[3:0] Dig0, 
    output reg[3:0] Dig1, 
    output reg[3:0] Dig2, 
    output reg[3:0] Dig3 
); 

reg ReactionCounter; 
reg RandomValue; 
reg [30:0] count = 1'b0; 

always @ (posedge(clk), posedge(rst)) 
begin 

if (rst == 1'b1)begin 
     Dig0 <= 4'b0000; 
     Dig1 <= 4'b0000; 
     Dig2 <= 4'b0000; 
     Dig3 <= 4'b0000; 
    end 

//increment if inc 
else if(inc == 1'b1) 
begin 
    Dig0 <= Dig0 + 1'b1; 

    if(Dig0 == 4'b1001) 
    begin 
     Dig0 <= 4'b0000; 

     //add 1 to second digit (when first resets) up till 9 
     Dig1 <= Dig1 + 1'b1; 
    end 
    //reset if == 10 
    if(Dig1 == 4'b1001 && Dig0 == 4'b1001) 
    begin 
     Dig1 <= 4'b0000; 

     //add 1 to third digit (when second reset) up till 9 
     Dig2 <= Dig2 + 1'b1; 
    end 
    //reset if == 10 
    if(Dig2 == 4'b1001 && Dig1 == 4'b1001 && Dig0 == 4'b1001) 
    begin 
     Dig2 <= 4'b0000; 

     //add 1 to fourth digit (when third reset) up till 9 
     Dig3 <= Dig3 + 1'b1; 
    end 

    //reset if == 10 
    if(Dig3 > 4'b1001) 
    begin 
     Dig3 <= 4'b0000; 
    end    

end 

else if (Cen == 2'b10) 
begin 
    if (count != 50000) 
    count <= count + 1; 

    else 
    begin 
    Dig0 <= Dig0 + 1'b1; 

     if(Dig0 == 4'b1001) 
     begin 
      Dig0 <= 4'b0000; 

      //add 1 to second digit (when first resets) up till 9 
      Dig1 <= Dig1 + 1'b1; 
     end 
     //reset if == 10 
     if(Dig1 == 4'b1001 && Dig0 == 4'b1001) 
     begin 
      Dig1 <= 4'b0000; 

      //add 1 to third digit (when second reset) up till 9 
      Dig2 <= Dig2 + 1'b1; 
     end 
     //reset if == 10 
     if(Dig2 == 4'b1001 && Dig1 == 4'b1001 && Dig0 == 4'b1001) 
     begin 
      Dig2 <= 4'b0000; 

      //add 1 to fourth digit (when third reset) up till 9 
      Dig3 <= Dig3 + 1'b1; 
     end 

     //reset if == 10 
     if(Dig3 > 4'b1001) 
     begin 
      Dig3 <= 4'b0000; 
     end  
end 
end 

//only continue if Cen is 01 & not inc 
else if(Cen == 2'b01) 
begin 

    //add 1 to first digit up till 9 
    Dig0 <= Dig0 + 1'b1; 

    //reset if == 10  
     if(Dig0 == 4'b1001) 
     begin 
      Dig0 <= 4'b0000; 

      //add 1 to second digit (when first resets) up till 9 
      Dig1 <= Dig1 + 1'b1; 
     end 
      //reset if == 10 
      if(Dig1 == 4'b1010) 
      begin 
       Dig1 <= 4'b0000; 

       //add 1 to third digit (when second reset) up till 9 
       Dig2 <= Dig2 + 1'b1; 
      end 
       //reset if == 10 
       if(Dig2 == 4'b1010) 
       begin 
        Dig2 <= 4'b0000; 

        //add 1 to fourth digit (when third reset) up till 9 
        Dig3 <= Dig3 + 1'b1; 
       end 

        //reset if == 10 
       if(Dig3 > 4'b1001) 
       begin 
        Dig3 <= 4'b0000; 
       end   
    end 
//end 

endmodule

+0

看起來你已經寫了verilog代碼,就好像你正在編寫一個C代碼一樣。從硬件角度考慮,並針對不同的信號分配使用不同的始終模塊(如Dig1等)。通過這種方式,你的代碼對我和其他人來說都會更加清晰 –

回答

0

您分配REG [30:0] =計數1'b0;首先,你只分配一位,而不是31位。使用31'b0。接下來,您正在使用阻塞賦值語句在always語句外分配計數,然後在語句內使用非阻塞賦值。我不確定這是否可以合成。

如果按下按鈕後需要計數器重置爲零,然後開始計數,是否公平?假設在按鈕被按下時它會繼續計數,你可以試試這個。

reg[1:0] Cen_d; // Used to capture the Cen for use in a making a pulse 
reg  Cen_pulse; 
generator 

always @ (posedge clk) 
begin 
    Cen_d <= Cen; // capture the old Cen value 
    Cen_pulse <= Cen == 2'b10 & (Cen != Cen_d); // Look for Cen == 2'b01 and 
               // the old Cen (in Cen_d) is 
               // is not current Cen. If so 
               // pulse once. 
end 

always @ (posedge clk or posedge reset) 
begin 
    if (reset) 
     count <= 31'h0000_0000; 
    else 
     begin 
     count = Cen_pulse  ? 31'h0000_0000 : // Return to zero on pulse 
       count >= 50000 ? 31'd500000 : // Stop counting at 50000 
       count = count + 1;    // Otherwise increment 
     end 
end