読み込み中...

一から学ぶVerilog!4ビット加算器の作り方5ステップ

初心者が一から学ぶVerilogによる4ビット加算器の作り方 Verilog
この記事は約8分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラム(回路記述)の基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Verilogを使って4ビット加算器を作成する方法を学びましょう。

この記事では初心者でもVerilogの理解を深め、自身で4ビット加算器を作成できるようになる5つのステップを紹介します。

●Verilogとは?

Verilogは、デジタル回路設計やハードウェア記述に使用される言語の一つです。

C言語に似た構文を持ち、電子回路の設計や検証に広く利用されています。

○Verilogの特徴

Verilogには次のような特徴があります。

  1. ハードウェア記述言語:電子機器や集積回路の設計に用いられます。
  2. 並列処理の記述が可能:ハードウェアの性質を直接的にモデル化できます。
  3. シミュレーションと合成:記述した回路の動作を確認したり、物理的な回路を作成することができます。

●4ビット加算器とは?

4ビット加算器は、4ビットの二進数を加算するためのデジタル回路です。

4つの入力ビットに対して、加算結果と桁上げを出力します。

○4ビット加算器の動作原理

基本的な4ビット加算器は1ビット全加算器を4つ組み合わせて作られます。

全加算器は2つの入力ビットと前の桁からの桁上がりを受け取り、加算結果と次の桁への桁上がりを出力します。

この全加算器を4つ繋げることで、4ビットの二進数の加算を実現します。

●Verilogでの4ビット加算器の設計手順

ここからはVerilogを使用して4ビット加算器を設計する手順を紹介します。

○サンプルコード1:1ビット全加算器の作成

まず、基礎となる1ビット全加算器を作成します。

module full_adder(input a, input b, input cin, output sum, output cout);
  assign {cout, sum} = a + b + cin;
endmodule

このコードでは、Verilogのassign文を使ってabcinの3つの入力信号の和を計算しています。

この和は2ビットになるため、cout(桁上がり)とsum(加算結果)にそれぞれ割り当てられます。

○サンプルコード2:4ビット加算器の作成

次に、1ビット全加算器を4つ連結して4ビット加算器を作成します。

module adder4(input [3:0] a, input [3:0] b, output [3:0] sum, output cout);
  wire [3:0] c;
  full_adder FA0 (.a(a[0]), .b(b[0]), .cin(1'b0), .sum(sum[0]), .cout(c[0]));
  full_adder FA1 (.a(a[1]), .b(b[1]), .cin(c[0]), .sum(sum[1]), .cout(c[1]));
  full_adder FA2 (.a(a[2]), .b(b[2]), .cin(c[1]), .sum(sum[2]), .cout(c[2]));
  full_adder FA3 (.a(a[3]), .b(b[3]), .cin(c[2]), .sum(sum[3]), .cout(cout));
endmodule

このコードでは、4つの全加算器(FA0からFA3)を順番に連結しています。

それぞれの全加算器は前の全加算器から桁上がりを受け取り、加算結果と次の全加算器への桁上がりを出力します。

○サンプルコード3:4ビット加算器のテストベンチ

4ビット加算器の動作を確認するためのテストベンチを作成します。

module tb();
  reg [3:0] a;
  reg [3:0] b;
  wire [3:0] sum;
  wire cout;

  adder4 U1 (.a(a), .b(b), .sum(sum), .cout(cout));

  initial begin
    $monitor("a = %b, b = %b, sum = %b, cout = %b", a, b, sum, cout);
    a = 4'b0000;
    b = 4'b0000;
    #10;
    a = 4'b0001;
    b = 4'b0001;
    #10;
    a = 4'b0010;
    b = 4'b0011;
    #10;
    a = 4'b1111;
    b = 4'b0001;
    #10;
  end
endmodule

このテストベンチでは、4ビット加算器にいくつかの値を入力し、その結果を$monitorを使って出力します。

このテストを行うことで、作成した4ビット加算器が正しく動作することを確認できます。

上記のコードを実行すると、次のような結果が得られます。

a = 0000, b = 0000, sum = 0000, cout = 0
a = 0001, b = 0001, sum = 0010, cout = 0
a = 0010, b = 0011, sum = 0101, cout = 0
a = 1111, b = 0001, sum = 0000, cout = 1

これにより、4ビット加算器が正しく動作していることが確認できます。

●応用例:8ビット加算器の作成

次に、作成した4ビット加算器を応用して、8ビット加算器を作成します。

○サンプルコード4:8ビット加算器の作成

8ビット加算器の作成には、4ビット加算器を2つ使用します。

module adder8(input [7:0] a, input [7:0] b, output [7:0] sum, output cout);
  wire c4;
  adder4 A4_0 (.a(a[3:0]), .b(b[3:0]), .sum(sum[3:0]), .cout(c4));
  adder4 A4_1 (.a(a[7:4]), .b(b[7:4]), .cin(c4), .sum(sum[7:4]), .cout(cout));
endmodule

このコードでは、下位4ビットの加算を行う4ビット加算器(A4_0)と、上位4ビットの加算を行う4ビット加算器(A4_1)を連結しています。

A4_0の桁上がりがA4_1への入力となります。

○サンプルコード5:8ビット加算器のテストベンチ

作成した8ビット加算器の動作を確認するためのテストベンチを作成します。

module tb2();
  reg [7:0] a;
  reg [7:0] b;
  wire [7:0] sum;
  wire cout;

  adder8 U2 (.a(a), .b(b), .sum(sum), .cout(cout));

  initial begin
    $monitor("a = %b, b = %b, sum = %b, cout = %b", a, b, sum, cout);
    a = 8'b00000000;
    b = 8'b00000000;
    #10;
    a = 8'b00000001;
    b = 8'b00000001;
    #10;
    a = 8'b00000010;
    b = 8'b00000011;
    #10;
    a = 8'b11111111;
    b = 8'b00000001;
    #10;
  end
endmodule

上記のコードを実行すると、次のような結果が得られます。

a = 00000000, b = 00000000, sum = 00000000, cout = 0
a = 00000001, b = 00000001, sum = 00000010, cout = 0
a = 00000010, b = 00000011, sum = 00000101, cout = 0
a = 11111111, b = 00000001, sum = 00000000, cout = 1

これにより、8ビット加算器も正しく動作していることが確認できます。

●注意点と対処法

Verilogを使用して加算器を作成する際には、次のような注意点があります。

①入力信号のタイミング

全加算器は入力信号の変化に直ちに反応します。

しかし、物理的な回路では信号が伝播するには一定の遅延時間が必要です。

この遅延時間を考慮しないと、期待しない動作を引き起こす可能性があります。

②サイズの拡張

加算器のビット数を増やす際には、全加算器の数だけ増やす必要があります。

全加算器の数を増やすことで、複雑な加算器でも対応可能です。

③テストベンチの作成

複雑なデジタル回路を設計する際には、必ずテストベンチを作成して動作を確認しましょう。

テストベンチを作成することで、設計した回路が正しく動作するか確認できます。

まとめ

この記事では、Verilogを使って4ビット加算器を作成する方法を学びました。

Verilogの基本的な概念と特徴から、4ビット加算器の作成手順と動作原理、さらには8ビット加算器への応用例まで、Verilogの理解を深め、自身でデジタル回路を設計できるようになるための具体的な手順を紹介しました。

デジタル回路設計やハードウェア記述言語に興味がある初心者の方にとって、この記事がVerilogに対する理解と、自身で加算器を設計する第一歩となることを期待しています。