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秒