除法器设计
基于FSMD的除法器设计
在http://www.cnblogs.com/qiweiwang/archive/2011/04/13/2014502.html中已经有了一篇除法器的设计实例,本文对该除法器修改如下
// Listing 7.11
module div_combined
#(
parameter W = 8,
CBIT = 4 // CBIT=log2(W)+1
)
(
input wire clk, reset,
input wire start,
input wire [W-1:0] dvsr, dvnd,
output wire ready, done_tick,
output wire [W-1:0] quo, rmd
);
// symbolic state declaration
localparam [1:0]
idle = 2'b00,
op = 2'b01,
last = 2'b10,
done = 2'b11;
// signal declaration
reg [1:0] state_reg;
reg [W-1:0] rh_reg, rl_reg, rh_tmp, d_reg;
reg [CBIT-1:0] n_reg, n_next;
reg q_bit;
// fsmd registers and next-state logic
always @(posedge clk, posedge reset)
begin
if (reset)
begin
state_reg <= idle;
rh_reg <= 0;
rl_reg <= 0;
d_reg <= 0;
n_reg <= 0;
end
else
begin
//==============================================
// data path functional units
// to get intermediate results
//==============================================
// compare and subtract circuit
if (rh_reg >= d_reg)
begin
rh_tmp = rh_reg - d_reg;
q_bit = 1'b1;
end
else
begin
rh_tmp = rh_reg;
q_bit = 1'b0;
end
// index decrement circuit
n_next = n_reg - 1;
//==============================================
// state and data registers and next-state logic
//==============================================
case (state_reg)
idle:
begin
if (start)
begin
rh_reg <= 0;
rl_reg <= dvnd; // dividend
d_reg <= dvsr; // divisor
n_reg <= CBIT; // index
state_reg <= op;
end
end
op:
begin
// shift rh and rl left
rl_reg <= {rl_reg[W-2:0], q_bit};
rh_reg <= {rh_tmp[W-2:0], rl_reg[W-1]};
// decrease index
n_reg <= n_next;
if (n_next==1)
state_reg <= last;
end
last: // last iteration
begin
rl_reg <= {rl_reg[W-2:0], q_bit};
rh_reg <= rh_tmp;
state_reg <= done;
end
done:
state_reg <= idle;
default: state_reg <= idle;
endcase
end
end
// output
assign quo = rl_reg;
assign rmd = rh_reg;
// unregistered output
assign ready = (state_reg==idle);
assign done_tick = (state_reg==done);
endmodule
路漫漫其修远兮,吾将上下而求索
浙公网安备 33010602011771号