トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

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クロックサイクル(メモリの同期読み出しが行われるため)

TINYCPUの命令セット

ソースコード集

すべてのソースコードのライセンスは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

高速版TINYCPU

  • すべての命令を1クロックサイクルで実行
  • TINYCPUと完全互換
  • デュアルポートブロックRAMを使用

高機能MINICPU

高機能MINICPU
MINICPUの命令セット

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

This book introduces TINYCPU.

最終更新時間:2024年03月16日 13時00分14秒