首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

请问用移位法做FPGA的除法器怎么做

请问用移位法做FPGA的除法器怎么做

想用移位法做FPGA的除法器,语言是Verilog HDL,不知道怎么做,请求指点,给出思路也行,能给出代码更好。谢谢了。

假如你有个数 std_logic_vector shu(19 downto 0)那么

0&shu(19 downto 1) 就是除以2的值, shu(0) 就是余数

我的email :lsy810809@hotmail.com

我写了个移位除法的程序,但是仿真不出,请高手指点

module mdivider(reset,ratio,remainder,error,divisor,dividend);
input reset;
input[15:0] divisor;        //输入16位除数
input[15:0] dividend;       //输入16位被除数
output[15:0] ratio;          //输出16位比率
output[15:0] remainder;      //输出16位余数
output error;           //错误信号
reg[31:0] shift_dividend;     //用来移位的32位被除数寄存器
reg[15:0] divisor_a;          //存放除数的寄存器
reg[15:0] ratio;               //比率寄存器
reg[15:0] remainder;            //余数寄存器
wire error=(divisor==16'b0);     //当除数为0时错误信号为真
always @(divisor or dividend)   
begin
   if(reset||error)              //当reset或error为真时,所有寄存器置0     
   begin                              
   ratio=16'b0;
   remainder=16'b0;
   divisor_a=16'b0;
   shift_dividend=16'b0;   
   end
 else if(divisor>dividend)       //当被除数小于除数时,直接判定比率为0,余数即除数
   begin
   ratio=16'b0;
   remainder=dividend;
   end
 else if(divisor==16'b1)         //当除数为1时,比率即被除数,余数为0
   begin
   ratio=dividend;
   remainder=16'b0;
   end
 else                           
   begin
     ratio=16'b0;
   divisor_a=divisor;
   shift_dividend=dividend;      //将16位被除数读入32位的移位寄存器的低16位
   shift_dividend=shift_dividend<<1;   
   repeat(15)                     //再将32位移位寄存器的的数进行15次左移计算
     begin
   ratio=ratio<<1;       //将已得出的比率左移并根据下一位除数与被除数的比较得出比率最低位的值
   shift_dividend=shift_dividend<<1;  //将32位移位寄存器的低16位的最高为移入高16位
   if(divisor_a<shift_dividend[31:16]) //比较32位移位寄存器的高16位与除数
     begin
   shift_dividend[31:16]=shift_dividend[31:16]-divisor_a;
   ratio=ratio+1; 
   end      //如果移位寄存器的高16位大于除数,则移位寄存器高16位的值为它们的差,并将比率寄存器的最低位+1
     end
  remainder=shift_dividend[31:16];//经过15次移位计算,32移位寄存器高16位的值即位余数
  end
end
endmodule

返回列表