220 likes | 399 Views
計算機構成 第 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.
E N D
計算機構成 第3回データパス:計算をするところテキスト14‐19、29‐35計算機構成 第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 レジスタへのデータの書き込み 途中結果を蓄えるためにレジスタを導入 レジスタ=D.F.Fの集合 clk レジスタ clk 新しいデータ 新しいデータ 新しいデータ 入力データ 書き込み 書き込み 書き込み Q Q Q … clkの立ち上がり(立下り)に同期して書き込む →CPUの状態はclkに同期して変化する D D D
Y S A B レジスタの利用 clk ACC ACC:アキュムレータ 結果を蓄えるレジスタ
メモリの構成 ACCを使った構造も万能ではない→ (SLX)+(SLY)はうまく行かない メモリに、入力データ、中間結果を溜めておくためのメモリ DO 幅 n メモリは幅wbit, 深さ2 この例はw=16, n=8 0 1 8 深さ2=256 (本当はもっとずっと多数のデータを 格納する) 2 Address 8bitならば … 255 DI clk we メモリのモデル
メモリからの読み出し 1100101010100001 DO 幅 0 1 1100101010100001 Address=1ならば1のところに格納 された11001010がDOから読み出される 2 Address 1 … 256 DI clk we メモリのモデル
メモリへの書き込み DO 幅 0 1 we=1の時、Address=2 ならば2番地に clkが0→1の変化時にDIからの値が 書き込まれる タイミングはレジスタと同じ 1100101010100001 2 Address 2 … 256 DI clk we=1 1100101010100001 メモリのモデル
Y S A B メモリ付きのデータパスでの計算(p.18 例題2-3) 0番地にX、1番地にYが入っている X+Yを計算して2番地に格納せよ we com Address 0 001 00000000 0 110 00000001 1 000 00000010 001 THB com clk ACC 0 Address … clk we
Y S A B メモリ付きのデータパス 0番地にX、1番地にYが入っている X+Yを計算して2番地に格納せよ we com Address 0 001 00000000 0 110 00000001 1 000 00000010 110 ADD com + clk ACC 1 Address … clk we
Y S A B メモリ付きのデータパス 0番地にX、1番地にYが入っている X+Yを計算して2番地に格納せよ we com Address 0 001 00000000 0 110 00000001 1 000 00000010 000 THA com + clk ACC 2 Address … clk we=1
Y S A B メモリ付きのデータパス(p.18 例題2-4) 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 com clk ACC Address … clk we
命令の形にする 0番地にX、1番地にYが入っている X+Yを計算して2番地に格納せよ we com Address 0 001 00000000 0 110 00000001 1 000 00000010 操作を表す部分:op-code オプコード 操作対象を表す部分:operand オペランド 分かりやすい記号で書く:ニーモニックと呼ぶ 0000 NOP 0001 LD ( Load)メモリからACCにデータを読み込む 0010AND 0011OR 0100SL この時はオペランドは何でも良い 0101SR この時はオペランドは何でも良い 0110ADD 0111SUB 1000ST (Store)メモリへACCからデータを書き込む
プログラムの形にする 0番地にX、1番地にYが入っている X+Yを計算して2番地に格納せよ we com Address 0 001 00000000LD 0 0 110 00000001ADD 1 1 000 00000010ST 2 0番地にX、1番地にYが入っている (SL X)+(SL Y)を計算して2番地に 格納せよ we com Address 0 001 00000000LD 0 0 100 00000000SL 1 000 00000010ST 2 0 001 00000001LD 1 0 100 00000000SL 0 110 00000010ADD 2 1 000 00000010ST 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文 initial文は最初の一回のみ実行され、通常テストベンチにのみ用いる always @(posedge clk or negedge rst_n) begin if(!rst_n) accum <= 16’b0; else accum <= alu_y; end • always文は@以下の条件が成り立つときに常に実行される • posedge 立ち上がり negedge 立ち上がり • or, and はここだけで使う特殊な条件指定論理 • 決まった形式以外は使わない! レジスタに対する値の書き込みは<=を使って always文の中で行う always文中ではif文やcase文が使える なぜか? レジスタに対する代入だから→プログラム言語の変数と同じで代入されない場合の値が決まっている
メモリの記述 幅16ビット、深さ256のメモリ宣言 reg [15:0] dmem [0:255]; assign do = dmem[daddr]; always @(posedge clk) if(we) dmem[daddr] <= ddataout; 2番地の上位8ビットは? dmem[2][15:8] メモリは通常、合成の対象としない→テストベンチで記述 アドレスdaddrからのデータ読み出し we=1の時のクロック立ち上がりでデータの書き込み
Y S A B データパスのVerilog記述 com この部分を datapath で記述 clk ACC Address メモリはテストベンチに 記述 … clk we
データパスの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/1ps module 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; end datapath datapath_1(.clk(clk), .rst_n(rst_n), .com(com), .datain(dmem[addr], .accout(accout)); …. メモリの宣言 clkの生成 データパスの実体化
テストベンチのVerilog記述2 initial 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を設計せよ