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