Transcript PPT

平成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 8 7 6 5 4 3 2 1 0
Type I
OP
Rd
Type R
OP
Rd
Type J
OP
immediate
Rs
offset
FUNC
命令形式
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Type I
OP
Rd
Type R
OP
Rd
Type J
OP
immediate
Rs
FUNC
offset
I形式(即値命令)はイミーディエイト命令、条件分岐命令な
どに使用する。OPが命令コード、Rdが使用するレジスタ、
immediateが数値を意味する。
(例)ADDI 1,10;
00110 001 00001010
命令形式
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Type I
OP
Rd
Type R
OP
Rd
Type J
OP
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 8 7 6 5 4 3 2 1 0
Type I
OP
Rd
Type R
OP
Rd
Type J
OP
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よりも速い通信が見込まれる