Verilogを用いた4ビットALU(演算回路)の設計と実装

設計の目的

デジタル回路設計の基礎となる、算術演算および論理演算を行うALU(Arithmetic Logic Unit)を設計します。Vivadoを用いたシミュレーションおよびFPGA開発ボードへの実装を通じて、ハードウェア記述言語(Verilog HDL)による演算ロジックの構築と、7セグメントディスプレイによる結果表示の仕組みを理解します。

仕様定義

本設計では、2つの4ビット入力(A, B)と2ビットの制御信号(op)を受け取り、8ビットの演算結果(F)を出力します。

入出力信号

  • 入力 A, B: 各4ビット(スイッチを使用)
  • 制御信号 op: 2ビット(スイッチを使用)
  • 出力 F: 8ビット(7セグメントディスプレイ2桁で16進数表示)

演算機能一覧

選択信号 (op) 演算機能 出力 (F) の詳細
00 加算 (Addition) F = A + B (5ビット目にキャリー出力)
01 減算 (Subtraction) F = A - B (5ビット目にボロー出力)
10 論理否定 (NOT) F = ~A (上位4ビットは0固定)
11 乗算 (Multiplication) F = A * B

ハードウェアロジックの実装

ALUコアモジュールの設計

各演算を独立した組合せ回路として記述し、最後にマルチプレクサで出力を選択する構造をとります。

module alu_core (
    output reg [7:0] result_f,
    input [3:0] data_a,
    input [3:0] data_b,
    input [1:0] ctrl_op
);

    wire [7:0] sum_val;
    wire [7:0] diff_val;
    wire [7:0] not_val;
    wire [7:0] prod_val;

    // 加算処理(キャリー考慮)
    assign sum_val = {4'b0000, data_a} + {4'b0000, data_b};

    // 減算処理(ボロー考慮)
    // 符号なし演算として扱い、5ビット目に結果を反映
    assign diff_val = {3'b000, ({1'b0, data_a} - {1'b0, data_b})};

    // 論理否定
    assign not_val = {4'b0000, ~data_a};

    // 乗算
    assign prod_val = data_a * data_b;

    // 出力セレクタ
    always @(*) begin
        case (ctrl_op)
            2'b00: result_f = sum_val;
            2'b01: result_f = diff_val;
            2'b10: result_f = not_val;
            2'b11: result_f = prod_val;
            default: result_f = 8'h00;
        endcase
    end

endmodule

表示制御ロジック

FPGAボード上の7セグメントディスプレイは、一般的にダイナミック点灯方式を採用しています。コモンアノード(正極共通)の場合、信号を「0」にすることで点灯します。

7セグメントデコーダの例

4ビットのバイナリ値を入力し、対応するセグメントパターン(a-g)を出力するデコーダを実装します。ここではシミュレーションで扱いやすいカソード(負極共通)論理の例を示します。

module seg7_decoder (
    output reg [6:0] seg_pattern,
    input [3:0] hex_val
);
    always @(*) begin
        case (hex_val)
            4'h0: seg_pattern = 7'b0111111;
            4'h1: seg_pattern = 7'b0000110;
            4'h2: seg_pattern = 7'b1011011;
            4'h3: seg_pattern = 7'b1001111;
            4'h4: seg_pattern = 7'b1100110;
            4'h5: seg_pattern = 7'b1101101;
            4'h6: seg_pattern = 7'b1111101;
            4'h7: seg_pattern = 7'b0000111;
            4'h8: seg_pattern = 7'b1111111;
            4'h9: seg_pattern = 7'b1101111;
            4'hA: seg_pattern = 7'b1110111;
            4'hB: seg_pattern = 7'b1111100;
            4'hC: seg_pattern = 7'b0111001;
            4'hD: seg_pattern = 7'b1011110;
            4'hE: seg_pattern = 7'b1111001;
            4'hF: seg_pattern = 7'b1110001;
            default: seg_pattern = 7'b0000000;
        endcase
    end
endmodule

実装のポイント

減算回路において負の結果が生じる場合、上位ビットのフラグをどのように扱うかが重要です。本設計では簡略化のため、5ビット目のボロービットを計算結果に含めています。また、実機(FPGA)へ書き込む際は、各ピンの制約ファイル(XDCファイルなど)を作成し、スイッチやディスプレイの物理ピン番号とVerilogのポート名を正しく対応させる必要があります。

タグ: Verilog FPGA ALU DigitalCircuit Vivado

5月27日 03:48 投稿