?? seq_div.v
字號:
module seq_div(clk, rst, load, dividend, divisor, overflow,
done, quotient, remainder);
parameter WidthDividend = 11, // 被除數位寬
WidthDivisor = 6, // 除數位寬
WidthCount = 3;
input clk, rst, load;
input [WidthDividend-1:0] dividend;
input [WidthDivisor-1:0] divisor;
output overflow, done;
output[WidthDividend-WidthDivisor-1:0] quotient;
output[WidthDivisor-1:0] remainder;
reg overflow, done;
// FSM 狀態機
parameter ST_WAIT = 0,
ST_SHIFT = 1,
ST_OVERFLOW = 2,
ST_SUBTRACT = 3,
ST_DONE = 4;
reg [2:0] CurrentState, NextState;
reg [WidthCount-1:0] CurrentCount, NextCount;
reg Shift, Subtract, A_GE_B;
reg QuoRemSign;
reg [WidthDivisor-2:0] RegA, RegB, notRegB;
reg [WidthDividend-WidthDivisor-1:0] RegQ;
reg [WidthDivisor-2:0] RegA_minus_RegB;
// FSM狀態生成
always @(load or A_GE_B or CurrentCount or CurrentState)begin
Shift = 0;
Subtract = 0;
overflow = 0;
done = 0;
NextCount = CurrentCount;
case(CurrentState)
ST_WAIT: begin
NextCount = WidthDivisor - 1;
if(load)begin
Shift = 1;
NextState = ST_SHIFT;
end
else
NextState = ST_WAIT;
end
ST_SHIFT: begin
if((CurrentCount == (WidthDivisor - 1))&&A_GE_B)begin
overflow = 1;
NextState =ST_OVERFLOW;
end
else if(CurrentCount == 0)begin
done = 1;
NextState = ST_DONE;
end
else if(A_GE_B)begin
Subtract = 1;
NextState = ST_SUBTRACT;
end
else begin
Shift = 1;
NextCount = CurrentCount -1;
NextState = ST_SHIFT;
end
end
ST_OVERFLOW:if(load)begin
Shift = 0;
NextCount = WidthDivisor - 1;
NextState = ST_SHIFT;
end
else begin
overflow = 1;
NextState = ST_OVERFLOW;
end
ST_SUBTRACT: begin
Shift = 1;
NextCount = CurrentCount - 1;
NextState = ST_SHIFT;
end
ST_DONE:if(load)begin
Shift = 1;
NextCount = WidthDivisor - 1;
NextState = ST_SHIFT;
end
else begin
done = 1;
NextState = ST_DONE;
end
default: NextState = CurrentState;
endcase
end
always @(posedge clk)begin:FSM_SEQ
if(rst)begin
CurrentCount = WidthDivisor -2;
CurrentState = ST_WAIT;
end
else begin
CurrentCount = NextCount;
CurrentState = NextState;
end
end
// Compare (RegA - RegB)
always @(RegA or RegB)begin
notRegB = ~RegB;
{A_GE_B,RegA_minus_RegB} = RegA + notRegB + 1;
end
// Data registers
always @(posedge clk)begin
if(rst)begin // reset
RegA = 0;
RegQ = 0;
RegB = 0;
end
else if(load)begin // load
QuoRemSign = dividend[WidthDividend-1]^
divisor[WidthDivisor-1];
{RegA, RegQ} = dividend[WidthDividend-2:0];
RegB = divisor[WidthDivisor-2:0];
end
else if(Shift) // shift
{RegA, RegQ} = {RegA, RegQ} << 1;
else if(Subtract)begin // subtract
RegQ[0] = A_GE_B;
RegA = RegA_minus_RegB;
end
end
assign quotient = {QuoRemSign, RegQ};
assign remainder = {QuoRemSign, RegA};
endmodule
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -