EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
32位无符号除法器 8 s$ X3 Q7 }0 Y R- a2 e2 x
5 s4 S. I Y# o6 j5 K4 Q在Verilog HDL语言中虽然有除的运算指令,但是除运算符中的除数必须是2的幂,因此无法实现除数为任意整数的除法,很大程度上限制了它的使用领域。并且多数综合工具对于除运算指令不能综合出令人满意的结果,有些甚至不能给予综合。对于这种情况,一般使用相应的算法来实现除法,分为两类,基于减法操作和基于乘法操作的算法。[1] 基于减法的除法器的算法: 对于32的无符号除法,被除数a除以除数b,他们的商和余数一定不会超过32位。首先将a转换成高32位为0,低32位为a的temp_a。把b转换成高32位为b,低32位为0的temp_b。在每个周期开始时,先将temp_a左移一位,末尾补0,然后与b比较,是否大于b,是则temp_a减去temp_b将且加上1,否则继续往下执行。上面的移位、比较和减法(视具体情况而定)要执行32次,执行结束后temp_a的高32位即为余数,低32位即为商。
6 o6 N- |2 c6 N; y+ lVerilog HDL 代码 /* 功能: 32位除法器 输入参数: 被除数a,除数b 输出参数: 商yshang,余数yyushu 备注: 采用移位、比较和减法(从高位开始)实现的除法运算 本例实现的是32位除法器的例子 */ module division(a,b,yshang,yyushu); input[31:0] a; //被除数 input[31:0] b; //除数 output[31:0] yshang; // output[31:0] yyushu; //
" x& G& e/ |% e o. z+ X( q! b4 Greg[31:0] yshang; reg[31:0] yyushu; & Y$ G; B- l) [+ P/ B2 _
2 T3 }3 b3 m4 C' _ m0 O3 P2 w
reg[31:0] tempa; reg[31:0] tempb; 7 }, n0 A) A- |, p5 G1 e2 k
6 I5 g! l; p: m7 treg[63:0] temp_a; reg[63:0] temp_b; " u7 A0 X& P4 S& v: |: a
1 g: a+ \" y0 W6 m/ b8 I& |' A
always @(a or b) begin tempa <= a; tempb <= b; end 5 F) \* ~1 T0 \/ J
8 i+ G" \3 V& F# [( O jinteger i;
* l/ a5 ^! e1 y' `always @(tempa or tempb) begin temp_a = {32'h00000000,tempa}; // temp_b = {tempb,32'h00000000}; // for(i = 0;i < 32;i = i + 1) //32次循环 begin temp_a = {temp_a[62:0],1'b0}; //左移一位 if(temp_a[63:32] >= tempb) //注意:temp_a的高32位于tempb比较,不是与temp_b比较 temp_a = temp_a - temp_b + 1'b1; //加1表示商加1 else temp_a = temp_a; end
" d7 J7 i! v1 t: z yshang <= temp_a[31:0]; yyushu <= temp_a[63:32];
) d# E8 O; H8 f) }6 ?end endmodule
% R1 G/ w8 {' L0 ~ R8 h- L8 N波形仿真与测试结果 [url=http://upload.ednchina.com/Attachment.aspx?attachmentid=146629][/url] 图1 32位无符号数除法功能仿真图
& t: m/ @, V& }% a. C& E6 g. W 从仿真图1中可以得出,运算速度很快,但是这是基于占用大量LE的基础上的,在 FPGA的设计中,要关心两个参数:逻辑资源的占用率和速度。这种采用组合逻辑实现的除法器以耗费大量LE来获取速度优势的设计在被除数小于8位时应用还可以,大于8位,就得改变算法。
; f; W" F1 _; S2 U图2 32位无符号除法的分析综合报告 2 F: H# [* o6 |, L+ V6 q+ z, ]
|