|  | 
 
| 
本帖最后由 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
 | 
 |