計算機構成 第 4 回 アキュムレータマシン テキスト第 3 章
DESCRIPTION
計算機構成 第 4 回 アキュムレータマシン テキスト第 3 章. 情報工学科 天野英晴. Y. S. A. B. メモリ付きのデータパス. 0番地に X 、 1 番地に Y が入っている ( SL X ) + ( SL Y )を計算して 2 番地に 格納せよ we com Address 0 001 00000000 0 100 00000000 1 000 00000010 0 001 00000001 0 100 00000000 0 110 00000010 - PowerPoint PPT PresentationTRANSCRIPT
計算機構成 第 4 回アキュムレータマシン
テキスト第 3 章情報工学科天野英晴
メモリ付きのデータパス
A B
YS
ACC
…
we
Address
clk
clk
com
0番地に X 、 1 番地に Y が入っている( SL X ) + ( SL Y )を計算して 2 番地に格納せよ
we com Address 0 001 00000000 0 100 00000000 1 000 00000010 0 001 00000001 0 100 00000000 0 110 00000010 1 000 00000010
命令(制御信号)を各クロックで外から与える必要があった。
アキュムレータマシン
A B
YS
ACC
…
weclk
clk
com
…
PC
+1
clk
命令メモリ
命令
命令メモリから命令を読み出し(フェッチ: Fetch)実行( Execution) する
命令の実行
A B
YS
ACC
…
weclk
clk
com
…
PC
+1
clk
命令メモリ
命令
0番地に X 、 1 番地に Y が入っているX+Y を計算して 2 番地に格納せよ
we com Address 0 001 00000000 0 番地 0 110 00000001 1 番地 1 000 00000010 2 番地
0 001 00000000
0
0
001THB
00000000
1
命令の実行
A B
YS
ACC
…
weclk
clk
com
…
PC
+1
clk
命令メモリ
命令
0番地に X 、 1 番地に Y が入っているX+Y を計算して 2 番地に格納せよ
we com Address 0 001 00000000 0 番地 0 110 00000001 1 番地 1 000 00000010 2 番地
0 110 00000001
1
0
110ADD
00000001
2+
命令の実行
A B
YS
ACC
…
we=1clk
clk
com
…
PC
+1
clk
命令メモリ
命令
0番地に X 、 1 番地に Y が入っているX+Y を計算して 2 番地に格納せよ
we com Address 0 001 00000000 0 番地 0 110 00000001 1 番地 1 000 00000010 2 番地
1 000 00000010
2
1
000THA
00000010
3
分岐命令の導入• ACC の内容によって PC の内容を変更する
– 制御命令:分岐( Branch) と呼ぶ
BEZ X Branch Equal Zero if ACC==0 PC←X1001XXXXXXXX →opcode は適当に決めた( 例) 100100000001 ACC が 0 ならば PC は 1 にな
る→次は 1 番地の命令を実行→ 1 番地に「飛ぶ」BNZ X Branch Not equal Zero if ACC!=0 PC←X
1010XXXXXXXX→opcode は適当に決めた( 例) 101000000001 ACC が 0 でなければ PC は 1 に
なる→次は 1 番地の命令を実行→ 1 番地に「飛ぶ」
オペランドは飛び先(命令メモリの番地)を示す:今までの命令と全く違うことに注意!
分岐命令によるアルゴリズムの実行
答←答 +m
n ← n -1
n=0?No
Yes
0001 00000000 LD 0 0110 00000001 ADD 1 1000 00000010 ST 0 0001 00000010 LD 2 0111 00000011 SUB 3 1000 00000010 ST 2 1010 00000000 BNZ 0 1001 00000111 BEZ 7
0 番地 03 番地 1
1 番地 m2 番地 n
ここは停止( ダイナミックストップ)
繰り返しによりアルゴリズムの実行が可能→ プログラム格納型( Stored Program) 方式
A B
YS
ACC
…
we=0clk
clk
com
…
PC
+1
clk
命令メモリ
命令
0001 00000000 LD 0 0110 00000001 ADD 1 1000 00000010 ST 0 0001 00000010 LD 2 0111 00000011 SUB 3 1000 00000010 ST 2 1010 00000000 BNZ 0 1001 00000111 BEZ 7
0001 00000000
0
0
001THA
00000000
1
0231
A B
YS
0
…
we=0clk
clk
com
…
PC
+1
clk
命令メモリ
命令
0001 00000000 LD 0 0110 00000001 ADD 1 1000 00000010 ST 0 0001 00000010 LD 2 0111 00000011 SUB 3 1000 00000010 ST 2 1010 00000000 BNZ 0 1001 00000111 BEZ 7
0110 00000001
1
0
110ADD
00000001
2
0231
A B
YS
2
…
we=1clk
clk
com
…
PC
+1
clk
命令メモリ
命令
0001 00000000 LD 0 0110 00000001 ADD 1 1000 00000000 ST 0 0001 00000010 LD 2 0111 00000011 SUB 3 1000 00000010 ST 2 1010 00000000 BNZ 0 1001 00000111 BEZ 7
1000 00000000
2
1
110ADD
00000000
3
0231
A B
YS
2
…
we=0clk
clk
com
…
PC
+1
clk
命令メモリ
命令
0001 00000000 LD 0 0110 00000001 ADD 1 1000 00000000 ST 0 0001 00000010 LD 2 0111 00000011 SUB 3 1000 00000010 ST 2 1010 00000000 BNZ 0 1001 00000111 BEZ 7
0001 00000010
3
0
001THB
00000010
4
2231
A B
YS
3
…
we=0clk
clk
com
…
PC
+1
clk
命令メモリ
命令
0001 00000000 LD 0 0110 00000001 ADD 1 1000 00000010 ST 0 0001 00000010 LD 2 0111 00000011 SUB 3 1000 00000010 ST 2 1010 00000000 BNZ 0 1001 00000111 BEZ 7
0111 00000011
4
0
111SUB
00000011
5
2231
A B
YS
2
…
we=1clk
clk
com
…
PC
+1
clk
命令メモリ
命令
0001 00000000 LD 0 0110 00000001 ADD 1 1000 00000000 ST 0 0001 00000010 LD 2 0111 00000011 SUB 3 1000 00000010 ST 2 1010 00000000 BNZ 0 1001 00000111 BEZ 7
1000 00000010
5
1
000ST
00000010
6
0231
A B
YS
2
…
we=0clk
clk
com
…
PC
+1
clk
命令メモリ
命令
0001 00000000 LD 0 0110 00000001 ADD 1 1000 00000000 ST 0 0001 00000010 LD 2 0111 00000011 SUB 3 1000 00000010 ST 2 1010 00000000 BNZ 0 1001 00000111 BEZ 7
1010 00000000
6
0
---
7
0231
en=0
=0?Dec.
00000000
operand
1010
BNZ 命令の実行
マルチプレクサ
データを選択
命令デコーダ1010 を検出
ACC=0 の結果でマルチプレクサを制
御
マルチプレクサと命令デコーダ
A BY
S
S=0 : Y ←AS=1 : Y←B
Y = S?A : B;条件構文(マルチプレクサ文)
命令デコーダ
opcode
=0?ACC
zero PC+1 operand
PC
opcode==1001 &zero |opcode==1010&~zero
ACC の en 信号メモリの we 信号もついでに制御させてしまおう!
アキュムレータマシンの Verilog 記述
入出力とレジスタ、ワイヤの宣言`include “def.h”module accum( input clk, input rst_n, input [`OPCODE_W-1:0] opcode, input[`ADDR_W-1:0] operand, input[`DATA_W-1:0] ddatain, output we, output [`ADDR_W-1:0] pcout, output [`DATA_W-1:0] accout);reg[`DATA_W-1:0] accum;reg[`ADDR_W-1:0] pc;wire [`DATA_W-1:0] alu_y;wire op_st, op_bez, op_bnz;
命令メモリ
データメモリ
命令メモリのアドレス
命令のデコード信号
アキュムレータマシンの Verilog 記述
デコードと入出力、 ALU の接続assign op_st = opcode== `OP_ST; assign op_bez = opcode== `OP_BEZ;assign op_bnz = opcode==`OP_BNZ;
assign we = op_st;assign accout = accum;assign pcout = pc;alu alu_1(.a(accum), .b(datain), .s(opcode[`SEL_W-1:0], .y(alu_y));
def.h
`define OP_ST 4’b1000`define OP_BEZ 4’b1001`define OP_BNZ 4’b1010…
アキュムレータマシンの Verilog 記述
レジスタの制御always @(posedge clk or negedge rst_n) begin if(!rst_n) pc <=0; else if (op_bez & (accum==0) | op_bnz & (accum!=0)) pc <= oprand; else pc <= pc+1; end
always @(posedge clk or negedge rst_n) begin if(rst_n) accum <=0; else if(!op_st & !op_bnz & !op_bnz) accum <= alu_y; end
endmodule
pc の制御
acc の制御
テストベンチでのメモリの記述reg [`DATA_W-1:0] dmem[0:`DEPTH-1];
reg [`INST_W-1:0] imem[0:`DEPTH-1];
….
assign {opcode, operand} = imem[pcout];
….
initial begin
….
$readmemh(“dmem.dat”,dmem);
$readmemb(“imem.dat”,imem);
0001_000000000110_000000011000_000000000001_000000100111_000000111000_00000010…
imem.dat:12bit
0000000200030001…
dmem.dat:16bit
演習課題
演習1– A を 0 番地、 B を 1 番地のデータとして (SR
A) + (SR B) のデータを 2 番地にしまうプログラムを実行せよ
• 48 ページ演習 3-5– 1番地に X が格納されている。 X+(X-1)+(X-
2)+…2+1 を計算するプログラムを実行せよ• 提出物は imem.dat