|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
×
本帖最后由 songzijian87 于 2011-6-15 00:31 编辑
这是本人做的除法器是32位除以32位(根据小学除法的原理写的),可以看到商和余数。
在modelsim上可以通过功能验证,但是用synplify综合总是出错,希望各位同胞不吝赐教。
本人的编程风格很是问题,不知道有什么好的编程风格,望请推荐。
本人是在校学生,没有任何流片经验,很困惑前段的代码如何写才能方便后面的布局布线,不知道要是优化的话应该从何下手,请赐教。非常谢谢
感谢斑竹解答,按照版主的要求改后,又遇到问题,问题如图所示
module division(reset,clk,a,b,load,quotient,remainder);
input reset,clk,load;
input [31:0] a,b;
output [31:0] quotient,remainder;
reg [31:0] bshift,remainder_temp,quotient,remainder;
wire [11:0] a_dec;
wire [11:0] b_dec;
wire [31:0] atemp,btemp;
reg [4:0] num,number;
wire [4:0] counter0;
wire [4:0] counter1;
reg shift_start,start;
genvar i;
//minusend bit width
p_decoder8 p80(reset,a[31:24],a_dec[11:9]);
p_decoder8 p81(reset,a[23:16],a_dec[8:6]);
p_decoder8 p82(reset,a[15:8],a_dec[5:3]);
p_decoder8 p83(reset,a[7:0],a_dec[2:0]);
assign counter0[4]=a_dec[11]|a_dec[10]|a_dec[9]|a_dec[8]|a_dec[7]|a_dec[6],
counter0[3]=a_dec[11]|a_dec[10]|a_dec[9]|a_dec[5]|a_dec[4]|a_dec[3],
counter0[2]=counter0[4]?(counter0[3]?a_dec[11]:a_dec[8]) counter0[3]?a_dec[5]:a_dec[2]),
counter0[1]=counter0[4]?(counter0[3]?a_dec[10]:a_dec[7]) counter0[3]?a_dec[4]:a_dec[1]),
counter0[0]=counter0[4]?(counter0[3]?a_dec[9]:a_dec[6]) counter0[3]?a_dec[3]:a_dec[0]);
//subtrahend bit width
p_decoder8 p84(reset,b[31:24],b_dec[11:9]);
p_decoder8 p85(reset,b[23:16],b_dec[8:6]);
p_decoder8 p86(reset,b[15:8],b_dec[5:3]);
p_decoder8 p87(reset,b[7:0],b_dec[2:0]);
assign counter1[4]=b_dec[11]|b_dec[10]|b_dec[9]|b_dec[8]|b_dec[7]|b_dec[6],
counter1[3]=b_dec[11]|b_dec[10]|b_dec[9]|b_dec[5]|b_dec[4]|b_dec[3],
counter1[2]=counter0[4]?(counter0[3]?b_dec[11]:b_dec[8]):(counter0[3]?b_dec[5]:b_dec[2]),
counter1[1]=counter0[4]?(counter0[3]?b_dec[10]:b_dec[7]):(counter0[3]?b_dec[4]:b_dec[1]),
counter1[0]=counter0[4]?(counter0[3]?b_dec[9]:b_dec[6]):(counter0[3]?b_dec[3]:b_dec[0]);
//temporary regiser
generate
for (i=0;i<32;i=i+1) begin:g1
load l0(a,atemp,load,reset);
load l1(b,btemp,load,reset);
end
endgenerate
always @(posedge clk)
if(reset)
begin
num=5'b0;
number=5'b0;
bshift=32'b0;
shift_start=0;
quotient=32'b0;
remainder=32'b0;
end
else
if(load)
if(a>=b)
begin
num=counter0-counter1;
shift_start=1;
bshift=btemp;
remainder_temp=atemp;
number=counter0-counter1+1;
end
else
begin
shift_start=0;
quotient=32'b0;
remainder_temp=atemp;
end
else if(shift_start)
begin
if(!num)
begin
shift_start=0;
start=1;
num=5'b0;
end
else
begin
shift_start=1;
bshift=bshift<<1;
start=0;
end
num=num-1;
end
else if(start)
begin
if(number)
if(remainder_temp>=bshift)
begin
remainder_temp=remainder_temp-bshift;
quotient[number-1]=1'b1;
bshift=bshift>>1;
end
else
begin
remainder_temp=remainder_temp;
quotient[number-1]=1'b0;
bshift=bshift>>1;
end
else if(!number)
start=0;
number=number-1;
end
else if(start==0)
remainder=remainder_temp;
endmodule
//submodule priority decoder
module p_decoder8(reset,a,b);
input [7:0] a;
input reset;
output [2:0] b;
reg [2:0] b;
always @(a,reset)
if(reset)
b=3'b000;
else
begin
if(a[7]==1'b1)
b=3'b111;
else if(a[6]==1'b1)
b=3'b110;
else if(a[5]==1'b1)
b=3'b101;
else if(a[4]==1'b1)
b=3'b100;
else if(a[3]==1'b1)
b=3'b011;
else if(a[2]==1'b1)
b=3'b010;
else if(a[1]==1'b1)
b=3'b001;
else
b=3'b000;
end
endmodule
//submodule load
module load(a,b,load,reset);
input a,load,reset;
output b;
reg b;
always @(posedge load,posedge reset)
if(reset)
b=1'b0;
else
b=a;
endmodule |
|