ディジタル回路 第1回 ガイダンス、CMOSの基本回路

計算機構成 第4回
アキュムレータマシン
テキスト第3章
情報工学科
天野英晴
メモリ付きのデータパス
0番地にX、1番地にYが入っている
(SL X)+(SL Y)を計算して2番地に
格納せよ
Y
com
S
A
clk
B
we com Address
0 001 00000000
0 100 00000000
1 000 00000010
0 001 00000001
0 100 00000000
0
110 00000010
1
000 00000010
ACC
Address
命令(制御信号)を各クロックで外から
与える必要があった。
…
clk
we
clk
アキュムレータマシン
命令メモリから命令を
読み出し(フェッチ:Fetch)
実行(Execution)する
1
com
S Y
+
A
B
PC
clk
命令
ACC
…
…
命令メモリ
clk
we
clk
0番地にX、1番地にYが入っている
X+Yを計算して2番地に格納せよ
we com
0 001
0 110
1 000
1
Address
00000000
00000001
00000010
命令の実行
0番地
1番地
2番地
com
001
THB
+
1
S Y
A
B
PC
clk
0
ACC
命令
0
001
00000000
00000000
…
…
0
命令メモリ
clk
we
clk
0番地にX、1番地にYが入っている
X+Yを計算して2番地に格納せよ
we com
0 001
0 110
1 000
1
Address
00000000
00000001
00000010
命令の実行
0番地
1番地
2番地
com
110
ADD
+
2
S Y
+
A
B
PC
clk
1
ACC
命令
0
110
00000001
00000001
…
…
0
命令メモリ
clk
we
clk
0番地にX、1番地にYが入っている
X+Yを計算して2番地に格納せよ
we com
0 001
0 110
1 000
1
Address
00000000
00000001
00000010
命令の実行
0番地
1番地
2番地
com
000
THA
+
3
S Y
A
B
PC
clk
2
ACC
命令
1
000
00000010
00000010
…
…
1
命令メモリ
clk
we=1
分岐命令の導入
• ACCの内容によってPCの内容を変更する
– 制御命令:分岐(Branch)と呼ぶ
BEZ X Branch Equal Zero if ACC==0 PC←X
1001XXXXXXXX →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番地に「飛ぶ」
オペランドは飛び先(命令メモリの番地)を示す:今までの命令と全く違うことに注意!
分岐命令によるアルゴリズムの実行
0001 00000000
0110 00000001
1000 00000010
0001 00000010
0111 00000011
1000 00000010
1010 00000000
1001 00000111
答←答+m
n ← n -1
No
n=0?
ここは停止
(ダイナミック 0番地 0
3番地 1
ストップ)
Yes
繰り返しによりアルゴリズムの実行が可能
→ プログラム格納型(Stored Program)方式
1番地 m
2番地 n
LD 0
ADD 1
ST 0
LD 2
SUB 3
ST 2
BNZ 0
BEZ 7
clk
1
0001 00000000
0110 00000001
1000 00000010
0001 00000010
0111 00000011
1000 00000010
1010 00000000
1001 00000111
com
001
THA
+
1
S Y
A
B
PC
clk
0
ACC
命令
0001 00000000
0
2
3
1
00000000
…
…
0
命令メモリ
clk
we=0
LD 0
ADD 1
ST 0
LD 2
SUB 3
ST 2
BNZ 0
BEZ 7
clk
1
0001 00000000
0110 00000001
1000 00000010
0001 00000010
0111 00000011
1000 00000010
1010 00000000
1001 00000111
com
110
ADD
+
2
S Y
A
B
PC
clk
1
0
命令
0110 00000001
0
2
3
1
00000001
…
…
0
命令メモリ
clk
we=0
LD 0
ADD 1
ST 0
LD 2
SUB 3
ST 2
BNZ 0
BEZ 7
clk
1
0001 00000000
0110 00000001
1000 00000000
0001 00000010
0111 00000011
1000 00000010
1010 00000000
1001 00000111
com
110
ADD
+
3
S Y
A
B
PC
clk
2
2
命令
1000 00000000
0
2
3
1
00000000
…
…
1
命令メモリ
clk
we=1
LD 0
ADD 1
ST 0
LD 2
SUB 3
ST 2
BNZ 0
BEZ 7
clk
1
0001 00000000
0110 00000001
1000 00000000
0001 00000010
0111 00000011
1000 00000010
1010 00000000
1001 00000111
com
001
THB
+
4
S Y
A
B
PC
clk
3
2
命令
0001 00000010
2
2
3
1
00000010
…
…
0
命令メモリ
clk
we=0
LD 0
ADD 1
ST 0
LD 2
SUB 3
ST 2
BNZ 0
BEZ 7
clk
1
0001 00000000
0110 00000001
1000 00000010
0001 00000010
0111 00000011
1000 00000010
1010 00000000
1001 00000111
com
111
SUB
+
5
S Y
A
B
PC
clk
4
3
命令
0111 00000011
2
2
3
1
00000011
…
…
0
命令メモリ
clk
we=0
LD 0
ADD 1
ST 0
LD 2
SUB 3
ST 2
BNZ 0
BEZ 7
clk
1
0001 00000000
0110 00000001
1000 00000000
0001 00000010
0111 00000011
1000 00000010
1010 00000000
1001 00000111
com
000
ST
+
6
S Y
A
B
PC
clk
5
2
命令
1000 00000010
0
2
3
1
00000010
…
…
1
命令メモリ
clk
we=1
LD 0
ADD 1
ST 0
LD 2
SUB 3
ST 2
BNZ 0
BEZ 7
clk
0001 00000000
0110 00000001
1000 00000000
0001 00000010
0111 00000011
1000 00000010
1010 00000000
1001 00000111
BNZ命令の実行
operand
00000000
1
+
マルチプレクサ
データを選択
7
com
--1010 Dec.
PC
S Y
A
=0?
B
命令デコーダ
1010を検出
ACC=0の結果で
マルチプレクサを制御
en=0
6
命令
2
clk
1010 00000000
0
2
3
1
…
LD 0
ADD 1
ST 0
LD 2
SUB 3
ST 2
BNZ 0
BEZ 7
…
0
命令メモリ
clk
we=0
マルチプレクサと命令デコーダ
ACCのen信号
メモリのwe信号も
ついでに制御させてしまおう!
PC
opcode
ACC
=0?
命令
デコーダ
zero
opcode==1001 &
zero |
opcode==1010&
~zero
S
Y
A
B
PC+1
operand
S=0:Y ←A
S=1:Y←B
Y = S?A:B;
条件構文
(マルチプレクサ文)
アキュムレータマシンの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;
def.h
`define OP_ST 4’b1000
assign we = op_st;
`define OP_BEZ 4’b1001
`define OP_BNZ 4’b1010
assign accout = accum;
…
assign pcout = pc;
alu alu_1(.a(accum), .b(datain),
.s(opcode[`SEL_W-1:0], .y(alu_y));
アキュムレータマシンのVerilog記述
レジスタの制御
always @(posedge clk or negedge rst_n)
begin
pcの制御
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
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_00000000
0110_00000001
1000_00000000
0001_00000010
0111_00000011
1000_00000010
…
imem.dat:12bit
0000
0002
0003
0001
…
dmem.dat:16bit
演習課題
演習1
– Aを0番地、Bを1番地のデータとして(SR A) +
(SR B)のデータを2番地にしまうプログラムを実
行せよ
• 48ページ演習3-5
– 1番地にXが格納されている。X+(X-1)+(X2)+…2+1を計算するプログラムを実行せよ
• 提出物はimem.dat