設計の目的
デジタル回路設計の基礎となる、算術演算および論理演算を行う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のポート名を正しく対応させる必要があります。