工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Verilog

4ビットカウンター

4 ビット カウンターは 4'b0000 から 4'h1111 までインクリメントを開始し、4'b0000 にロールオーバーします。実行中のクロックが提供され、リセットがハイに保持されている限り、カウントを続けます。

ロールオーバーは、最終加算の最上位ビットが破棄されるときに発生します。カウンターが最大値の 4'b1111 にあり、もう 1 つのカウント要求を受け取ると、カウンターは 5'b10000 に到達しようとしますが、サポートできるのは 4 ビットのみであるため、MSB は破棄されて 0 になります。

	0000
	0001
	0010
	...
	1110
	1111
	       rolls over
	0000
	0001
	...

このデザインには、クロック用とアクティブ LOW リセット用の 2 つの入力が含まれています。アクティブ LOW リセットは、リセット ピンの値が 0 のときに設計がリセットされるリセットです。本質的にカウンター値を提供する 4 ビット出力が呼び出されます。

電子カウンターの設計

  
  
module counter (  input clk,               // Declare input port for clock to allow counter to count up
                  input rstn,              // Declare input port for reset to allow the counter to be reset to 0 when required
                  output reg[3:0] out);    // Declare 4-bit output port to get the counter values

  // This always block will be triggered at the rising edge of clk (0->1)
  // Once inside this block, it checks if the reset is 0, if yes then change out to zero
  // If reset is 1, then design should be allowed to count up, so increment counter
  always @ (posedge clk) begin
    if (! rstn)
      out <= 0;
    else 
      out <= out + 1;
  end
endmodule

  

module カウンタにはクロックとアクティブ LOW リセットがあります (n で示されます) ) を入力として、カウンタ値を 4 ビット出力として出力します。 always ブロックは常に クロックが 0 から 1 に遷移するたびに実行されます。これは、立ち上がりエッジまたは立ち上がりエッジを意味します。 if-else によって達成される、リセットがハイまたは 1 に保持されている場合にのみ、出力がインクリメントされます。 ブロック。クロックの正のエッジでリセットがローであることが判明した場合、出力はデフォルト値の 4'b0000 にリセットされます。

テストベンチ

設計をテストベンチ モジュールにインスタンス化して、カウンターが期待どおりにカウントされていることを確認できます。

テストベンチ モジュールの名前は tb_counter です これはシミュレーションの最上位モジュールであるため、ポートは必要ありません。ただし、クロックとリセットを生成、保存、駆動するための内部変数が必要です。そのために、reg 型の 2 つの変数を宣言しました。 クロックとリセット用。 wire も必要です デザインの出力と接続するには net と入力します。それ以外の場合は、デフォルトで 1 ビットのスカラー ネットになります。

クロックは always 経由で生成されます 10時間単位の期間を与えるブロック。 initial ブロックは、初期値を内部変数に設定し、リセット値を設計に駆動するために使用されます。デザインはインスタンス化されています テストベンチで内部変数に接続されているため、テストベンチからそれらを駆動するときに値が取得されます。 $display はありません

  
  
module tb_counter;
  reg clk;                     // Declare an internal TB variable called clk to drive clock to the design
  reg rstn;                    // Declare an internal TB variable called rstn to drive active low reset to design
  wire [3:0] out;              // Declare a wire to connect to design output

  // Instantiate counter design and connect with Testbench variables
  counter   c0 ( .clk (clk),
                 .rstn (rstn),
                 .out (out));

  // Generate a clock that should be driven to design
  // This clock will flip its value every 5ns -> time period = 10ns -> freq = 100 MHz
  always #5 clk = ~clk;

  // This initial block forms the stimulus of the testbench
  initial begin
    // 1. Initialize testbench variables to 0 at start of simulation
    clk <= 0;
    rstn <= 0;
    
    // 2. Drive rest of the stimulus, reset is asserted in between
    #20   rstn <= 1;                   
    #80   rstn <= 0;
    #50   rstn <= 1;
    
    // 3. Finish the stimulus after 200ns
    #20 $finish;
  end
endmodule

  
シミュレーションログ
ncsim> run
[0ns] clk=0 rstn=0 out=0xx
[5ns] clk=1 rstn=0 out=0x0
[10ns] clk=0 rstn=0 out=0x0
[15ns] clk=1 rstn=0 out=0x0
[20ns] clk=0 rstn=1 out=0x0
[25ns] clk=1 rstn=1 out=0x1
[30ns] clk=0 rstn=1 out=0x1
[35ns] clk=1 rstn=1 out=0x2
[40ns] clk=0 rstn=1 out=0x2
[45ns] clk=1 rstn=1 out=0x3
[50ns] clk=0 rstn=1 out=0x3
[55ns] clk=1 rstn=1 out=0x4
[60ns] clk=0 rstn=1 out=0x4
[65ns] clk=1 rstn=1 out=0x5
[70ns] clk=0 rstn=1 out=0x5
[75ns] clk=1 rstn=1 out=0x6
[80ns] clk=0 rstn=1 out=0x6
[85ns] clk=1 rstn=1 out=0x7
[90ns] clk=0 rstn=1 out=0x7
[95ns] clk=1 rstn=1 out=0x8
[100ns] clk=0 rstn=0 out=0x8
[105ns] clk=1 rstn=0 out=0x0
[110ns] clk=0 rstn=0 out=0x0
[115ns] clk=1 rstn=0 out=0x0
[120ns] clk=0 rstn=0 out=0x0
[125ns] clk=1 rstn=0 out=0x0
[130ns] clk=0 rstn=0 out=0x0
[135ns] clk=1 rstn=0 out=0x0
[140ns] clk=0 rstn=0 out=0x0
[145ns] clk=1 rstn=0 out=0x0
[150ns] clk=0 rstn=1 out=0x0
[155ns] clk=1 rstn=1 out=0x1
[160ns] clk=0 rstn=1 out=0x1
[165ns] clk=1 rstn=1 out=0x2
Simulation complete via $finish(1) at time 170 NS + 0	

アクティブ LOW リセットが 0 になると、カウンタは 0 にリセットされ、約 150ns でリセットがディアサートされると、カウンタはクロックのポジティブ エッジの次の発生からカウントを開始することに注意してください。

ハードウェア回路図


Verilog

  1. 再充電、リセット、再構成
  2. 3ビットバイナリカウンタ
  3. 同期カウンター
  4. カウンターモジュラス
  5. リングカウンター
  6. デジタルランプADC
  7. IT / OTコンバージェンス:文化的リセットの機会
  8. 例を使用したコレクション内の Python カウンター
  9. Verilog Mod-N カウンター
  10. Verilog グレー カウンター
  11. PIDエラー:ワインドアップをリセット