📄 mdu.v
字号:
lmdx_nxt = ST13 ;
end
MD1_ID, MD2_ID, MD3_ID,
MD4_ID, MD5_ID :
begin
lmdx_nxt = ST14 ;
end
default :
begin
lmdx_nxt = ST7 ;
end
endcase
end
else
begin
if (opend & sfraddr == MD3_ID & sfroe)
begin
lmdx_nxt = ST0 ;
end
else
begin
lmdx_nxt = ST7 ;
end
end
end
ST8 :
begin
mdu_op = MDU_NOP ;
setmdef = 1'b0 ;
if (sfrwe)
begin
case (sfraddr)
MD0_ID :
begin
lmdx_nxt = ST13 ;
end
MD5_ID :
begin
lmdx_nxt = ST9 ;
end
ARCON_ID :
begin
lmdx_nxt = ST7 ;
end
default :
begin
lmdx_nxt = ST8 ;
end
endcase
end
else
begin
lmdx_nxt = ST8 ;
end
end
ST9 :
begin
mdu_op = MDU_DIV16 ;
setmdef = 1'b0 ;
if (sfrwe)
begin
case (sfraddr)
MD0_ID :
begin
lmdx_nxt = ST13 ;
end
MD1_ID, MD2_ID, MD3_ID,
MD4_ID, MD5_ID :
begin
lmdx_nxt = ST14 ;
end
default :
begin
lmdx_nxt = ST9 ;
end
endcase
end
else
begin
if (opend & sfraddr == MD5_ID & sfroe)
begin
lmdx_nxt = ST0 ;
end
else
begin
lmdx_nxt = ST9 ;
end
end
end
ST10 :
begin
mdu_op = MDU_NOP ;
setmdef = 1'b0 ;
if (sfrwe)
begin
case (sfraddr)
MD0_ID :
begin
lmdx_nxt = ST13 ;
end
MD1_ID :
begin
lmdx_nxt = ST11 ;
end
ARCON_ID :
begin
lmdx_nxt = ST7 ;
end
default :
begin
lmdx_nxt = ST10 ;
end
endcase
end
else
begin
lmdx_nxt = ST10 ;
end
end
ST11 :
begin
mdu_op = MDU_NOP ;
setmdef = 1'b0 ;
if (sfrwe)
begin
case (sfraddr)
MD0_ID :
begin
lmdx_nxt = ST13 ;
end
MD5_ID :
begin
lmdx_nxt = ST12 ;
end
ARCON_ID :
begin
lmdx_nxt = ST7 ;
end
default :
begin
lmdx_nxt = ST11 ;
end
endcase
end
else
begin
lmdx_nxt = ST11 ;
end
end
ST12 :
begin
mdu_op = MDU_MUL ;
setmdef = 1'b0 ;
if (sfrwe)
begin
case (sfraddr)
MD0_ID :
begin
lmdx_nxt = ST13 ;
end
MD1_ID, MD2_ID, MD3_ID,
MD4_ID, MD5_ID :
begin
lmdx_nxt = ST14 ;
end
default :
begin
lmdx_nxt = ST12 ;
end
endcase
end
else
begin
if (opend & sfraddr == MD3_ID & sfroe)
begin
lmdx_nxt = ST0 ;
end
else
begin
lmdx_nxt = ST12 ;
end
end
end
ST13 :
begin
mdu_op = MDU_RST ;
setmdef = 1'b1 ;
lmdx_nxt = ST1 ;
end
default : // ST14
begin
mdu_op = MDU_RST ;
setmdef = 1'b1 ;
lmdx_nxt = ST0 ;
end
endcase
end
//------------------------------------------------------------------
always @(posedge clk)
begin : lmdx_sync_proc
//------------------------------------------------------------------
if (rst)
//-----------------------------------
// Synchronous reset
//-----------------------------------
begin
lmdx_reg <= ST0 ;
end
else
//-----------------------------------
// Synchronous write
//-----------------------------------
begin
lmdx_reg <= lmdx_nxt ;
end
end
//------------------------------------------------------------------
// arithmetic operation FSM
//------------------------------------------------------------------
always @(oper_reg or md2 or md3 or md4 or md5 or counter_st or
mdu_op or arcon)
begin : oper_comb_proc
//------------------------------------------------------------------
case (oper_reg)
ST1 :
begin
md30_sel = NOP_ ;
counter_sel = 2'b01 ; //load(count<-sc)
ld_sc = 1'b0 ; //nop
opend = 1'b0 ; //operation end
setmdov = 1'b0 ; //set mdov flag
if (arcon[4:0] == 5'b00000)
begin
if (md3[7])
begin
oper_nxt = ST8 ;
end
else
begin
oper_nxt = ST7 ;
end
end
else
begin
if (arcon[5])
begin
oper_nxt = ST5 ;
end
else
begin
oper_nxt = ST6 ;
end
end
end
ST2 :
begin
md30_sel = MUL ;
counter_sel = 2'b11 ; //dec
ld_sc = 1'b0 ; //nop
opend = 1'b0 ; //operation end
setmdov = 1'b0 ; //set mdov flag
if (counter_st == 5'b10010)
begin
oper_nxt = ST9 ;
end
else
begin
oper_nxt = ST2 ;
end
end
ST3 :
begin
md30_sel = DIV16 ;
counter_sel = 2'b11 ; //dec
ld_sc = 1'b0 ; //nop
opend = 1'b0 ; //operation end
setmdov = 1'b0 ; //set mdov flag
if (counter_st == 5'b10100)
begin
oper_nxt = ST10 ;
end
else
begin
oper_nxt = ST3 ;
end
end
ST4 :
begin
md30_sel = DIV32 ;
counter_sel = 2'b11 ; //dec
ld_sc = 1'b0 ; //nop
opend = 1'b0 ; //operation end
setmdov = 1'b0 ; //set mdov flag
if (counter_st == 5'b00100)
begin
oper_nxt = ST10 ;
end
else
begin
oper_nxt = ST4 ;
end
end
ST5 :
begin
md30_sel = SHR ;
counter_sel = 2'b11 ; //dec
ld_sc = 1'b0 ; //nop
opend = 1'b0 ; //operation end
setmdov = 1'b0 ; //set mdov flag
if (counter_st == 5'b00001 |
counter_st == 5'b00010 |
counter_st == 5'b00000)
begin
oper_nxt = ST0 ;
end
else
begin
oper_nxt = ST5 ;
end
end
ST6 :
begin
md30_sel = SHL ;
counter_sel = 2'b11 ; //dec
ld_sc = 1'b0 ; //nop
opend = 1'b0 ; //operation end
setmdov = 1'b0 ; //set mdov flag
if (counter_st == 5'b00001 |
counter_st == 5'b00010 |
counter_st == 5'b00000)
begin
oper_nxt = ST0 ;
end
else
begin
oper_nxt = ST6 ;
end
end
ST7 :
begin
md30_sel = NORM ;
counter_sel = 2'b11 ; //dec
ld_sc = 1'b0 ; //nop
opend = 1'b0 ; //operation end
setmdov = 1'b0 ; //set mdov flag
if ((md3[6]) | (md3[5]) | counter_st == 5'b00010)
begin
oper_nxt = ST11 ;
end
else
begin
oper_nxt = ST7 ;
end
end
ST8 :
begin
md30_sel = NOP_ ;
counter_sel = 2'b10 ; //reset
ld_sc = 1'b0 ; //nop
opend = 1'b0 ; //operation end
setmdov = 1'b1 ; //set mdov flag
oper_nxt = ST0 ;
end
ST9 :
begin
md30_sel = NOP_ ;
counter_sel = 2'b10 ; //reset
ld_sc = 1'b0 ; //nop
opend = 1'b0 ; //operation end
setmdov = (md3[7] | md3[6] | md3[5] | md3[4] |
md3[3] | md3[2] | md3[1] | md3[0] |
md2[7] | md2[6] | md2[5] | md2[4] |
md2[3] | md2[2] | md2[1] | md2[0]) ;
oper_nxt = ST0 ;
end
ST10 :
begin
md30_sel = LDRES ;
counter_sel = 2'b10 ; //reset
ld_sc = 1'b0 ; //nop
opend = 1'b0 ; //operation end
if (md4 == 8'b00000000 & md5 == 8'b00000000)
begin
setmdov = 1'b1 ; //set mdov flag
end
else
begin
setmdov = 1'b0 ;
end
oper_nxt = ST0 ;
end
ST11 :
begin
md30_sel = NOP_ ;
counter_sel = 2'b10 ; //reset
ld_sc = 1'b1 ; //load sc
opend = 1'b0 ; //operation end
setmdov = 1'b0 ; //set mdov flag
oper_nxt = ST0 ;
end
ST12 :
begin
md30_sel = NOP_ ;
counter_sel = 2'b10 ; //reset
ld_sc = 1'b0 ; //nop
opend = 1'b0 ; //operation end
setmdov = 1'b0 ; //set mdov flag
case (mdu_op)
MDU_SHIFT :
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -