Verilog-HDL入門 - iguchi

Download Report

Transcript Verilog-HDL入門 - iguchi

計算機アーキテクチャ演習第5回
Verilog特訓
慶應義塾大学 理工学部 情報工学科
天野
アキュムレータマシン
ir
op.code
ALU
‘1’
accum
pc
operand
+
idata
iadr
Instruction
Memory
acout
we_
dadr
ddata
Data
Memory
状態遷移
rst_
Instruction
Fetch
pc←pc+1
ir ← idata
Execution
BEQ: if (accum == 0) pc← ir[3:0]
BNQ: if (accum != 0) pc← ir[3:0]
ST: we_ = L
else: accum ← ALU出力
アキュムレータの記述(1)
parameter Enable = 1’b1;
parameter Disable = 1’b0;
parameter Enable_ = 1’b0;
parameter Disable_ = 1’b1;
parameter DataBus=4;
parameter InstBus=8;
parameter STNUM=2;
parameter IF=2’b01;
parameter EX=2’b10;
parameter EX_BIT=1‘b1;
parameter BEQ= 4’b1010;
parameter BNQ= 4’b1011;
parameter ST=4’b1000;
アキュムレータの記述(2)
module accum(clock, rst_, acout);
input clock, rst_;
output [DataBus-1:0] acout;
wire [DataBus-1:0] ddata;
wire [InstBus-1:0] idata;
wire [DataBus-1:0] dadr;
wire we;
reg [DataBus-1:0] accum;
// Accumulator
reg [DataBus-1:0] pc;
// Program Counter
reg [InstBus-1:0] ir;
// Instruction Register
reg [STNUM-1:0] stat;
// State register
wire [DataBus-1:0] aluout;
assign acout = accum;
assign dadr = ir[3:0];
assign we = stat[EX_BIT] & (ir[7:4] == ST);
ALU alu0(.A(accum), .B(ddata), .COM(ir[6:4]), .ALUOUT(aluout));
ROM16_8 imem(.AD(pc), .DOUT(idata));
RAM16_4 dmem (.CLK(clock), .WE(we), .ADDRESS(dadr),
.DIN(accum), .DOUT(ddata));
アキュムレータの記述(3)
always@(posedge clock) begin
if(rst_ == Enable_) begin
stat <= IF;
pc <= 4'b0000; end
else
この記述は命令により様々
case (stat)
//Case文
なレジスタを
IF: begin
制御している
ir <= idata;
pc <= pc+1;
リソースシュアリングが
stat <= EX; end
可能だが、やりすぎると
EX: begin
バグの元なので注意!
case (ir[7:4])
//Case文入れ子
BEQ: if (accum == 4'b0000) pc <= ir[3:0];
BNE: if (accum != 4'b0000) pc <= ir[3:0];
default: if(ir[7]==1'b0) accum <= aluout;
endcase
stat <= IF; end
endcase
end
endmodule
演習

アキュムレータにSUBI命令を付け加えよ
2)ALUのコマンドに111を
ir
op.code
ALU
111
‘1’
accum
pc
1)Operand
をALUのb入力へ
operand
+
idata
iadr
Instruction
Memory
acout
we_
dadr
ddata
Data
Memory
SUBIの付加
module accum(clock, rst_, acout);
input clock, rst_;
output [DataBus-1:0] acout;
wire [DataBus-1:0] ddata;
wire [InstBus-1:0] idata,alubin;
wire [DataBus-1:0] dadr;
wire we;
wire [2:0] alucom;
reg [DataBus-1:0] accum;
// Accumulator
reg [DataBus-1:0] pc;
// Program Counter
reg [InstBus-1:0] ir;
// Instruction Register
reg [STNUM-1:0] stat;
// State register
wire [DataBus-1:0] aluout;
assign acout = accum;
assign dadr = ir[3:0];
assign we = stat[EX_BIT] & (ir[7:4] == ST);
assign alubin = ir[7:4] == SUBI ? Ir[3:0] : ddata;
assign alucom = ir[7:4] == SUBI ? 3’b111: ir[6:4]
ALU alu0(.A(accum), .B(alubin), .COM(alucom), .ALUOUT(aluout));
ROM16_8 imem(.AD(pc), .DOUT(idata));
RAM16_4 dmem (.CLK(clock), .WE(we), .ADDRESS(dadr),
.DIN(accum), .DOUT(ddata));
演習
1.
2.
LDI #n 命令を付加せよ。この命令ではn
が直接accに格納される。
現在の設計では、PCをインクリメントする
加算器が生成される。IFステージで遊ん
でいるALUを利用することで、加算器を使
わないでPCをインクリメントするようにデ
ータパスを改造せよ。
演習 サイコロ

STOP入力がHレベルの時に停止し、Lレベ
ルの時に1→2→…→6→1→…と数えるサ
イコロ用のカウンタをVerilog記述で設計せ
よ。(やり方は自由、加算器を使っても良い
し使わなくても良い)
演習 Barrel Shifter

一度に多くの桁数をシフトするハードウェアで
あるBarrel ShifterをVerilogのfunctionとして記
述せよ(下図のように8bit左シフトとせよ)
y7
y6
y5
y4
y3
y2
y1
y0
s2
s1
0000
s0
00
a7
a6
a5
a4
a3
a2
a1
a0
0