在线咨询 切换到宽版
eetop公众号 创芯大讲堂 创芯人才网

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜全文
查看: 6706|回复: 12

[求助] [求助]自己做的除法器

[复制链接]
发表于 2011-6-10 16:52:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
本帖最后由 songzijian87 于 2011-6-15 00:31 编辑

这是本人做的除法器是32位除以32位(根据小学除法的原理写的),可以看到商和余数。
在modelsim上可以通过功能验证,但是用synplify综合总是出错,希望各位同胞不吝赐教。
本人的编程风格很是问题,不知道有什么好的编程风格,望请推荐。

本人是在校学生,没有任何流片经验,很困惑前段的代码如何写才能方便后面的布局布线,不知道要是优化的话应该从何下手,请赐教。非常谢谢

感谢斑竹解答,按照版主的要求改后,又遇到问题,问题如图所示
未命名.jpg


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
发表于 2011-6-10 17:08:15 | 显示全部楼层
一个信号只在一个always里赋值。
想清楚这个always是要做组合逻辑还是时序逻辑,决定用= 还是 <=赋值。
不是时钟或复位信号不要用posedge 或 negedge触发

算法方面,很惭愧,看不懂,能说说思路么。。。。
回复 支持 反对

使用道具 举报

发表于 2011-6-10 18:03:01 | 显示全部楼层
直接代码复制粘贴上来,解决的人会比较多的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-6-10 19:03:57 | 显示全部楼层
回复 2# jackertja

不好意思我写得程序比较乱
    就是小学的做除法时候用的算法
移位比较的除法器 除法器.jpg
小学的时候用的是10进制,现在换成2进制就可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-6-10 19:21:33 | 显示全部楼层
回复 3# wangxuede220


    说的也是
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-6-10 20:51:57 | 显示全部楼层
回复 2# jackertja


多谢赐教   
但是我想用一个复位信号能复位全部的,这样就不能分开写了,并且分开写还要有更多的判断条件,岂不是更麻烦
回复 支持 反对

使用道具 举报

发表于 2011-6-10 21:45:46 | 显示全部楼层
你这段描述是要写D-flop吗?如果是的话问题来了,clock呢?flop有load端吗?

module dff(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
回复 支持 反对

使用道具 举报

发表于 2011-6-10 22:18:50 | 显示全部楼层
供参考
http://fpgaw.com/home/space.php?uid=2634
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-6-11 00:09:43 | 显示全部楼层
回复 7# acgoal


    抱歉,忘记改了,应该是load模块,因为我想做一个载入模块,不是所有的信号都会要
回复 支持 反对

使用道具 举报

发表于 2011-6-14 19:45:15 | 显示全部楼层
回复 9# songzijian87


    看了你贴的报错的地方,这个不是错误啊,只是warning,警告而已嘛。说有一些逻辑被优化掉了,你检查一下,这些是否可以被优化掉。没有功能的信号本来就是可以被优化的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


手机版| 小黑屋| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-9-15 00:19 , Processed in 0.023786 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表