Upload
ellema
View
73
Download
0
Embed Size (px)
DESCRIPTION
計算機構成 第 3 回 データパス:計算をするところ テキスト 14‐19 、 29‐35. 情報工学科 天野英晴. Y. S. A. B. ALU で色々な演算ができる. しかし、 2 つの入力データに限定される. X + Y. 110. X. Y. Y. Y. Y. S. S. S. A. A. A. B. B. B. たくさん ALU を使う方法 →大変だし一般性がない. X+Y-W+Z. 111. X + Y. W ー Z. 110. 111. X. Y. W. Z. Q. Q. Q. D. D. D. - PowerPoint PPT Presentation
Citation preview
計算機構成 第 3 回データパス:計算をするところ
テキスト 14‐19 、 29‐35情報工学科
天野英晴
ALU で色々な演算ができる
• しかし、 2 つの入力データに限定される
A B
YS
X Y
110
X+ Y
たくさん ALU を使う方法→大変だし一般性がない
A B
YS
A B
YS
A B
YS
X Y W Z
X+ Y Wー Z
X+Y-W+Z
110
111
111
レジスタへのデータの書き込み
レジスタ
書き込み 書き込み 書き込み
新しいデータ新しいデータ新しいデータclk
入力データ
clk
clkの立ち上がり(立下り)に同期して書き込む→CPUの状態は clkに同期して変化する
途中結果を蓄えるためにレジスタを導入レジスタ= D.F.Fの集合
D
Q
D
Q
D
Q
D
Q
D
Q
D
Q…
レジスタの利用
A B
YS
ACC
S B ACC の内容
001 X X
110 Y X+Y
111 W X+Y-W
110 Z X+Y-W+Z
ACC:アキュムレータ結果を蓄えるレジスタ
clk
メモリの構成
…
ACCを使った構造も万能ではない→ ( SL X)+( SL Y)はうまく行かないメモリに、入力データ、中間結果を溜めておくためのメモリ
メモリのモデル
DI
DO
we
Address
8bitならば
0 1 2
255
幅メモリは幅 wbit, 深さ 2この例は w=16, n=8
n
深さ 2 =256(本当はもっとずっと多数のデータを格納する)
clk
8
メモリからの読み出し
…
メモリのモデル
DI
DO
we
Address
1
0 1 2
256
幅
Address =1ならば1のところに格納された 11001010 が DO から読み出される
1100101010100001
clk
1100101010100001
メモリへの書き込み
…
メモリのモデル
DI
DO
we=1
Address
2
0 1 2
256
幅
we=1の時、 Address= 2 ならば 2番地にclkが 0→1の変化時に DIからの値が書き込まれる
タイミングはレジスタと同じ
clk
1100101010100001
1100101010100001
メモリ付きのデータパスでの計算(p.18 例題 2-3)
A B
YS
ACC
…
we
Address
clk
clk
com
0番地に X、 1番地に Yが入っているX+Yを計算して 2番地に格納せよ
we com Address 0 001 00000000 0 110 00000001 1 000 00000010
0
001THB
メモリ付きのデータパス
A B
YS
ACC
…
we
Address
clk
clk
com
0番地に X、 1番地に Yが入っているX+Yを計算して 2番地に格納せよ
we com Address 0 001 00000000 0 110 00000001 1 000 00000010
1
110ADD
+
メモリ付きのデータパス
A B
YS
ACC
…
we=1
Address
clk
clk
com
0番地に X、 1番地に Yが入っているX+Yを計算して 2番地に格納せよ
we com Address 0 001 00000000 0 110 00000001 1 000 00000010
2
000THA
+
メモリ付きのデータパス(p.18 例題 2-4)
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
命令の形にする0番地に X、 1番地に Yが入っているX+Yを計算して 2番地に格納せよ
we com Address 0 001 00000000 0 110 00000001 1 000 00000010
操作を表す部分: op-codeオプコード操作対象を表す部分: operandオペランド
0000 NOP0001 LD ( Load )メモリから ACC にデータを読み込む0010 AND 0011 OR0100 SL この時はオペランドは何でも良い0101 SR この時はオペランドは何でも良い0110 ADD0111 SUB1000 ST ( Store )メモリへ ACC からデータを書き込む
分かりやすい記号で書く:ニーモニックと呼ぶ
プログラムの形にする0番地に X、 1番地に Yが入っているX+Yを計算して 2番地に格納せよ
we com Address 0 001 00000000 LD 0 0 110 00000001 ADD 1 1 000 00000010 ST 2
0番地に X、 1番地に Yが入っている( SL X) +( SL Y)を計算して 2番地に格納せよ
we com Address 0 001 00000000 LD 0 0 100 00000000 SL 1 000 00000010 ST 2 0 001 00000001 LD 1 0 100 00000000 SL 0 110 00000010 ADD 2 1 000 00000010 ST 2
アセンブラ表記
機械語
レジスタの Verilog記述
reg [15:0] accum;
assign accout = accum;
always @(posedge clk or negedge rst_n) begin if(!rst_n) accum <= 16’b0; else accum <= alu_y; end
宣言
読み出しクロックの立ち上げ同
期して書き込み
rst_nが 0になると初期化(非同期リセッ
ト)
always 文
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) accum <= 16’b0;
else accum <= alu_y;
end
initial 文は最初の一回のみ実行され、通常テストベンチにのみ用いる
always文は@以下の条件が成り立つときに常に実行されるposedge 立ち上がり negedge 立ち上がりor, and はここだけで使う特殊な条件指定論理
決まった形式以外は使わない!
レジスタに対する値の書き込みは<=を使っ
てalways 文の中で行う
always 文中では if 文やcase 文が使える
なぜか?レジスタに対する代入だから→プログラム言語の変数と同じで代入されない場合
の値が決まっている
メモリの記述reg [15:0] dmem [0:255];
assign do = dmem[daddr];
always @(posedge clk) if(we) dmem[daddr] <= ddataout;
2番地の上位 8ビットは?dmem[2][15:8]
メモリは通常、合成の対象としない→テストベンチで記述
幅 16 ビット、深さ256 のメモリ宣言
アドレス daddrからのデータ読み出
しwe=1 の時のクロック立ち上がりでデータの書き込み
データパスの Verilog記述
A B
YS
ACC
…
we
Address
clk
clk
com
この部分をdatapathで記述
メモリはテストベンチに記述
データパスの Verilog記述module datapath( input clk, input rst_n, input[15:0] datain, input [2:0] com, output[15:0] accout); reg [15:0] accum; wire [15:0] alu_y;
assign accout = accum;wire [15:0] alu_y;
assign accout = accum;alu alu_1( .a(accum), .b(datain), .s(com), .y(alu_y));
always @(posedge clk or negedge rst_n) begin if(!rst_n) accum <= 16’b0; else accum <= alu_y; end
ALU を実体化
アキュムレータへのかきこみ
テストベンチの Verilog記述 1`timescale 1ns/1psmodule test;parameter STEP =10; …reg[15:0] dmem[0:255];always @(posedge clk) begin if(we) dmem[addr] <= accout; end
always #(STEP/2) begin clk <= ~clk;enddatapath datapath_1(.clk(clk), .rst_n(rst_n), .com(com), .datain(dmem[addr], .accout(accout));….
clkの生成
データパスの実体化
メモリの宣言
テストベンチの Verilog記述 2initial begin… $readmemh(“dmem.dat”,dmem);ファイル dmem.datからメモリ dmemにデータを設定する$readmemb → 2進数でファイル中にデータを書く$readmemh→16進数でファイル中にデータを書く
{we,com,addr}<= {`DISABLE,`ALU_THB,`ADDR_W’h00};…
連結、バス化{X,Y,Z} まとめてバスとして扱える右辺にも左辺にも使える
演習課題• 35 ページ演習 2-9
– A を 0 番地、 B を 1 番地のデータとして (SR A) OR (SR B) のデータを 2 番地にしまう命令の実行をシミュレーションせよ
• 35 ページ演習 2-10– A,B を上記と同じとし、( A+B) OR (A-B) の
結果を 2 番地にしまう命令の実行をシミュレーションせよ
• 1から6まで数えて、 stop 入力で停止するサイコロ dice を設計せよ