570 likes | 711 Views
平成21年度卒業研究 16bitCPU の製作. 福永研究室 家村 光 唐木 靖雅 木次 遼太. 目次. 1.CPU 1.1 CPUとは 1.2 本研究で製作したCPUの構成 1.3 主な module の概要 2. I/O 2.1 I/O とは 2.2 RS232C 2.3 USBについて 3.アセンブラ 3.1 アセンブラとは 3.2 クイックソート 3.3 フィボナッチ数列 4.今後の展望. 1章 CPU.
E N D
平成21年度卒業研究16bitCPUの製作 福永研究室 家村 光 唐木 靖雅 木次 遼太
目次 • 1.CPU • 1.1 CPUとは • 1.2 本研究で製作したCPUの構成 • 1.3 主なmoduleの概要 • 2.I/O • 2.1 I/Oとは • 2.2 RS232C • 2.3 USBについて • 3.アセンブラ • 3.1 アセンブラとは • 3.2 クイックソート • 3.3 フィボナッチ数列 • 4.今後の展望
1.1 CPUとは • CPU(Central Processing Unit:中央処理装置)とは、プログラムにより各種演算・制御を行う装置のこと。 • CPUは、ALUなどの演算装置、データを一時記憶するレジスタ、メモリなどの記憶装置、周辺機器との入出力装置、CPU全体を制御する制御装置などで構成される。 ←Intel corei7 (画像引用:Naopy Hobby Land CPUコレクション http://www7a.biglobe.ne.jp/~naopy/cpu_sub.html#CPU)
1.2 本研究で製作したCPUの構成 • 今回はPICO-16をベースに製作。 • PICOとは、慶應義塾大学と東京工科大学で共同開発された実験教育用のCPUのシリーズで、PICO-16とは命令サイズが16bitのもの。 • 16bitの汎用レジスタを8つ持つregister-registerマシン。 • データの長さは16bitに固定。 • 動作クロックは48MHz • メモリは32767×8×2bit • 入力はシステムリセットとRS232C通信用の2種類 • 出力はRS232C通信用の1種類 • 31種類の命令を実行できる。
命令一覧 I 形式 (即値命令) R 形式 (レジスタ-レジスタ命令) J 形式 (ジャンプ命令)
命令形式 Type I Type R Type J
命令形式 Type I Type R Type J I形式(即値命令)はイミーディエイト命令、条件分岐命令などに使用する。OPが命令コード、Rdが使用するレジスタ、immediateが数値を意味する。 (例)ADDI 1,10; 00110 001 00001010
命令形式 Type I Type R Type J R形式(レジスタ-レジスタ命令)は算術演算・論理演算などに使用する。OPにはすべて0が入り、FUNCで命令を判断する。Rd、Rsが使用するレジスタ、FUNCが補助命令コードを意味する。 (例)AND 1,2; 00000 001 010 00010
命令形式 Type I Type R Type J J形式(ジャンプ命令)はジャンプ命令、サブルーチンコールなどに使用する。OPが命令コード、offsetがジャンプ距離を意味する。 (例)JMP 100; 01111 01100100
CPUの概略図 ホストコンピュータと通信するための入出力 (今回はRS232C) (画像引用:フリー素材の来夢来人 http://www.civillink.net/">フリー素材の来夢来人)
1.3 主なmoduleの概要 • Control Unit • ALU • Reg_file • Ir • pc
Control Unit • 全体の制御を行う。各ステージでそれぞれのモジュールに制御信号を出す。 ここまででreg_fileから使用するレジスタを読み出す。 プログラムの異常終了。 ここまででpcで指定されるアドレスの命令をirにセットする。 メモリアクセスを行う命令はここで実際のメモリのアクセスを行う。 HALT HALT IF1 IF1 IF2 IF2 RF1 RF1 RF2 RF2 EX1 EX1 EX2 EX2 プログラムの正常終了。 FIN FIN メモリアクセスを行う命令以外はここで処理を実行し次の処理へ。
IF1 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ 0
IF2 制御信号 00000_001_010_00110 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ 0000000101000110
00000_001_010_00110 RF1 制御信号 2 2 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ 0 0000000101000110
00000_001_010_00110 RF2 制御信号 制御信号 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ R[1] R[2] 2 0000000101000110
00000_001_010_00110 EX1 R[1]+R[2] 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ R[1] R[2] 2 0000000101000110
00000_001_010_00110 IF1 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ 2 0000000101000110
00000_001_010_00110 IF2 制御信号 0000000001010101 00010_011 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ 0000000101000110 0001001101010101
00010_011 RF1 制御信号 2 0000000001010101 4 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ 2 0001001101010101
00010_011 RF2 制御信号 制御信号 0000000001010101 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ R[3] 4 0000000101000110 0001001101010101
00010_011 EX1 0000000001010101 R[3]&100 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ R[3] 4 0000000101000110 0001001101010101
00010_011 IF1 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ 4 0001001101010101
00010_011 IF2 制御信号 01111 0000000001100100 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ 4 0001001101100100 0111100001100100
00010_011 RF1 2 0000000001100100 6 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ 4 0111100001100100
00010_011 RF2 制御信号 0000000001100100 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ 6 0111100001100100
00010_011 EX1 0000000001100100 106 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ 6 0111100001100100
ALU 命令 入力A 出力 入力B ・Control Unitからの命令信号によって 色々な演算が行われる。CPUでの演算 は全てここで行われる。
8つのレジスタを格納しているモジュールで、 Control Unitからの命令によって、データの書き込み、読み出しと、それを行うレジスタを指定する。 Reg file
メモリから送られてきたデータを適切な形に変換して、 Control Unitやsbus2に送る。 ir
LDHI命令がメモリから送られてきた例。他にも色々な変換がある。LDHI命令がメモリから送られてきた例。他にも色々な変換がある。 Control Unit
これから行う命令の番地を格納しておくレジスタ。命令毎に2ずつ増加する。ジャンプ命令がきた時には、ジャンプしたい数を加算する。これから行う命令の番地を格納しておくレジスタ。命令毎に2ずつ増加する。ジャンプ命令がきた時には、ジャンプしたい数を加算する。 PC 0 Pc(0) 2 Pc(2) 4 6 8 10 12 Pc(14) 14 16
2.1 I/Oとは • 入出力(Input/Output)の事.CPUが人間の脳なら、I/Oは口や手足に当たる.計算結果を外部に出力したい時や、外部からの数値をCPUに入力したい時に必要となる. • 具体例としてはキーボードやマウス等、実に様々なものが挙げられる. • 今回はRS232Cを製作した.後に、USB通信についても説明する.
2.2 RS232Cについて • シリアル通信方式の一つ.シリアル通信とはデータを1bitを順番に送っていく事である.シリアル通信とは別に、パラレル通信がある.後述するUSB通信もシリアルバスの1種である • 今回作成したCPUの入出力はこのRS232Cで行われる.8bit毎の通信を行う.
RS232Cのプロトコル(通信方式) • 初期状態としては1が流れている.これは新しいデータの流れがあるまで続く.新しいデータの流れが来たときには最初に0、最後に1を足してデータを挟み込んで入出力する. 下に具体例を示す. ・・・1 “0” 1 1 0 1 0 0 1 1 “1”・・・・・ データ 11001011というデータを送りたい時(“0”と“1”はデータじゃない) “1”以降データが来ない限りは1を出し続ける
RS232Cの実装(その1) • ホストPC→CPU(1bit → 16bit) rxという部品が担当する. 何もしていない状態の時0000_0000_0000_0000を出力. 8bit単位でデータを流すのだが今回のCPUは16bit単位で動くので、CPUに送る時には 0000_0010_dddd_dddd(dはデータ)の形で CPUにデータを流すようにしている. RS232C(tx) PC CPU 1bit 16bit
RS232Cの実装(その2) • CPU→ホストPC(16bit → 1bit) 8bit単位でデータを扱っているので、RS232Cはxxxx_xxxx_yyyy_yyyyという形のデータを受け取ったらyyyy_yyyyの部分しか流さない. データが来ない限り1を流し続ける.最初に0、最後に1をはさんでデータを流す.txという部品が担当する. RS232C(tx) PC CPU 1bit 16bit
RS232Cの実装(その3) • クロック分周 今回のCPUのクロック数は48Mhz(1秒間に48万回反転)しているのでRS232Cも同様なのだが、Tera Termでは9600bps(1秒間に9600bit送受信)設定になっている.ビットの幅はクロック数で決まるので、CPUのスピードでRS232Cが動いてもちゃんとしたデータをやり取り出来ない.なので、クロックを分周(遅らせる)して、RS232Cが9600bpsでも正常な動作が出来るようにする.clk_delayという部品が担当. 幅を合わせて正しく読める様にする!! 幅が正しくないと読み取れない!!
2.3 USBとは • Universal Serial Busの略.インテルが中心となり、マイクロソフト、コンパック(ヒューレット・パッカード)、日本電気(NEC)などが共同で仕様を決めている. • 1994年に上記の会社等が集まり規格を決め始めて以来、2010年3月4日現在1.0から始まったUSBのバージョンは3.0まである. • 類似独自規格の乱造乱立を防止する目的で特許が存在しているが、使用料が無料とされているのでマウスや携帯の充電器、玩具に至るまで様々な機器で使用されている.
USBのピン配置 差動型のデータ線の組(D+とD-)、電源(Vbus)、接地(GND)の四本のピンが配置されている.上の写真の右はシリーズA、左はシリーズBと言うコネクタである. (出典:通信用語の基礎知識 http://www.wdic.org/w/WDIC/USB%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF)
USBの利点 • USBハブを用いれば、最大127台まで同時に接続できる(各デバイスにアドレスを7bitで振り分けている). • 小型コネクタによる省スペース • USBポートから電源を取ることが出来る.更にコンピュータ側が自動的に処理を行うことにより、差し込むだけで使用できる(プラグ&プレイ、パワーマネージメント). • コンピュータの電源を入れたままでも付け外しを行える構造を備えている(活栓挿抜). USBのハブ.これを用いれば複数のUSB機器を繋いで操作することが出来る.(出典:http://buffalo-kokuyo.jp/products/peripheral/usbhub/bus-self/bsh4a03u3/index.html)
USBの転送速度 • USB1.1・・・フルスピード(12Mbps)・ロースピード(1.5Mbps)の2種類. • USB2.0・・・ハイスピード(480Mbps)を加え3種類. • USB3.0・・・スーパースピード(5Gbps)を加え4種類. RS232Cの転送速度は最大115.2kbps USBは遥かに速い!!
USBのプロトコル シリアルバス規格の一つ.プロトコルは NRZI(Non Return to Zero Invert)変調した 信号を使っている. 送りたいデータ・ビットが 0の時・・・・信号を反転させる 1の時・・・・信号はそのまま 0 1 1 0 0 0 1 データ 0 0 0 1 0 1 1 NRZI ※実際はデータにおいて1が6ビット続いたら、 スタッフビットと呼ばれる0を挿入する.
USB通信の流れ(バルクOUT転送の例) ホストPCからターゲットへのデータ転送を行っている. 出典:USBの基礎知識 http://www.kumikomi.net/archives/2007/03/22usb1.php?page=9
3.1 アセンブラとは • アセンブリ言語を機械語に変換する事をアセンブルすると言い、それを行うプログラムの事をアセンブラと言う。 // test.asm ・・・ ・・・ ・・・ ADDI 5,2; MV 0,5; SUBI 0,2; ・・・ ・・・ ・・・ // test.coe ・・・ ・・・ ・・・ 00110101,00000010, 00000000,01000001, 00111000,00000010, ・・・ ・・・ ・・・ アセンブラ 今回はC言語で作成!