加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

基于verilog 的除法器

(2012-10-20 14:19:09)
标签:

fpga

verilog

除法器

杂谈

分类: verilog和VHDL

`timescale 1ns/1ns
module divider_8_4(did,     // Divident 被除数
                   dis,     // Divisor  除数
                   quo,            // Quotient  商 
                   rem,            // Remainder 余数
                   error           // 错误,如果除数为0.则error置1               
                      );
    parameter M=7;                 // 被除数,余数,商的位数            
  parameter N=3;                 // 除数的位数
input [M:0] did;
 input [N:0] dis;
     output [M:0] quo;
     output [M:0] rem;
 output error;
 reg [M:0] quo;
 reg [M:0] rem;
 reg error;
 integer i;             // 整数,用于计数
 always @(did or dis)               // 被除数,除数
begin
quo=0;
rem=0;                         // 开始余数和商清零
if(dis==0)
   error=1;                    // 若除数为0则显示错误
   else if(did
        begin                    // 商0,余数为除数
            rem=dis;
            quo=0;
            error=0;
         end
        else
        begin
            error=0;
         for (i=8;i>0;i=i-1) // 循环8次
         begin
           rem={rem[M-1:0],did[i-1]}; // 把did[i-1]连接到rem后
           quo=quo<<1;   // 商左移一位    
         if(rem>=dis)   // 若拼接后rem>=除数dis      

   begin
quo=quo+1; // 商值自加1          
  rem=rem-dis;  // 新余数变为旧余数减除数     
  end
end
        end
end                                // 结束
endmodule

 

 

下面是测试程序

`timescale 1ns/1ns
module divider_bench;
reg [7:0] did;
     reg [3:0] dis;
 wire [7:0] quo;
 wire [7:0] rem;
 
divider_8_4 d1(did,dis,quo,rem,error); // 实例化
initial

repeat(10)
begin
  #100    did={$random}0;     
          dis={$random}%9;  
end

initial
begin        
    $monitor($time,"divident=%d divisor=%d quotient=%d remainder=%d",did,dis,quo,rem) ;
end
initial
begin
    #1000 $finish;            // 1000ns时停止仿真
end
endmodule

 

http://s10/mw690/735f2910gcc77c71e30c9&690的除法器" TITLE="基于verilog 的除法器" />





当然了,如果被除数是2的幂就更简单了。

比如16/4,  就是16>>2    ,  20/8  就是 20>>3   


对于负数,首先明确一下verilog 的负数表示

数值与变量和赋给变量:当变量为有符号数时,不允许数值中出现任何位界限,不然整个表达式的值将被解释为无符号数。

数值赋值给变量:两个同时指定界限时,被当作无符号数操作,即使用负数。其中一个未指定界限时,作为有符号数。 
 比较时:除非两边明确都是有符号数,否则按无符号处理,数值不能加任何限定。

位界限就是指 8'hF6  这样。   

这样定义寄存器 reg [7:0] A;不叫位界限。 

一般我们都是用补码形式存储的。


以8位为例,  -6/2=-3

-6 的补码是11111010  

-3 的补码是11111101

可见就是将-6>>1, 然后高位补1.


同样  -20/4=-5

-20 的补码是11101100  

-5  的补码是11111011

可见就是将-5>>2, 然后高位补1.





0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有