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