!!! 書籍 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]