計算機構成 第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
© Copyright 2024 ExpyDoc