TopPage
書籍
TinyCPUの内容が本になりました.プログラムがコンピュータで動く仕組み
基礎から学ぶVerilogHDL & FPGA設計(2007年4月〜2009年3月連載)
FPGAボード(Spartan-3Eスタータキット,またはSpartan-3Aスタータキット)で動作するCPUをVerilog HDLで設計します.
さらに,そのCPUをターゲットとするアセンブラとコンパイラも設計します.
ソースコードはかなり簡潔に書かれており,コード量がかなり少ない(約250行程度)にもかかわらず,必要最低限の機能をもったCPUがFPGAボードで正しく動作します.
ソースコードの簡潔さに重点をおいているので,回路が使用するリソースや効率化は重視していません.
論理合成ツールの安定性とVerilog HDLの基本構文のみ用いることを考慮し,ソースコードは原則Verilog-95に準拠しています.
Verilog 2001などでも論理合成可能です.アセンブラはPerl,コンパイラはflexとbisonで記述されており,きわめて少ないコード量で正しく処理することができます.
| 回 | 号 | タイトル |
|---|---|---|
| 第1回 | 2007年4月号 | 全加算器をHDLで設計してみよう |
| 第2回 | 2007年6月号 | 4ビット加算器を設計しよう |
| 第3回 | 2007年8月号 | マルチプレクサと算術論理演算回路 |
| 第4回 | 2007年10月号 | 順序回路の設計フリップフロップとカウンタ |
| 第5回 | 2007年11月号 | ステートマシンの設計 |
| 第6回 | 2008年1月号 | スタックの設計 |
| 第7回 | 2008年3月号 | チャタリング除去回路とLCD制御回路 |
| 第8回 | 2008年5月号 | 分散RAMとブロックRAM |
| 第9回 | 2008年7月号 | バスと命令フェッチ回路 |
| 第10回 | 2008年9月号 | CPUの設計(1)基本アーキテクチャの設計 |
| 第11回 | 2008年11月号 | CPUの設計(2)Verilog HDLによる記述 |
| 第12回 | 2008年12月号 | CPUの設計(3) FPGAによる動作確認 |
| 第13回 | 2009年1月号 | アセンブラの設計 |
| 第14回 | 2009年2月号 | コンパイラの設計(1) |
| 第15回 | 2009年3月号 | コンパイラの設計(2) |
授業の資料
広島大学工学研究科情報工学専攻で行っている大学院(博士前期)の授業の配布資料を
公開します。
- 外国人も受講するので配布資料は英語です。
- 内容は、TINYCPU, TINYASM, TINYCの設計を行い、FPGAボード(Spartan-3AN Starter kit)を用いて動作させます。
- Course Materials
CPUの概略
- 完全なスタックアーキテクチャ
- データ16ビット,アドレス12ビット(4096ワード)
- サポートする命令:ロード,即値ロード,ストア,分岐,条件分岐,入出力(FPGAボード上のスイッチからの入力と,LCDへの16進表示)
- サポートする算術論理演算:加減乗算(+,-,*),符号反転(-),ビットシフト(>>,<<),ビットごとの論理和・論理積・XOR・否定(|,&,^,~),論理和・論理積・論理否定(||,&&,!),等号(=),不等号(!=),大小比較(<,>,<=,>=)
- 1命令を実行するのに3クロックサイクル.ただしPUSH命令だけ4クロックサイクル(メモリの同期読み出しが行われるため)
ソースコード集
すべてのソースコードのライセンスはGPLに従うものとします.
Verilog HDLのソースコードはVerilog-95に準拠しています.
TINYCPUのVerilogHDL記述
TINYCPUとそのモジュールのVerilogHDL記述です.
| 言語 | 説明 | |
|---|---|---|
| 各種定数定義 | Verilog HDL | TINYCPUで用いる各種定数の定義 |
| 算術論理演算回路 | Verilog HDL | TINYCPUの算術論理演算回路(ALU) |
| カウンタ | Verilog HDL | TINYCPUのプログラムカウンタや命令レジスタに用いる |
| ステートマシン | Verilog HDL | TINYCPUの状態制御に用いる |
| スタック | Verilog HDL | TINYCPUのデータスタックに用いる |
| メモリ | Verilog HDL | TINYCPUのメモリ(ブロックRAM) |
| TINYCPU | Verilog HDL | TINYCPUの本体 |
周辺回路のVerilogHDL記述
TINYCPUをFPGAボード(Spartan3EまたはSpartan3Aスタータキット)で動作させるのに必要な回路をVerilog HDL記述です.
| 言語 | 説明 | |
|---|---|---|
| チャタリング除去回路 | Verilog HDL | 入力信号のチャタリングを除去する回路 |
| LCD制御回路 | Verilog HDL | LCD制御回路 |
| TINYCPUのトップ回路 | Verilog HDL | TINYCPUのトップ回路 |
TINYCPUのトップ回路用ユーザ制約ファイル
TINYCPUをFPGAボード(Spartan3EまたはSpartan3Aスタータキット)で動作させるのに必要なユーザ制約ファイルです.
ピン割り当て(FPGAのピンとトップ回路cpu_topのポートの対応付け)を定義します.
| 言語 | 説明 | |
|---|---|---|
| Spartan3E用UCF | UCF | Spartan3Eスタータキット用UCF |
| Spartan3A用UCF | UCF | Spartan3Aスタータキット用UCF |
アセンブラとコンパイラ
TINYCPUをターゲットとするアセンブラとコンパイラ
| 言語 | 説明 | |
|---|---|---|
| アセンブラ | Perl | TINYCPU用アセンブラ tinyasm |
| 字句解析 | Flex | TINYCPU用コンパイラの字句解析 tinyc.l |
| 構文解析 | Bison | TINYCPU用コンパイラの構文解析 tinyc.y |
| メモリ形式への変換 | Perl | オブジェクト形式をメモリ形式に変換 mac2mem |
コンパイラの生成方法
以下の手順でコンパイラtinycが生成される
$ bison -d -y tinyc.y $ flex tinyc.l $ gcc -o tinyc lex.yy.c y.tab.c
C言語風プログラムのコンパイル・アセンブル例
コラッツの問題の計算を行うプログラム
コラッツの問題
自然数nが与えられたときに
- nが偶数のときnを2で割る
- nが奇数のときnに3を掛けて1を足す
という操作をnが1になるまで繰り返す.
コラッツの問題とは「あらゆるnについて有限回の操作でnが1になるかどうか?」という未解決問題です.
C言語風プログラム
nを入力して1になるまで操作を繰り返します.
n=in;
while(n>1){
out(n);
if(n&1){
n= n*3+1;
} else {
n = n>>1;
}
}
out(n);
halt;
int n;
コンパイル結果
IN
POP n
_001T:
PUSH n
PUSHI 1
GT
JZ _001F
PUSH n
OUT
PUSH n
PUSHI 1
BAND
JZ _002F
PUSH n
PUSHI 3
MUL
PUSHI 1
ADD
POP n
JMP _002T
_002F:
PUSH n
PUSHI 1
SHR
POP n
_002T:
JMP _001T
_001F:
PUSH n
OUT
HALT
n: 0
アセンブル結果
*** LABEL LIST ***
_001F 018
_001T 002
_002F 013
_002T 017
n 01B
*** MACHINE PROGRAM ***
000:D000 IN
001:301B POP n
_001T:
002:201B PUSH n
003:1001 PUSHI 1
004:F00E GT
005:5018 JZ _001F
006:201B PUSH n
007:E000 OUT
008:201B PUSH n
009:1001 PUSHI 1
00A:F005 BAND
00B:5013 JZ _002F
00C:201B PUSH n
00D:1003 PUSHI 3
00E:F002 MUL
00F:1001 PUSHI 1
010:F000 ADD
011:301B POP n
012:4017 JMP _002T
_002F:
013:201B PUSH n
014:1001 PUSHI 1
015:F004 SHR
016:301B POP n
_002T:
017:4002 JMP _001T
_001F:
018:201B PUSH n
019:E000 OUT
01A:0000 HALT
01B:0000 n: 0
メモリ形式へ変換
mem[12'h000] = 16'hD000; // IN
mem[12'h001] = 16'h301B; // POP n
//_001T:
mem[12'h002] = 16'h201B; // PUSH n
mem[12'h003] = 16'h1001; // PUSHI 1
mem[12'h004] = 16'hF00E; // GT
mem[12'h005] = 16'h5018; // JZ _001F
mem[12'h006] = 16'h201B; // PUSH n
mem[12'h007] = 16'hE000; // OUT
mem[12'h008] = 16'h201B; // PUSH n
mem[12'h009] = 16'h1001; // PUSHI 1
mem[12'h00A] = 16'hF005; // BAND
mem[12'h00B] = 16'h5013; // JZ _002F
mem[12'h00C] = 16'h201B; // PUSH n
mem[12'h00D] = 16'h1003; // PUSHI 3
mem[12'h00E] = 16'hF002; // MUL
mem[12'h00F] = 16'h1001; // PUSHI 1
mem[12'h010] = 16'hF000; // ADD
mem[12'h011] = 16'h301B; // POP n
mem[12'h012] = 16'h4017; // JMP _002T
//_002F:
mem[12'h013] = 16'h201B; // PUSH n
mem[12'h014] = 16'h1001; // PUSHI 1
mem[12'h015] = 16'hF004; // SHR
mem[12'h016] = 16'h301B; // POP n
//_002T:
mem[12'h017] = 16'h4002; // JMP _001T
//_001F:
mem[12'h018] = 16'h201B; // PUSH n
mem[12'h019] = 16'hE000; // OUT
mem[12'h01A] = 16'h0000; // HALT
mem[12'h01B] = 16'h0000; // n: 0
高速版TINYCPU
- すべての命令を1クロックサイクルで実行
- TINYCPUと完全互換
- デュアルポートブロックRAMを使用
高機能MINICPU
- 高速版TINYCPUに配列の機能を追加したもの
TIPS
Publications
- Koji Nakano, Kensuke Kawakami, Koji Shigemoto, Yuki Kamada, Yasuaki Ito, A Tiny Processing System for Education and Small Embedded Systems on the FPGAs, Proc. of Embedded Software Optimization (ESO), pp. 472-479, Dec., 2008.
- Koji Nakano, Yasuaki Ito Processor, Assembler, and Compiler Design Education using an FPGA, Proc. of International Conference on Parallel and Distributed Systems (ICPADS), pp. 723-728, Dec., 2008.
LINK
- Computer Architecture by Ian McLoughlin, Nanyang Technological University
This book introduces TINYCPU.
最終更新時間:2024年03月16日 13時00分14秒