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