このシリーズについて
FPGAボード(PYNQ-Z2)の上に,CPUから自作でPCを作っていくシリーズです.
メモリ・ISA・CPUといったハードウェアから,アセンブラ・コンパイラ・シェル・ファイルシステムといったソフトウェアまで,既存のものに頼らず順に作っていきます.
最終目標は,ストレージとOSを持ちlsやcdなどのコマンドを実行できるシェルが動く,本物の自作PCです.
各回の内容を以下にまとめます.
目次
自作PCを作ろう1 ~メモリを作る~ (2024-07-06)
自作PCを作ろうと思い立った回です.何から手を付けるか悩んだ末,まずデータの置き場所であるメモリから作ることにしました.
SystemVerilogでRAMを記述し,読み書きができることを確認しています.
シリーズ全体をどう進めていくかの方針もここで決めています.
自作PCを作ろう2 ~ISAを作ろう~ (2024-07-18)
CPUを作る前に,そのCPUがどんな命令を理解するのかを決める必要があります.
演算系・シフト系・代入系・分岐系・ジャンプ系・メモリ系の6種類に分類し,独自のISA(命令セットアーキテクチャ)を設計しました.
命令のどのビットが何を意味するかという形式も,ここで定めています.
自作PCを作る3 ~アセンブラを作ろう1~ (2024-08-18)
機械語を直接書くのは現実的ではないので,人間が読める形で命令を書けるようにします.
レジスタに名前を付け,命令の種類ごとに記法を定めて,独自のアセンブリ言語を設計しました.
それを機械語へ変換するアセンブラも作成しています.
自作PCを作る4 ~CPUを作ろう~ (2025-09-15)
いよいよ命令を実際に実行する本体を作ります.
命令を分解するデコーダと演算を行うALUに分けて実装し,メモリ・ROMと組み合わせて1つのマザーボードとしてまとめました.
テストコードで各命令が正しく動作することを確認しています.
自作PCを作る5 ~足し算機を作ろう~ (2025-09-21)
作ったCPUで実際にプログラムを動かしてみる回です.
足し算を行うプログラムを書いてROMに格納し,実機で実行しました.
これで「任意のプログラムを実行できる」状態になりました.
自作PCを作る6 ~キーボード入力を受け取ろう~ (2025-11-16)
プログラムを実行できても,外から入力を与えられなければPCとは言えません.
PYNQ-Z2に載っているARMプロセッサ(PS)とFPGA部(PL)をDMAで繋ぎ,キーボード入力を自作CPUへ届けられるようにしました.
PS側の力を借りているので,この時点ではまだ独力ではありません.
自作PCを作る7 ~プログラムで足し算を行う~ (2026-03-08)
入力を受け取れるようになったので,入力された計算式を解釈して答えを返すプログラムを書きます.
一桁同士の足し算から始め,繰り上がりのある場合,複数桁同士の場合へと段階的に対応しました.
自作PCを作る8 ~CALL関数とRET関数を実装する~ (2026-05-30)
プログラムが複雑になってきたので,関数呼び出しに対応します.
CALL命令とRET命令を新たに追加し,戻り先のアドレスを専用のレジスタに保存する方式で実装しました.
データスタックを持たない構成のため,呼び出しのネストは最大10段までという制限があります.
自作PCを作る9 ~アセンブラを作る~ (2026-05-31)
第3回で作ったアセンブラを,本格的に作り直します.
C++で実装し直し,アセンブリファイルからSystemVerilogのROMファイルまで変換できるようにしました.
命令をテーブルとして持つ構成にしたことで,命令の追加が容易になっています.
自作PCを作る10 ~コンパイラを作る1~ (2026-06-24)
アセンブリを書き続けるのが辛くなってきたので,高級言語を自作します.
独自のプログラミング言語の仕様を定め,字句解析・構文解析・意味解析・コード生成という流れでコンパイラを実装しました.
これで自作言語から自作アセンブリへの変換ができるようになりました.
自作PCを作る11 ~コンパイラを作る2~ (2026-07-11)
自作言語をより実用的にしていく回です.
配列と,関数の引数・返り値に対応しました.
あわせて入出力用の組み込み関数の仕様を見直し,CPU側にも必要な変更を加えています.
自作PCを作る12 ~リポジトリを整理しよう~ (2026-07-12)
扱うものが増えてきたので,開発環境そのものを整備します.
GitHubの組織を作って役割ごとにリポジトリを分割し,ghコマンドを導入しました.
issueを起票してから対応するという開発フローを定め,それを仕組みとして自動化しています.
自作PCを作る13 ~コンパイラを作る3~ (2026-07-25)
シェルを実装する準備として,言語の機能を拡充します.
構造体と構造体の配列に対応し,文字列操作のための組み込み関数を用意しました.
あわせて,ROMに格納できる命令数の上限も引き上げています.
自作PCを作る14 ~マルチパイプラインに対応する前編~ (2026-08-02)
1命令ずつ順番に処理していたCPUを高速化します.
ある命令を実行している間に,次の命令の読み込みと実行可否の判定まで済ませておく先読みの仕組みを入れました.
分岐命令やジャンプ命令についても同様に対応しています.
自作PCを作る15 ~シェルに対応する~ (2026-08-09)
コマンドを打ち込んで対話的に操作できるようにします.
PS側を単なる端末として動くように書き換え,入力の受け取りからコマンドの解析・実行までを自作CPU側のプログラムとして実装しました.
echoやhelpといった簡単なコマンドが動くようになっています.
自作PCを作る16 ~RAM上に簡易的なファイルシステムを構築する~ (2026-08-26)
シェルができたので,次はファイルという概念を導入します.
ファイルの作成・一覧表示・書き込み・読み出し・削除・名前の変更を実装しました.
ただしRAM上に置いているだけなので,電源を切ると内容は消えてしまいます.
自作PCを作る17 ~ストレージ上に簡易的なファイルシステムを構築する~ (2026-09-12)
電源を切ってもファイルが残るようにします.
自作CPUから触れるSDカードスロットが無いため電子工作で自作し,SPI通信でSDカードを読み書きできるようにしました.
RAM上のファイル情報をそのままSDカードへ保存し,起動時に読み戻すことで永続化を実現しています.
自作PCを作る18 ~自作プログラミング言語の機能拡充~ (2026-09-21)
OS作成のため必要になる機能拡充について行いました.
やったこととしては,定数への対応,ファイル分割への対応,符号なし変数への対応,スタックへの対応(これにより再帰関数呼び出しなどが可能になった),ポインタへの対応です.