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