- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!基礎から学ぶ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用アセンブラ
,[[字句解析|tinyc.l]],Flex,TINYCPU用コンパイラの字句解析
,[[構文解析|tinyc.y]],Bison,TINYCPU用コンパイラの構文解析
,[[メモリ形式への変換|mac2mem]],Perl,オブジェクト形式をメモリ形式に変換
,[[アセンブラ|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]