Skip to content
Published on

デジタル論理設計完全ガイド: ブール代数からCPU設計まで

Authors

1. デジタルシステム概要

アナログ vs デジタル

アナログ信号は連続的な値を持ち、デジタル信号は離散的な値(0と1)のみを使用します。現代の電子システムの大部分がデジタル方式を採用している主な理由は以下の通りです。

  • ノイズ耐性: 0と1の2値のみを識別するため、電気的ノイズに強い。
  • 完全な再現性: コピー過程で信号の劣化が生じない。
  • 論理処理: ブール代数による数学的基盤が整っている。
  • 記憶容易性: フリップフロップやメモリセルで確実かつ永続的に保存できる。

進数変換

デジタルシステムでは2進数(Binary)、8進数(Octal)、16進数(Hexadecimal)を頻繁に使用します。

10進数 → 2進数 (2による繰り返し除算):
  45 ÷ 2 = 22 余り 1
  22 ÷ 2 = 11 余り 0
  11 ÷ 2 =  5 余り 1
   5 ÷ 2 =  2 余り 1
   2 ÷ 2 =  1 余り 0
   1 ÷ 2 =  0 余り 1
  結果: 101101(2)
10進数2進数8進数16進数
0000000
5010155
10101012A
15111117F
16100002010

符号付き数値の表現

