トップ 一覧 検索 ヘルプ RSS ログイン

TopPageの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!! 書籍
TinyCPUの内容が本になりました.[プログラムがコンピュータで動く仕組み
- ハードウェア記述言語・CPUアーキテクチャ・アセンブラ・コンパイラ超入門 -|https://www.coronasha.co.jp/np/isbn/9784339029222/]
TinyCPUの内容が本になりました.[プログラムがコンピュータで動く仕組み|https://www.coronasha.co.jp/np/isbn/9784339029222/]

!!!基礎から学ぶ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月号|http://www.cqpub.co.jp/dwm/contents/dwm0113i.htm],[全加算器をHDLで設計してみよう|http://www.cqpub.co.jp/dwm/contents/0113/dwm011301050.pdf]
,第2回,[2007年6月号|http://www.cqpub.co.jp/dwm/contents/dwm0115i.htm],[4ビット加算器を設計しよう|http://www.cqpub.co.jp/dwm/contents/0115/dwm011501280.pdf]
,第3回,[2007年8月号|http://www.cqpub.co.jp/dwm/contents/dwm0117i.htm],[マルチプレクサと算術論理演算回路|http://www.cqpub.co.jp/dwm/contents/0117/dwm011701290.pdf]
,第4回,[2007年10月号|http://www.cqpub.co.jp/dwm/Contents/dwm0119i.htm],[順序回路の設計フリップフロップとカウンタ|http://www.cqpub.co.jp/dwm/Contents/0119/dwm011901170.pdf]
,第5回,[2007年11月号|http://www.cqpub.co.jp/DWM/Contents/dwm0120i.htm],[ステートマシンの設計|http://www.cqpub.co.jp/DWM/Contents/0120/dwm012000870.pdf]
,第6回,[2008年1月号|http://www.cqpub.co.jp/DWM/Contents/dwm0122i.htm],[スタックの設計|http://www.cqpub.co.jp/DWM/Contents/0122/dwm012201150.pdf]
,第7回,[2008年3月号|http://www.cqpub.co.jp/DWM/Contents/dwm0124i.htm],[チャタリング除去回路とLCD制御回路|http://www.cqpub.co.jp/DWM/Contents/0124/dwm012401160.pdf]
,第8回,[2008年5月号|http://www.cqpub.co.jp/dwm/Contents/dwm0126i.htm],[分散RAMとブロックRAM|http://www.cqpub.co.jp/dwm/Contents/0126/dwm012601570.pdf]
,第9回,[2008年7月号|http://www.cqpub.co.jp/dwm/Contents/dwm0128i.htm],[バスと命令フェッチ回路|http://www.cqpub.co.jp/dwm/Contents/0128/dwm012801230.pdf]
,第10回,[2008年9月号|http://www.cqpub.co.jp/DWM/Contents/dwm0130i.htm],[CPUの設計(1)基本アーキテクチャの設計|http://www.cqpub.co.jp/DWM/Contents/0130/dwm013001490.pdf]
,第11回,[2008年11月号|http://www.cqpub.co.jp/DWM/Contents/dwm0132i.htm],[CPUの設計(2)Verilog HDLによる記述|http://www.cqpub.co.jp/DWM/Contents/0132/dwm013201190.pdf]
,第12回,[2008年12月号|http://www.cqpub.co.jp/DWM/Contents/dwm0133i.htm],[CPUの設計(3) FPGAによる動作確認|http://www.cqpub.co.jp/DWM/Contents/0133/dwm013300880.pdf]
,第13回,[2009年1月号|http://www.cqpub.co.jp/DWM/Contents/dwm0134i.htm],[アセンブラの設計|http://www.cqpub.co.jp/DWM/Contents/0134/dwm013400990.pdf]
,第14回,[2009年2月号|http://www.cqpub.co.jp/DWM/Contents/dwm0135i.htm],[コンパイラの設計(1)|http://www.cqpub.co.jp/DWM/Contents/0135/dwm013500930.pdf]
,第15回,[2009年3月号|http://www.cqpub.co.jp/dwm/Contents/dwm0136i.htm],[コンパイラの設計(2)|http://www.cqpub.co.jp/dwm/Contents/0136/dwm013601070.pdf]
!!!授業の資料
広島大学工学研究科情報工学専攻で行っている大学院(博士前期)の授業の配布資料を
公開します。
* 外国人も受講するので配布資料は英語です。
* 内容は、TINYCPU, TINYASM, TINYCの設計を行い、FPGAボード(Spartan-3AN Starter kit)を用いて動作させます。
* [[Course Materials]]

!!!CPUの概略
*完全なスタックアーキテクチャ
*データ16ビット,アドレス12ビット(4096ワード)
*サポートする命令:ロード,即値ロード,ストア,分岐,条件分岐,入出力(FPGAボード上のスイッチからの入力と,LCDへの16進表示)
*サポートする算術論理演算:加減乗算(+,-,*),符号反転(-),ビットシフト(>>,<<),ビットごとの論理和・論理積・XOR・否定(|,&,^,~),論理和・論理積・論理否定(||,&&,!),等号(=),不等号(!=),大小比較(<,>,<=,>=)
*1命令を実行するのに3クロックサイクル.ただしPUSH命令だけ4クロックサイクル(メモリの同期読み出しが行われるため)
{{ref_image cpu-arch.png}}

[[TINYCPUの命令セット]]
!!!ソースコード集
すべてのソースコードのライセンスは[GPL|http://www.opensource.jp/gpl/gpl.ja.html]に従うものとします.

Verilog HDLのソースコードはVerilog-95に準拠しています.

!!TINYCPUのVerilogHDL記述
TINYCPUとそのモジュールのVerilogHDL記述です.

,,言語,説明
,[[各種定数定義|defs.v]],Verilog HDL,TINYCPUで用いる各種定数の定義
,[[算術論理演算回路|alu.v]],Verilog HDL,TINYCPUの算術論理演算回路(ALU)
,[[カウンタ|counter.v]],Verilog HDL,TINYCPUのプログラムカウンタや命令レジスタに用いる
,[[ステートマシン|state.v]],Verilog HDL,TINYCPUの状態制御に用いる
,[[スタック|stack.v]],Verilog HDL,TINYCPUのデータスタックに用いる
,[[メモリ|ram.v]],Verilog HDL,TINYCPUのメモリ(ブロックRAM)
,[[TINYCPU|tinycpu.v]],Verilog HDL,TINYCPUの本体

!!周辺回路のVerilogHDL記述
TINYCPUをFPGAボード(Spartan3EまたはSpartan3Aスタータキット)で動作させるのに必要な回路をVerilog HDL記述です.

,,言語,説明
,[[チャタリング除去回路|chattering.v]],Verilog HDL,入力信号のチャタリングを除去する回路
,[[LCD制御回路|lcdctrl.v]],Verilog HDL,LCD制御回路
,[[TINYCPUのトップ回路|cpu_top.v]],Verilog HDL,TINYCPUのトップ回路

!!TINYCPUのトップ回路用ユーザ制約ファイル
TINYCPUをFPGAボード(Spartan3EまたはSpartan3Aスタータキット)で動作させるのに必要なユーザ制約ファイルです.
ピン割り当て(FPGAのピンとトップ回路cpu_topのポートの対応付け)を定義します.

,,言語,説明
,[[Spartan3E用UCF|cpu_top3e.ucf]],UCF,Spartan3Eスタータキット用UCF
,[[Spartan3A用UCF|cpu_top3a.ucf]],UCF,Spartan3Aスタータキット用UCF

!!アセンブラとコンパイラ
TINYCPUをターゲットとするアセンブラとコンパイラ

,,言語,説明
,[[アセンブラ|tinyasm]],Perl,TINYCPU用アセンブラ tinyasm
,[[字句解析|tinyc.l]],Flex,TINYCPU用コンパイラの字句解析 tinyc.l
,[[構文解析|tinyc.y]],Bison,TINYCPU用コンパイラの構文解析 tinyc.y
,[[メモリ形式への変換|mac2mem]],Perl,オブジェクト形式をメモリ形式に変換 mac2mem

!コンパイラの生成方法
以下の手順でコンパイラtinycが生成される
 $ bison -d -y tinyc.y
 $ flex tinyc.l
 $ gcc -o tinyc lex.yy.c y.tab.c

!!!C言語風プログラムのコンパイル・アセンブル例
[コラッツの問題|http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E3%81%AE%E5%95%8F%E9%A1%8C]の計算を行うプログラム

!!コラッツの問題
自然数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の命令セット
*高速版TINYCPUに配列の機能を追加したもの

!!!TIPS
*ブロックRAM
*分散RAM

!!!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|http://novella.mhhe.com/sites/0071311181/information_center_view0/] by Ian McLoughlin, Nanyang Technological University
This book introduces TINYCPU.

* [Kagoshima University|http://www.ibe.kagoshima-u.ac.jp/edu/expIII/interface/2011/index.php?TinyCPU]
* [Cornell|http://instruct1.cit.cornell.edu/courses/ece576/DE2/Stack_cpu.html]