2016-09-20 14 views
0

私はVerilogでストップウォッチと反応タイマーに取り組んでいます。私はストップウォッチを作動させていますが、反応タイマーの一部に問題があります。目標は、ボタンを押すことです。その後、LEDがオンになり、タイマーが開始され、LEDがオンになってからタイマーを停止するまでに時間がかかります。とにかく、反応タイマースタートボタン(Cen == 2'b10)を押すと、タイマーがカウントを開始します。ボタンを押してからタイマーを始めるまでの間にどのように遅延を追加することができるのだろうかと思います。 Cen == 2'b10のときに、 "count"というレジスタを使った遅延がありますが、動作していないようです。私はちょうど固定遅延をやろうとしていますが、後でランダマイザを実装しますが、 "count"メソッドを使用する遅延は機能しません。何か案は?明確化が必要な場合はお知らせください。ありがとう!あなたがREGを割り当てる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

あなたがCコードを書いているかのように、Verilogコードを書いているようです。ハードウェアの将来性を考え、さまざまな信号割り当て(Dig1など)で異なるブロックを使用します。そのようにすれば、あなたのコードは私にとっても他の人にとってもより明確になります –

答えて

0

[30:0] = 1'b0このカウント。まず、31ビットの代わりに1ビットしか割り当てません。 31'b0を使用します。次に、alwaysステートメントの外側のcountにブロッキング割り当てを割り当て、ステートメントの内側に非ブロッキング割り当てを割り当てます。私はこれが合成可能であるとは思わない。

ボタンが押されたときにカウンタをゼロにリセットしてカウントを開始する必要がありますか?ボタンが押されている間にカウントを続けると仮定すると、これを試すことができます。

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 
関連する問題