2の補数(Two's Complement) は現代コンピュータにおける負の整数表現の標準方式です。

+50000 0101
-5を求める:
  1の補数:  1111 1010
  +1:       1111 1011-52の補数表現

8ビット2の補数の範囲: -128 ~ +127

BCDとグレイコード

  • BCD (2進化10進数): 各10進桁を4ビットで表現。例: 29 = 0010 1001
  • グレイコード: 隣接するコードワード間で変化するビット数が常に1つ — メカニカルエンコーダやA/D変換器での誤り最小化に活用

2. ブール代数 (Boolean Algebra)

基本演算

ブール代数の3つの基本演算:

  • AND (論理積): A · B — 両方の入力が1のときのみ出力が1
  • OR (論理和): A + B — どちらか一方でも1なら出力が1
  • NOT (否定): A' — 入力を反転

ブール代数の法則

交換則:   A + B = B + A,      A · B = B · A
結合則:   A + (B+C) = (A+B) + C
分配則:   A · (B+C) = AB + AC
恒等元:   A + 0 = A,  A · 1 = A
補元:     A + A' = 1, A · A' = 0
べき等則: A + A = A,  A · A = A

ド・モルガンの定理 — NAND/NOR実装と論理最小化の核心:

(A · B)' = A' + B'
(A + B)' = A' · B'

標準形

  • SOP (積の和、Sum of Products): 最小項の和。例: F = AB' + A'B + AB
  • POS (和の積、Product of Sums): 最大項の積。例: F = (A+B)(A'+C)

3. 論理ゲート

基本ゲートの真理値表

ANDゲート:           ORゲート:            NOTゲート:
A  B  A·B            A  B  A+B            A  A'
0  0   0             0  0   0             0   1
0  1   0             0  1   1             1   0
1  0   0             1  0   1
1  1   1             1  1   1

NANDゲート:          NORゲート:
A  B  (A·B)'         A  B  (A+B)'
0  0    1            0  0    1
0  1    1            0  1    0
1  0    1            1  0    0
1  1    0            1  1    0

XORゲート:           XNORゲート:
A  B  AB            A  B  (AB)'
0  0   0             0  0    1
0  1   1             0  1    0
1  0   1             1  0    0
1  1   0             1  1    1

万能ゲート (Universal Gate)

NANDゲートだけであらゆるブール関数を実現できます。

NOT A   = A NAND A
A AND B = (A NAND B) NAND (A NAND B)
A OR B  = (A NAND A) NAND (B NAND B)

この性質により、実際のチップ製造では単一セル種で全ての論理を実装できるため、製造プロセスが単純化されます。NORゲートも同様に万能ゲートです。

CMOS実装概要

現代のデジタルICは主にCMOS(相補型MOS)技術で実装されています。

  • NMOSトランジスタ: ゲートHIGH時にON(プルダウンネットワーク)
  • PMOSトランジスタ: ゲートLOW時にON(プルアップネットワーク)
  • CMOSインバータ: PMOS + NMOSの直列接続
  • 静的電力消費がほぼゼロ → 低消費電力設計の主流

4. カルノー図 (Karnaugh Map)

カルノー図は、隣接する1のグループを視覚的に識別することでブール式を最小化する体系的な手法です。

4変数カルノー図の例

          CD
AB      00  01  11  10
00  [    1   0   1   1  ]
01  [    1   1   1   0  ]
11  [    0   1   1   0  ]
10  [    0   0   1   1  ]

グループ化のルール

  1. グループのサイズは2の累乗(1, 2, 4, 8, 16)に限られます。
  2. グループは長方形(正方形含む)の形でなければなりません。
  3. 図は上下左右でつながっています(トーラス形状)。
  4. できる限り大きなグループを、できる限り少ない数で使用します。
  5. Don't care条件(X)はグループを大きくするために含めることができます。

主項 (Prime Implicant)

これ以上拡大できない最大のグループを主項(Prime Implicant) といい、その最小項を含む主項が一つだけの場合を本質主項(Essential PI) といいます。最小化されたSOPは全ての本質主項を含む必要があります。


5. 組合せ論理回路

組合せ回路の出力は現在の入力のみに依存します。内部状態や記憶は持ちません。

半加算器と全加算器

半加算器 (Half Adder):
  (Sum)   S = AB
  桁上(Carry) C = A · B

全加算器 (Full Adder):
  S    = ABCin
  Cout = AB + Cin(AB)

全加算器を直列接続するとリプルキャリー加算器になります。桁上げが順次伝搬するため動作は遅いですが構造が単純です。高速演算には桁上げ先見加算器(Carry Lookahead Adder) を使用します。

マルチプレクサ (MUX)

nビットの選択信号で2^n個のデータ入力から一つを選択して出力します。

4:1 MUX (選択信号 S1, S0):
  S1=0, S0=0Y = I0
  S1=0, S0=1Y = I1
  S1=1, S0=0Y = I2
  S1=1, S0=1Y = I3

2^n対1のMUXは任意のn変数ブール関数を直接実装できます。

エンコーダとデコーダ

  • エンコーダ: 2^n本の入力をnビット2進コードに変換(例: 優先順位エンコーダ)
  • デコーダ: nビット2進コードを最大2^n本の出力に変換(例: 3-to-8デコーダ)

デコーダとORゲートの組合せで任意のSOP式を直接実装できます。


6. 順序論理回路

順序回路の出力は現在の入力だけでなく内部状態(記憶) にも依存します。

ラッチ (Latch)

SRラッチは、クロス結合されたNANDまたはNORゲートで構成される最も基本的な記憶素子です。

SRラッチの真理値表:
S  R  Q()
0  0  Q(保持)
1  0  1 (Set)
0  1  0 (Reset)
1  1  不定 (禁止)

DラッチはSRラッチの禁止状態を排除したバージョンで、Enableが HIGHの間、Q はDの値を追いかけます。

フリップフロップ (Flip-Flop)

フリップフロップはエッジトリガ方式で、クロックの立ち上がりまたは立ち下がりエッジでのみ状態が変化します。

D フリップフロップ:  Q() = D

JK フリップフロップ:
  J=0, K=0Q(保持)
  J=1, K=0Q=1 (Set)
  J=0, K=1Q=0 (Reset)
  J=1, K=1Q' (反転)

T フリップフロップ:
  T=0Q(保持)
  T=1Q' (反転)

JKフリップフロップは全入力組合せが有効です。Tフリップフロップはカウンタ設計に最適です。


7. レジスタとカウンタ

シフトレジスタ

複数のフリップフロップを直列に接続し、クロック毎にデータをシフト(移動)させる回路です。

  • SISO: 直列入力、直列出力
  • SIPO: 直列入力、並列出力
  • PISO: 並列入力、直列出力
  • PIPO: 並列入力、並列出力

応用: 直並列変換、CRC演算、擬似乱数生成(LFSR)、2の累乗による高速乗除算。

カウンタ

3ビット非同期カウンタ (リプルカウンタ):
  3個のTフリップフロップの直列接続
  012345670 ...
  欠点: リプル遅延が蓄積する

3ビット同期カウンタ:
  全フリップフロップが共通クロックを使用
  全出力が同時に変化 → リプル遅延なし

モジュロNカウンタは0からN-1まで循環します。BCDカウンタ(モジュロ10)は0から9を循環し、デジタル時計等に広く使われます。


8. 有限状態機械 (FSM)

FSMはすべての順序論理システムの基礎となる抽象モデルで、有限個の状態、遷移条件、出力から構成されます。

ムーア機械 vs ミーリー機械

  • ムーア機械(Moore Machine): 出力が現在の状態のみに依存。状態図では状態のバブル内に出力を表示。
  • ミーリー機械(Mealy Machine): 出力が現在の状態と入力の両方に依存。遷移矢印上に「入力/出力」を表示。

ミーリー機械は等価なムーア機械より少ない状態数で実現できることが多いです。

自動販売機FSMの例

状態: S0(0), S1(100), S2(200), S3(300円 → 飲料排出)
入力: A(100円投入), B(200円投入)

状態遷移:
  S0 --A--> S1
  S0 --B--> S2
  S1 --A--> S2
  S1 --B--> S3(飲料排出)
  S2 --A--> S3(飲料排出)
  S2 --B--> S3(飲料排出, 100円返却)

FSM設計手順

  1. 問題分析 → 状態定義
  2. 状態遷移図の作成
  3. 状態遷移表の作成(次状態と出力)
  4. 状態エンコーディング(2進符号割り当て)
  5. 次状態関数と出力関数の導出
  6. カルノー図による最小化
  7. フリップフロップとゲートによる実装

9. Verilog HDL基礎

Verilog HDL(ハードウェア記述言語)はデジタル回路をソフトウェアのように記述する言語で、シミュレーションと物理ゲートへの自動合成を可能にします。

モジュール構造

module module_name (
    input  wire        clk,
    input  wire        reset,
    input  wire [3:0]  data_in,
    output reg  [3:0]  data_out
);
    wire [3:0] temp;

    // 組合せ回路: assign
    assign temp = data_in & 4'b1111;

    // 順序回路: always
    always @(posedge clk or posedge reset) begin
        if (reset)
            data_out <= 4'b0000;
        else
            data_out <= temp;
    end
endmodule

Dフリップフロップ

module d_ff (
    input  wire clk,
    input  wire reset,
    input  wire d,
    output reg  q
);
    always @(posedge clk or posedge reset) begin
        if (reset)
            q <= 1'b0;
        else
            q <= d;
    end
endmodule

4ビット同期カウンタ

module counter_4bit (
    input  wire       clk,
    input  wire       reset,
    output reg  [3:0] count
);
    always @(posedge clk or posedge reset) begin
        if (reset)
            count <= 4'b0000;
        else
            count <= count + 1'b1;
    end
endmodule

テストベンチ (Testbench)

module tb_counter;
    reg        clk, reset;
    wire [3:0] count;

    counter_4bit uut (
        .clk(clk),
        .reset(reset),
        .count(count)
    );

    // 10nsクロック周期
    initial clk = 0;
    always #5 clk = ~clk;

    initial begin
        reset = 1;
        #20 reset = 0;
        #200 $finish;
    end

    initial begin
        $monitor("t=%0t reset=%b count=%b", $time, reset, count);
    end
endmodule

Verilogデータ型まとめ

説明主な使用場所
wire組合せネット、駆動値を保持assign文、ポート接続
reg値を保持できる変数alwaysブロック内
integer32ビット符号付き整数ループ変数、シミュレーション
parameter定数モジュールのパラメータ化

10. FPGA基礎

FPGA vs ASIC vs マイクロプロセッサ

属性FPGAASICMCU/CPU
再構成可能可能不可ソフトウェアで可
ピーク性能中~高最高汎用
開発コスト中程度非常に高い低い
量産コスト高い非常に低い低い
並列処理優秀優秀制限的
最適用途プロトタイプ、中量産大量生産汎用制御

FPGAの内部構造

  • CLB(Configurable Logic Block): LUT + フリップフロップ + MUXの組合せ
  • LUT(Look-Up Table): nビット入力LUTはSRAMに真理値表を直接格納することで任意のn変数ブール関数を実装可能
  • IOB(I/O Block): FPGAファブリックと外部ピンのインターフェース、多様な電圧・プロトコルに対応
  • ブロックRAM(BRAM): オンチップ専用メモリブロック
  • DSPブロック: 乗算・累算に最適化されたハードワイヤードユニット
  • PLL/クロック管理: 周波数合成とクロック分配

FPGA設計フロー

1. 設計入力 (HDLコード記述 / 回路図入力)
2. 合成 (Synthesis) → ゲートレベルネットリスト生成
3. 実装 (Implementation)
   ├── マッピング (Map)FPGAリソースへの割り当て
   ├── 配置 (Place) → 物理的位置の決定
   └── 配線 (Route) → 接続線の決定
4. タイミング解析 (Timing Analysis) → セットアップ/ホールド制約の検証
5. ビットストリーム生成 (Bitstream Generation)
6. FPGAプログラミング (JTAGダウンロード)

主要FPGAベンダー

  • AMD-Xilinx: Spartan(低コスト)、Artix、Kintex、Virtex(高性能)、Zynq(ARM+FPGA SoC)
  • Intel (Altera): Cyclone(低コスト)、Arria(中間)、Stratix(ハイエンド)
  • Lattice Semiconductor: iCE40(超低消費電力、オープンソースツールチェーン対応)

11. CPU基礎設計

ALU (算術論理演算装置)

ALUはプロセッサの演算コアです。

ALU入力:
  A, B     — nビット被演算数
  OpCode   — 演算選択

ALU出力:
  Result   — nビット演算結果
  Zero     — 結果が0のとき1
  Carry    — 桁上げ発生時1
  Overflow — オーバーフロー発生時1
  Negative — 結果が負のとき1

演算例:
  000A + B (加算)
  001A - B (減算)
  010A AND B
  011A OR B
  100A XOR B
  101NOT A
  110A << 1 (左シフト)
  111A >> 1 (右シフト)

レジスタファイル

汎用レジスタの集合体で、通常2つの読み出しポートと1つの書き込みポートを持ちます。

module register_file (
    input  wire        clk,
    input  wire        we,
    input  wire [4:0]  rs1, rs2, rd,
    input  wire [31:0] write_data,
    output wire [31:0] read_data1,
    output wire [31:0] read_data2
);
    reg [31:0] regs [0:31];

    assign read_data1 = regs[rs1];
    assign read_data2 = regs[rs2];

    always @(posedge clk) begin
        if (we && rd != 0)
            regs[rd] <= write_data;
    end
endmodule

シンプルなCPUデータパス

IF  — 命令フェッチ: PCのアドレスから命令メモリを読み出す
ID  — 命令デコード: レジスタ読み出し、制御信号生成
EX  — 実行: ALU演算
MEM — メモリアクセス: データメモリの読み書き
WB  — ライトバック: 結果をレジスタファイルに書き戻す

パイプライン処理

5段パイプラインにより複数命令の実行を重ね合わせ、スループットを大幅に向上させます。

クロック:   1   2   3   4   5   6   7   8   9
命令1:     IF  ID  EX  ME  WB
命令2:         IF  ID  EX  ME  WB
命令3:             IF  ID  EX  ME  WB
命令4:                 IF  ID  EX  ME  WB
命令5:                     IF  ID  EX  ME  WB

パイプラインハザードの種類と対処:

  • 構造ハザード: 2命令が同一ハードウェアリソースを同時使用 → リソース追加またはストール
  • データハザード(RAW): 後続命令が前命令のまだ書き戻されていない値を使用 → フォワーディング、ストール、コンパイラスケジューリング
  • 制御ハザード: 分岐先が確定するまで次命令が不明 → 分岐予測、遅延分岐、投機実行

12. AIハードウェアとの接点

GPUのデジタル論理構造

現代のGPUは数千個の小型ALUコア(CUDAコア、SIMDレーン)を並列配置した構造です。この大規模並列性はディープラーニングの中核演算である行列乗算に最適化されています。

  • NVIDIA Tensor Core: 混合精度(FP16×FP16 → FP32)の行列演算を1クロックサイクルで実行
  • SIMT実行モデル: 数千スレッドが同一命令を異なるデータに対して同時実行

TPUとNPU

  • TPU(テンソル処理装置): Googleが設計したMAC(乗累算)演算専用ASIC。シストリックアレイ構造でニューラルネットワークの推論・学習を大規模並列化。
  • NPU(ニューラル処理装置): モバイル・エッジデバイス向けAIアクセラレータ。Apple Neural Engine、Qualcomm Hexagon DSP、Samsung Exynos NPUなど。

FPGAを用いたAI加速

FPGAはAI推論加速において独自のニッチを占めています。

  • 低レイテンシ: リアルタイム処理要件のシステムに適合(自律走行、産業ビジョン)
  • 柔軟性: モデル変更時にビットストリームを再ロードするだけで対応可能
  • カスタム精度: 4ビットや8ビット演算を実装し、精度とリソースのバランスを最適化
  • 実例: Microsoft Project BrainwaveがAzureデータセンターにFPGAを展開してDNN推論を加速

ニューロモルフィックコンピューティング

脳のニューロン・シナプス構造をシリコンで直接模倣したコンピューティングパラダイムです。

  • Intel Loihi 2: スパイキングニューラルネットワーク(SNN)専用チップ、オンチップ学習機能を搭載
  • IBM TrueNorth: 100万ニューロン・2億5600万シナプスをオンチップで実現、消費電力はミリワット級
  • イベント駆動・非同期処理による超低消費電力動作 → 常時起動型エッジAIに有望

13. 学習ロードマップ

【基礎】
  ブール代数 → 論理ゲート → カルノー図
【組合せ回路】
  加算器, MUX, デコーダ, エンコーダ
【順序回路】
  ラッチ → フリップフロップ → レジスタ → カウンタ
【システム設計】
  FSM → データパス → 制御ユニット
HDL/FPGA  Verilog → シミュレーション → FPGA実装
【プロセッサアーキテクチャ】
  ALU → パイプライン → メモリ階層
AIハードウェア】
  GPUアーキテクチャ → TPU/NPUFPGA加速

クイズ

Q1. NANDゲートが万能ゲート(Universal Gate)と呼ばれる理由は何ですか?

正解: NANDゲートだけで、NOT、AND、ORの全ての基本論理ゲートを実装できるからです。

解説:

  • NOT A = A NAND A
  • A AND B = (A NAND B) NAND (A NAND B)
  • A OR B = (A NAND A) NAND (B NAND B)

NOT・AND・ORは機能的完全系を成すため、NANDゲートのみで任意のブール関数を実現できます。NORゲートも同様に万能ゲートです。

Q2. 8ビット2の補数表現で表せる最小の負の値はいくつですか?またなぜ範囲が非対称なのですか?

正解: -128 (2進数: 10000000)。範囲が-128から+127と非対称なのは、0が正の値として1つのコードを使用するためです。

解説: 8ビットには256通りのパターンがあります。00000000はゼロを表すため、正の数は1から127の127通り、負の数は-128から-1の128通りとなります。10000000の2の補数を求めると9ビット必要となるため、10000000は-128専用のコードとなります。

Q3. DラッチとDフリップフロップの本質的な違いは何ですか?

正解: Dラッチはレベルトリガで、Enableが HIGH の間 Q は D を追いかけ続けます。Dフリップフロップはエッジトリガで、クロックエッジでのみ D をサンプリングし、その値を保持します。

解説: レベルトリガのラッチはEnableがアサートされている間に出力が複数回変化する可能性があり、同期設計に使用するのが困難です。エッジトリガのフリップフロップは1クロックサイクルに1回しか更新されないため、タイミングを厳密に制御でき、クロック同期設計の標準として使われます。

Q4. カルノー図のDon't care条件とは何ですか?なぜ使用するのですか?

正解: Don't care(X)とは、実際には発生しない入力の組合せ、またはその出力値が設計にとって無関係な場合のことです。設計者は最大のグループを形成できるように0か1を自由に選択できます。

解説: 例えばBCD入力(0-9)を処理する回路では、1010から1111(10-15)の入力は通常の動作では現れません。これら6つの最小項をDon't careにすると、カルノー図でより大きなグループを作ることができ、必要なゲート数が削減されます。

Q5. パイプラインCPUにおけるデータハザードとは何ですか?主な解決方法は何ですか?

正解: データハザードとは、後続の命令がパイプライン内でまだ書き戻しが完了していない前命令の結果を読み出そうとする際に生じる競合です(RAW: Read After Write依存)。

解決方法:

  • フォワーディング(バイパス): ALUの出力を次の命令のALU入力に直接配線し、レジスタファイルへの書き戻しをバイパスします。ほとんどのRAWハザードをストールなしに解決します。
  • ストール(パイプラインバブル): 依存する値が利用可能になるまでNOPサイクルを挿入します。シンプルですがスループットが低下します。
  • コンパイラスケジューリング: 依存関係のない命令を生産命令と消費命令の間に配置し、ハードウェアなしでハザードを回避します。

参考資料