EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
32位无符号除法器
]/ U" `+ Y _5 }; m4 S8 K3 k
, V: F- L* @3 i- b2 J0 }在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位即为商。 " T h- T! B/ L
Verilog 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; //
0 S8 a' ^! X& h+ yreg[31:0] yshang; reg[31:0] yyushu;
5 d& X& |$ O1 {; R. F
. F1 v# Z6 u2 E9 a( O# Hreg[31:0] tempa; reg[31:0] tempb; 9 H% x w" y: `% C
. Q: d" l" V) e7 Y
reg[63:0] temp_a; reg[63:0] temp_b; / L( P8 q- X* W" J' o
, j( v/ d1 ]' U5 h; R/ ?+ T0 ]always @(a or b) begin tempa <= a; tempb <= b; end 1 _( f* o/ X9 z6 [+ L; \ m h
+ X) ?& D3 B* J. ]8 z$ A5 Sinteger i; 9 W: A2 p1 b5 `
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
* `. @" n$ a1 _: C# c4 T yshang <= temp_a[31:0]; yyushu <= temp_a[63:32]; / l: A5 `, |0 S
end endmodule % x+ v2 _- Y: j- }1 P! X4 J
波形仿真与测试结果 [url=http://upload.ednchina.com/Attachment.aspx?attachmentid=146629][/url] 图1 32位无符号数除法功能仿真图 * {# ?) R( P; r6 G7 y
从仿真图1中可以得出,运算速度很快,但是这是基于占用大量LE的基础上的,在 FPGA的设计中,要关心两个参数:逻辑资源的占用率和速度。这种采用组合逻辑实现的除法器以耗费大量LE来获取速度优势的设计在被除数小于8位时应用还可以,大于8位,就得改变算法。
: X: N" v3 Y+ @) c: v图2 32位无符号除法的分析综合报告 & H$ A; v9 a& T4 ^/ a! G4 @
|