搜索
bottom↓
回复: 1

下了个除法器VERILOG 除法器 有点点没懂。

[复制链接]

出0入0汤圆

发表于 2010-8-5 20:59:45 | 显示全部楼层 |阅读模式
这个程序它在一直不停的算,能不能帮我改下下,只要除数和被除数不变,商和余数算好之后程序就停下。(程序没看懂哈,不然就自己改了)

(原文件名:未命名.jpg)


module divider(quotient,remainder,ready,error,word1,word2,start,clock,reset);
parameter   L_divn=8,
            L_divr=4,
            S_idle=0,S_adivr=1,S_adivn=2,S_div=3,S_err=4,
            L_state=3,L_cnt=4,Max_cnt=L_divn-L_divr;
output  [L_divn-1:0]   quotient,remainder;
output                 ready,error;
input   [L_divn-1:0]   word1;//dividend
input   [L_divr-1:0]   word2;//divisor
input                  start,clock,reset;//0,start,1,reset
reg     [L_state-1:0]  state,next_state;
reg                    Load_words,Subtract,Shift_dividend,Shift_divisor;
reg     [L_divn-1:0]   quotient;
reg     [L_divn:0]     dividend;
reg     [L_divr-1:0]   divisor;
reg     [L_cnt-1:0]    num_Shift_dividend,num_Shift_divisor;
reg     [L_divr:0]     comparison;

wire    MSB_divr=divisor[L_divr-1];
wire    ready=((state==S_idle)&&reset);
wire    error=(state==S_err);
wire    Max=(num_Shift_dividend==Max_cnt+num_Shift_divisor);
wire    sign_bit=comparison[L_divr];

assign  remainder=(dividend[L_divn-1:L_divn-L_divr])>num_Shift_divisor;/////////

always @(state or dividend or divisor or MSB_divr)
   case(state)
      S_adivr:   if(MSB_divr==0)
                    comparison=dividend[L_divn:L_divn-L_divr]+{1'b1,~(divisor<<1)}+1'b1;
                 else
                    comparison=dividend[L_divn:L_divn-L_divr]+{1'b1,~divisor[L_divr-1:0]}+1'b1;
      default:   comparison=dividend[L_divn:L_divn-L_divr]+{1'b1,~divisor[L_divr-1:0]}+1'b1;
   endcase



always @(posedge clock or negedge reset)
  if(!reset) state<=S_idle; else state<=next_state;

always @(state or word1 or word2 or start or comparison or sign_bit or Max)
  begin
    Load_words=0;Subtract=0;Shift_dividend=0;Shift_divisor=0;
      case(state)
           S_idle:    case(!start)
                        0:  next_state=S_idle;
                        1:  if(word2==0) next_state=S_err;
                            else if(word1) begin next_state=S_adivr;Load_words=1; end
                            else next_state=S_idle;
                      endcase
           S_adivr:   case(MSB_divr)
                        0:  if(sign_bit==0) begin next_state=S_adivr;Shift_divisor=1; end
                            else if(sign_bit==1) next_state=S_adivn;
                        1:  next_state=S_div;
                      endcase
           S_adivn:   case({Max,sign_bit})
                        2'b00:  next_state=S_div;
                        2'b01:  begin next_state=S_adivn;Shift_dividend=1; end
                        2'b10:  begin next_state=S_idle;Subtract=1; end
                        2'b11:  next_state=S_idle;
                      endcase
           S_div:     case({Max,sign_bit})
                        2'b00:  begin next_state=S_div;Subtract=1; end
                        2'b01:  next_state=S_adivn;
                        2'b10:  begin next_state=S_div;Subtract=1; end
                        2'b11:  begin next_state=S_div;Shift_dividend=1; end
                      endcase
           default:   next_state=S_err;
       endcase
   end

always @(posedge clock or negedge reset)
begin
  if(!reset)
     begin
       divisor<=0;
       dividend<=0;
       quotient<=0;
       num_Shift_dividend<=0;
       num_Shift_divisor<=0;
     end
  else if(Load_words==1)
     begin
       dividend<=word1;
       divisor<=word2;
       quotient<=0;
       num_Shift_dividend<=0;
       num_Shift_divisor<=0;
     end
  else if(Shift_divisor)
     begin
       divisor<=divisor<<1;
       num_Shift_divisor<=num_Shift_divisor+1;
     end
  else if(Shift_dividend)
     begin
       dividend<=dividend<<1;
       quotient<=quotient<<1;
       num_Shift_dividend<=num_Shift_dividend+1;
     end
  else if(Subtract)
     begin
       dividend[L_divn:L_divn-L_divr]<=comparison;
       quotient[0]<=1;
     end
end
endmodule

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-8-11 20:36:53 | 显示全部楼层
哎~这个问题我也蛋疼过~
最后倾向IP了~变懒了
啊哈哈!

楼主还是善用资源吧,啊哈哈
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 17:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表