平成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 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 形式 (ジャンプ命令) 命令コード 00000dddsss00000 00000dddsss00001 00000dddsss00010 00000dddsss00011 00000dddsss00100 00000dddsss00101 00000dddsss00110 00000dddsss00111 00000dddsss01000 00000dddsss01001 00000dddsss01010 00000dddsss01011 00000dddsss01100 00000dddsss01101 00110dddxxxxxxxx 00111dddxxxxxxxx 00010dddxxxxxxxx 00011dddxxxxxxxx 00100dddxxxxxxxx 01000dddxxxxxxxx 01001dddxxxxxxxx 01010dddxxxxxxxx 01011dddxxxxxxxx 01100dddxxxxxxxx 01101dddxxxxxxxx 01110ddduuuuuuu 01111xxxxxxxxxxx 10000xxxxxxxxxxx 10001xxxxxxxxxxx 11100dddxxxxxxxx 11101dddxxxxxxxx 命令 NOP MV d s AND d s OR d s XOR d s NOT d s ADD d s SUB d s LD d s ST d s LB d s SB d s SL d s SR d s ADDI d X SUBI d X ANDI d X ORI d X XORI d X JALR d BNEZ d X BEQZ d X BMI d X BPL d X JAL X JR d JMP X BIOR X BIOW X LDLI d X LDHI d X 説明 何もしない sの値をdにコピーする d & sの値をdに格納 d | sの値をdに格納 d ^ sの値をdに格納 ~sをdに格納 d + sをdに格納 d - sをdに格納 sで示す番地の中身をdに格納 dで示す番地にsを格納 sで示す番地の中身をsの下位8bitに格納 dで示す番地にsの下位8bitを格納 sの1bit左シフトをdに格納 sの1bit右シフトをdに格納 d + Xをdに格納 d - Xをdに格納 dとX(上位は1)の論理積をdに格納 dとX(上位は0)の論理和をdに格納 dとX(上位は0)の排他的論理和をdに格納 R7に戻り番地を格納してdへ絶対分岐 d ≠ 0ならば相対分岐 d = 0ならば相対分岐 d < 0ならば相対分岐 d ≧0ならば相対分岐 R7に戻り番地を格納してdへ相対分岐 dの内容に絶対分岐 無条件相対分岐 RS232Cが読み出し可能な状態なら相対分岐 RS232Cが書き込み可能な状態なら相対分岐 Xをdの下8bitに格納(符号拡張) Xをdの上8bitに格納(下位は0) 命令形式 15 14 13 12 11 10 9 Type I OP Rd Type R OP Rd Type J OP 8 7 6 5 4 3 2 1 immediate Rs offset FUNC 0 命令形式 15 14 13 12 11 10 9 8 7 Type I OP Rd Type R OP Rd Type J OP 6 5 4 3 2 1 0 immediate Rs FUNC offset I形式(即値命令)はイミーディエイト命令、条件分岐命令な どに使用する。OPが命令コード、Rdが使用するレジスタ、 immediateが数値を意味する。 (例)ADDI 1,10; 00110 001 00001010 命令形式 15 14 13 12 11 10 9 Type I OP Rd Type R OP Rd Type J OP 8 7 6 5 4 3 2 1 0 immediate Rs FUNC offset R形式(レジスタ-レジスタ命令)は算術演算・論理演算など に使用する。OPにはすべて0が入り、FUNCで命令を判断 する。Rd、Rsが使用するレジスタ、FUNCが補助命令コード を意味する。 (例)AND 1,2; 00000 001 010 00010 命令形式 15 14 13 12 11 10 9 Type I OP Rd Type R OP Rd Type J OP 8 7 6 5 4 3 2 1 0 immediate Rs FUNC offset 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にセットする。 IF1 IF2 HALT RF1 プログラムの正常終了。 から使用するレジス タを読み出す。 メモリアクセスを行う命 令はここで実際のメモリ のアクセスを行う。 RF2 FIN EX1 EX2 メモリアクセスを行う命 令以外はここで処理を実 行し次の処理へ。 IF1 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ 0 制 御 信 号 00000_001_010_00110 IF2 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 制 御 信 号 R[1] R[2] 2 0000000101000110 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ 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 制 御 信 号 00010_011 0000000001010101 IF2 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 制 御 制 信 御 号 0000000001010101 信 号 R[3] 4 0001001101010101 0000000101000110 RF2 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ 00010_011 EX1 0000000001010101 R[3]&100 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ R[3] 4 0001001101010101 0000000101000110 00010_011 IF1 0 : 0000000101000110 (ADD 1,2) 2 : 0001001101100100 (ANDI 3,100) 4 : 0111100001100100 (JMP 100) ・・・ ・・・ ・・・ 4 0001001101010101 00010_011 制 御 信 01111 0000000001100100 号 IF2 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 制 御 信 0000000001100100 号 RF2 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 命令 0000 0001 0010 0011 0100 0101 1100 1101 1110 1111 出力 THA THB AND OR XOR NOT SHL SHR ADD SUB A B A&B A|B A^B ~B B<<1 B>>1 A+B A-B 命令 入力A ALU 入力B ・Control Unitからの命令信号によって 色々な演算が行われる。CPUでの演算 は全てここで行われる。 出力 ALU Reg file SEL reg1 reg2 8つのレジスタを格納してい るモジュールで、 Control Unitからの命令によって、 データの書き込み、読み出 しと、それを行うレジスタを 指定する。 Reg file 01_001_010の命令の場合 R0 R1 reg1 R2 R3 R4 reg2 R5 R6 R7 10_100_000の命令の場合 4 R0 R1 R2 R3 R4 R5 R6 R7 ir メモリから送られてきた データを適切な形に変 換して、 Control Unit やsbus2に送る。 ir Control Unit sbus2 11101 011 ir 00000001_00000000 00000001_00000000 00000001 11101_011_00000001 LDHI命令がメモリから送られてきた例。 他にも色々な変換がある。 PC これから行う命令の番 地を格納しておくレジス タ。命令毎に2ずつ増 加する。ジャンプ命令 がきた時には、ジャンプ したい数を加算する。 Pc(0) Pc(2) Pc(14) 0 2 4 6 8 10 12 14 16 pc 2章 I/O 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にデータを流すようにしている. PC RS232C(tx) 1bit 16bit CPU RS232Cの実装(その2) CPU→ホストPC(16bit → 1bit) 8bit単位でデータを扱っているので、RS232Cは xxxx_xxxx_yyyy_yyyyという形のデータを受け取ったら yyyy_yyyyの部分しか流さない. データが来ない限り1を流し続ける.最初に0、最後に1をはさ んでデータを流す.txという部品が担当する. PC RS232C(tx) 1bit 16bit CPU 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%E 3%82%BF) USBの利点 USBハブを用いれば、最大127台まで同時に接続できる(各 デバイスにアドレスを7bitで振り分けている). 小型コネクタによる省スペース USBポートから電源を取ることが出来る.更にコンピュータ側 が自動的に処理を行うことにより、差し込むだけで使用でき る(プラグ&プレイ、パワーマネージメント). コンピュータの電源を入れたままでも付け外しを行える構造 を備えている(活栓挿抜). USBのハブ.これを用いれば複数のUSB機器を繋いで 操作することが出来る.(出典:http://buffalokokuyo.jp/products/peripheral/usbhub/busself/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章 アセンブラ 3.1 アセンブラとは アセンブリ言語を機械語に変換する事をアセンブルすると言 い、それを行うプログラムの事をアセンブラと言う。 // test.asm ・・・ ・・・ ・・・ ADDI 5,2; MV 0,5; SUBI 0,2; ・・・ ・・・ ・・・ アセンブラ // test.coe ・・・ ・・・ ・・・ 00110101,00000010, 00000000,01000001, 00111000,00000010, ・・・ ・・・ ・・・ 今回はC言語で作成! 3.2 クイックソート データ列を順番に並べ替えるソートアルゴリズムの一つ。 単 純かつ高速なソートとして知られている。 アルゴリズム 1、データ列の中から基準値(今回は先頭)をひとつ選ぶ。 2、基準値以上の数を先頭から、基準値未満の数を末尾からひとつず つ探索していく。 3.該当する数同士を入れ替える。 4、再び探索を開始し、お互いの探索がぶつかるか交差するまで続ける。 5、4の位置でデータ列を二つにわけて、それぞれのグループに対して1 から繰り返す。 6、以上を再帰的に行う。 今回は3、5、1、4、2をソートする。その様子 は以下のようになっている。 先頭ポインタ 末尾ポインタ 基準は3 探索(終了)(3以上) 交換 (3以上) 探索 (3未満) (3以上)(3未満) 探索終了 交換 交差 分割 先頭 末尾 基準値は2 探索(終了) 交換 交差 分割 (2以上)(2未満) 基準値は5 同様の作業を行っていく 3.3 フィボナッチ数列 F(n) = F(n-1) + F(n-2) (n > 2) F(1) = 1,F(2) = 1 で定義される数列。フィボナッチ数列を表示す るプログラムは、n=1からメモリに再帰的に数 を格納するようになっている。今回は要素数 12の数列を表示する。 クイックソートとフィボナッチ数列の表示をFP GAを用いて実演する。 4章 今後の展望 4.今後の展望 プログラムのロード機能 プログラムを読み込ませるたびに毎回メモリを書き換える 必要がなくなる USBの実装 RS232Cよりも速い通信が見込まれる
© Copyright 2024 ExpyDoc