アフィリエイト広告
アフィリエイト広告

VerilogHDL 4ビット加算器のシミュレーション

2つ目の例題です。

【問題2】 4ビット加算器をVerilog HDLで記述しよう
今回は、Verilog HDLの記述スタイルについて解説。回路は“モジュール”の枠に収めて定義し、信号は“ポート”として定義する。

4 ビット加算器をシミュレーションする

図 1 4ビット加算器

図 1 に示す、4 ビット加算器のシミュレーションをしましょう。

論理回路のおさらいに、加算器はまだ登場してませんけど、むずかしいもんじゃないです。4 ビット加算器なら、4 ビットのデータ A と B を足し算するだけ。桁上がりすると carry (1 ビット) が出力される。
あー、でも、ロジック IC で 4 ビット加算器をつくるのは、それなりに大変、か (;´Д`)

回路記述

回路をつくります。

  1. module adder_4bit(A, B, X, carry);
  2.   input [3:0] A, B;
  3.   output [3:0] X;
  4.   output carry;
  5.   wire [3:0] A, B, X;
  6.   wire carry;
  7.   assign {carry, X} = A + B;
  8. endmodule

基本的には、組み合わせ回路とおなじです。
A、B、X は、それぞれ 4 ビットなので、[MSB:LSB] ってふうにして 4 ビットの信号を表します。
9 行目が、加算器をつくる記述。{carry, X} は、信号を連結する記述、だそうです。

テストベンチ

テストベンチファイルです。

  1. module adder_4bit_test;
  2.   integer i;
  3.   reg [3:0] A, B;
  4.   wire [3:0] X;
  5.   wire carry;
  6.   adder_4bit adder0(A, B, X, carry);
  7.   initial begin
  8.     A = 4'b0; B = 4'b0;
  9.     for(i = 0; i < 16; i=i+1)begin
  10.       #10 A = i; B = i % 4;
  11.     end
  12.     #10 $finish;
  13.   end
  14.   initial begin
  15.     $monitor("%d + %d = %d", A, B, X);
  16.     $dumpfile("adder_4bit_test.vcd");
  17.     $dumpvars(0, adder_4bit_test);
  18.   end
  19. endmodule

3 行目。for() 文のループ変数の宣言。C 言語みたいに for() 文のなかでは、できない、みたい。
12 行目。定数は「4’b0」のように記述する。「4 桁の 2 進数 (b) の 0」って意味です。
13 行目。for() 文。i++ も使えない、みたい。処理内容は begin と end でくくられる。C 言語だと {} だね。
14 行目。10 ユニット時間ごとに実行する内容。A は 0~15 を、B は 0~3 を繰返し、これを入力としてみました。お好みで。入力をどうするか、ってのは、シミュレーションのためのポイントかな。

シミュレーション結果

図 2 4ビット加算器のシミュレーション波形

図 2 が、シミュレーション波形です。

おかしなところもあるだろうけど、とりあえずこれで動いた (^_^;)
ちゃんと足し算できてます。

タイトルとURLをコピーしました