Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Verilogで学ぶCPU自作入門.pdf

Avatar for uyuki uyuki
September 24, 2026

 Verilogで学ぶCPU自作入門.pdf

2026年9月23日、KC3で実施した「Verilogで学ぶCPU自作入門」の講義資料です。公開にあたり、一部修正・補足しています。

「CPUを自作した!」という経験を持ち帰ることを目標に、論理回路・DFF・クロックから1bit CPU、4bit CPU「TD4」へと順番に説明します。

ハンズオンでは、用意されたCPUのひな形に、命令に応じて次の値を決める組み合わせ回路をSystemVerilogで記述し、ブラウザ上で動作を確認します。

※タイトルはVerilogですが、使用する言語はSystemVerilogです。

■ Webハンズオン
https://uyuki234.github.io/KC3-2026-cpu/

■ ソースコード
https://github.com/uyuki234/KC3-2026-cpu

■ 講義の振り返り・資料づくりの工夫
https://uyuki234.hatenablog.com/entry/2026/09/24/203544

■ イベントページ
https://kc3.me/study/4246/

Avatar for uyuki

uyuki

September 24, 2026

More Decks by uyuki

Other Decks in Programming

Transcript

  1. About me • uyuki / uyuki234 • 興味: セキュリティ /

    低レイヤー / ネットワーク • 自作OS、自作CPU、FPGA… • https://scrapbox.io/uyuki234/ • https://uyuki234.hatenablog.com/ • https://x.com/uyuki234 3
  2. 講義内容について • • 今回の内容はほとんど独学です 独学の際、主に利用した書籍・サイト ◦ ◦ ◦ ◦ ◦

    ◦ ◦ 無から始める自作 CPU ディジタル回路設計とコンピュータアーキテクチャ(論理回路まで) 超入門!FPGAスタータ・キット DE0で始めるVerilog HDL コンピュータシステムの理論と実装 第2版(5章まで) 作ろう!CPU 基礎から理解するコンピューターのしくみ CPUの創りかた デジタル電子回路(中部大学) 4
  3. 講義内容について • • 今回の内容はほとんど独学です 独学の際、主に利用した書籍・サイト ◦ ◦ ◦ ◦ ◦

    ◦ ◦ • 無から始める自作 CPU ディジタル回路設計とコンピュータアーキテクチャ(論理回路まで) 超入門!FPGAスタータ・キット DE0で始めるVerilog HDL コンピュータシステムの理論と実装 第2版(5章まで) 作ろう!CPU 基礎から理解するコンピューターのしくみ CPUの創りかた デジタル電子回路(中部大学) 独学した内容↑を1時間で皆さんに流し込みます🤩 5
  4. 講義内容について • • 今回の内容はほとんど独学です 独学の際、主に利用した書籍・サイト ◦ ◦ ◦ ◦ ◦

    ◦ ◦ • 無から始める自作 CPU ディジタル回路設計とコンピュータアーキテクチャ(論理回路まで) 超入門!FPGAスタータ・キット DE0で始めるVerilog HDL コンピュータシステムの理論と実装 第2版(5章まで) 作ろう!CPU 基礎から理解するコンピューターのしくみ CPUの創りかた デジタル電子回路(中部大学) 独学した内容↑を1時間で皆さんに流し込みます🤩 流石に厳しい 6
  5. 講義内容について • • 今回の内容はほとんど独学です 独学の際、主に利用した書籍・サイト ◦ ◦ ◦ ◦ ◦

    ◦ ◦ • 無から始める自作 CPU ディジタル回路設計とコンピュータアーキテクチャ(論理回路まで) 超入門!FPGAスタータ・キット DE0で始めるVerilog HDL コンピュータシステムの理論と実装 第2版(5章まで) 1時間で「 CPUを自作した!」になれるように、 作ろう!CPU 基礎から理解するコンピューターのしくみ 極限まで内容を吟味しました CPUの創りかた デジタル電子回路(中部大学) 独学した内容↑を1時間で皆さんに流し込みます🤩 流石に厳しい 7
  6. 論理回路 回路には電圧の高低があります。 • 電圧が 低い → 0 高い → 1

    として扱う 高い 低い 0と1のデータを表現できる →バイナリデータが扱える 正論理:Highに1を割り当てる←今回 負論理:Lowに1を割り当てる 11
  7. HDL • • HDL(Hardware Description Language) 電子回路の動作や構造をテキスト(コード)で表現するための専用言語 HDLの例 ◦ ◦

    ◦ Verilog HDL ▪ 1984年 SystemVerilog ←今回はこれを使う ▪ 2005年:IEEE標準化 Verilog HDLを拡張した言語 Veryl ▪ 2022年 最近できた言語で、勢いがある 15
  8. HDL • • HDL(Hardware Description Language) 電子回路の動作や構造をテキスト(コード)で表現するための専用言語 HDLの例 ◦ ◦

    ◦ Verilog HDL ▪ 1984年 SystemVerilog ←今回はこれを使う ▪ 2005年:IEEE標準化 Verilog HDLを拡張した言語 Veryl ▪ 2022年 最近できた言語で、勢いがある SystemVerilogのコードを見てみよう 16
  9. HDL AND 入出力ポートを宣言 input → 入力 output → 出力 (どの順番で書いても

    OK) always_comb: 組み合わせ回路の動作を記述するためのブロック 入力が変わると、それに応じて出力も変わる 18
  10. HDL AND 入出力ポートを宣言 input → 入力 output → 出力 (どの順番で書いても

    OK) always_comb: ここの記述は真理値表に対応している。 論理ゲートで構築するのはコンパイラの仕事 always_comb: 組み合わせ回路の動作を記述するためのブロック 入力が変わると、それに応じて出力も変わる 19
  11. HDL AND 入出力ポートを宣言 input → 入力 output → 出力 (どの順番で書いても

    OK) always_comb: ここの記述は真理値表に対応している。 論理ゲートで構築するのはコンパイラの仕事 always_comb: 組み合わせ回路の動作を記述するためのブロック 入力が変わると、それに応じて出力も変わる 20
  12. HDL AND 入出力ポートを宣言 input → 入力 output → 出力 (どの順番で書いても

    OK) always_comb: ここの記述は真理値表に対応している。 論理ゲートで構築するのはコンパイラの仕事 always_comb: 組み合わせ回路の動作を記述するためのブロック 入力が変わると、それに応じて出力も変わる 21
  13. HDL AND 入出力ポートを宣言 ざっくり、理解できてますか? input → 入力 わからないところがあっても、 output →

    出力 まずは講義全体を受け切ることを目標にして頑張ってください! (どの順番で書いても OK) always_comb: ここの記述は真理値表に対応している。 論理ゲートで構築するのはコンパイラの仕事 always_comb: 組み合わせ回路の動作を記述するためのブロック 入力が変わると、それに応じて出力も変わる 22
  14. DFF・クロック • DFF(Dフリップフロップ) ◦ 今回、内部の実装は扱わない DFFはこういう動作をしてくれると いう信頼のもと、続けていく 1bit(0, 1)の値を保持できる 取り込む値

    記憶している値 取り込む タイミング を 決める信号 CLKが0→1になるときに値を取り込む 0と1を周期的に繰り返す波形 32
  15. DFF・クロック • DFF(Dフリップフロップ) ◦ 今回、内部の実装は扱わない DFFはこういう動作をしてくれると いう信頼のもと、続けていく 1bit(0, 1)の値を保持できる 取り込む値

    記憶している値 取り込む タイミング を 決める信号 CLKが0→1になるときに値を取り込む 0と1を周期的に繰り返す波形 33
  16. DFF・クロック • DFF(Dフリップフロップ) ◦ 今回、内部の実装は扱わない DFFはこういう動作をしてくれると いう信頼のもと、続けていく 1bit(0, 1)の値を保持できる 取り込む値

    記憶している値 取り込む タイミング を 決める信号 CLKが0→1になるときに値を取り込む 0と1を周期的に繰り返す波形 何らかの方法で実装できる (今回は触れない) 34
  17. 初期化済みで、 Q=0から始める DFF・クロック D Q D DFF DFF D CLK

    Q DFF CLK Q DFF CLK Q CLK D DFF CLK D Q D Q DFF CLK 43
  18. DFF・クロック D Q D DFF DFF D CLK Q DFF

    CLK Q DFF CLK Q CLK D DFF CLK D Q D Q DFF CLK 44
  19. DFF・クロック D 切り替わってる 最中 CLKが0→1 Q D DFF Q D

    DFF CLK Q DFF CLK CLK 切り替わってる 最中 D Q DFF CLK D Q DFF CLK D 一瞬を すごく ゆっくり 見る Q DFF CLK 45
  20. DFF・クロック D Q D DFF DFF D CLK Q DFF

    CLK Q DFF CLK Q CLK D DFF CLK D Q D Q DFF CLK 46
  21. DFF・クロック D Q D DFF DFF D CLK Q DFF

    CLK Q DFF CLK Q CLK D DFF CLK D Q D Q DFF CLK 47
  22. DFF・クロック D 1周した Q D DFF Q D DFF CLK

    Q DFF CLK CLK CLKが0→1 D Q DFF CLK D Q DFF CLK D Q DFF CLK 48
  23. DFF・クロック D Q D DFF Q D DFF CLK Q

    DFF CLK CLK ここは一瞬 D Q DFF CLK D Q DFF CLK D Q DFF CLK 49
  24. DFF・クロック D Q D DFF Q D DFF CLK Q

    DFF CLK CLK 一瞬の部分を ここは一瞬 飛ばして見てみる D Q DFF CLK D Q DFF CLK D Q DFF CLK 50
  25. DFF・クロック D Q D DFF Q DFF CLK CLK 「この回路が

    0と1を繰り返す」 ということを覚えてください! D Q DFF CLK D Q DFF CLK 61
  26. 1bit CPU 2種類の命令を、 1bitで区別できている sが0→何もしない( NOP) sが1→値を反転する( NOT) next_a MX

    s opcode a 命令名 (命令) (現在の値) ~a a D CLK DFF next_a (次の値) 0 NOP 0 0 0 NOP 1 1 1 NOT 0 1 1 NOT 1 0 Q 74
  27. 1bit CPU 2種類の命令を、 1bitで区別できている NOPとNOTは 人間が勝手に 定義しているだけ sが0→何もしない( NOP) sが1→値を反転する(

    NOT) next_a MX s opcode a 命令名 (命令) (現在の値) ~a a D CLK DFF next_a (次の値) 0 NOP 0 0 0 NOP 1 1 1 NOT 0 1 1 NOT 1 0 Q 75
  28. 1bit CPU → 命令ポインタ s next_a MX ・実行する命令を並べて置く場所 → ROM

    ・↑のために、今どの命令を実行するかを示す値 がほしい ~a a D CLK DFF Q 81
  29. TD4 1bitの記憶 4bitの記憶(レジスタ) D DFF D[3] 1 clk DFF D[2]

    0 DFF D[1] 1 DFF D[0] 0 DFF 1 clk 0 または 1 表せる値は 0〜15 88
  30. TD4 • Toriaezu Dousasuru 4bit CPU(とりあえず動作する4ビットCPU) ◦ 「CPUの創りかた」で紹介された ▪ LEDの点滅や簡単なタイマーなどの制御プログラムを動かして遊べる

    opcode 4bit+即値4bit=1命令8bit • • 後で解説します 1命令は8bit(opcode 4bit+即値4bit)。A・Bレジスタは4bit。 加算結果の下位4bitを保存し、桁上がりはCFに保存する。 ROMに16命令まで置ける できること 命令の役割 加算 レジスタの値に数値を⾜す 値の転送 レジスタに値を⼊れる‧別のレジスタへ写す ⼊⼒‧出⼒ スイッチの値を読む‧LEDに値を出す 分岐 次に実⾏する命令の番地を変える 89
  31. TD4ハンズオン • • TD4の計算部分で使われる主なワイヤー、値 imm(immediate value)= 即値 信号 幅 役割

    a b out ip cf 4bit 4bit 4bit 4bit 1bit 計算に使う値(Aレジスタ) 計算に使う値(Bレジスタ) LEDに出す値 実⾏する命令の番地(0〜15) 加算で桁上がりがあったか 96
  32. 信号 幅 役割 a b out ip cf 4bit 4bit

    4bit 4bit 1bit 計算に使う値(Aレジスタ) 計算に使う値(Bレジスタ) LEDに出す値 実⾏する命令の番地(0〜15) 加算で桁上がりがあったか 99
  33. TD4ハンズオン • TD4の命令セット 難易度の高いものは★をつけました opcode 命令 動作(次に記憶する値) 0000 0101 0011

    0111 0001 0100 1111 1110 0010 0110 1001 1011 ADD A, Imm ADD B, Imm MOV A, Imm MOV B, Imm MOV A, B MOV B, A JMP Imm JNC Imm IN A IN B OUT B OUT Imm Aに A + Imm の下位4bit、CFに桁上がりを⼊れる Bに B + Imm の下位4bit、CFに桁上がりを⼊れる Aに即値を⼊れる Bに即値を⼊れる JNCはADDの桁上がりで分岐したい時に使う。 AにBの値を⼊れる (直前のADDで桁上がりがなければジャンプする。 ) BにAの値を⼊れる IPにジャンプ先の番地(即値)を⼊れる 現在のCFが0ならジャンプ、1なら次の番地へ Aに⼊⼒スイッチ(switch)の値を⼊れる Bに⼊⼒スイッチ(switch)の値を⼊れる OUTにBの値を⼊れる OUTに即値を⼊れる 101
  34. まとめ • 論理回路から CPUまで ◦ ◦ ◦ ◦ 論理回路・組み合わせ回路:入力から出力を決める HDL:回路の動作をコードで記述する

    DFF・クロック:値を記憶し、立ち上がりで更新する CPU:命令に応じて次の値を決め、記憶する 112
  35. まとめ • 論理回路から CPUまで ◦ ◦ ◦ ◦ • 論理回路・組み合わせ回路:入力から出力を決める

    HDL:回路の動作をコードで記述する DFF・クロック:値を記憶し、立ち上がりで更新する CPU:命令に応じて次の値を決め、記憶する 自分の書いた回路で、 CPUが動いた ◦ ◦ 命令セットをもとに、 TD4の命令処理を実装した! 自分が実装した CPUで、プログラムを動かした! 113
  36. まとめ • 論理回路から CPUまで ◦ ◦ ◦ ◦ • 論理回路・組み合わせ回路:入力から出力を決める

    HDL:回路の動作をコードで記述する DFF・クロック:値を記憶し、立ち上がりで更新する CPU:命令に応じて次の値を決め、記憶する 自分の書いた回路で、 CPUが動いた ◦ ◦ 命令セットをもとに、 TD4の命令処理を実装した! 自分が実装した CPUで、プログラムを動かした! あなたはこの 1時間で「 CPUを自作した!」になれました 114
  37. まとめ • 論理回路から CPUまで ◦ ◦ ◦ ◦ • 論理回路・組み合わせ回路:入力から出力を決める

    HDL:回路の動作をコードで記述する DFF・クロック:値を記憶し、立ち上がりで更新する CPU:命令に応じて次の値を決め、記憶する いろいろ作ってみてください! 自分の書いた回路で、 CPUが動いた ◦ ◦ 命令セットをもとに、 TD4の命令処理を実装した! 自分が実装した CPUで、プログラムを動かした! あなたはこの 1時間で「 CPUを自作した!」になれました 115
  38. ほかにも作ってみる • CPUに限らず、いろいろ作ってみてください! ◦ ◦ ◦ ◦ ◦ ◦ ◦

    ◦ OS コンパイラ・インタプリタ CPUエミュレータ・仮想マシン ネットワーク関連( ping、HTTPサーバー、TCP/IPスタックなど) データベース ファイルシステム プログラミング言語・シェル Webサーバー 119
  39. 参考文献 • 無から始める自作CPU ◦ • • • • • •

    • ディジタル回路設計とコンピュータアーキテクチャ 超入門!FPGAスタータ・キットDE0で始めるVerilog HDL コンピュータシステムの理論と実装 第2版 作ろう!CPU 基礎から理解するコンピューターのしくみ CPUの創りかた デジタル電子回路(中部大学) SystemVerilogの解説 ◦ • 実はContributorの一人(教材のコード例を修正しました! ) https://sites.google.com/site/dejitarudezainfan/systemverilog/always_comb-always_ff ゼロから始める自作 CPU 入門 121