首页 > 编程知识 正文

二进制整数除法器verilog,verilog除法运算

时间:2023-05-05 00:10:53 阅读:160599 作者:3665

参考: https://blog.csdn.net/外向声音_ Zhen/article/details/79619373359 www.cn blogs.com/Moran huishou 0315/p/1133319

Verilog --无符号整数除法器(一)如何在不使用除法的情况下设计快速高效的除法器?

Verilog HDL语言中有除法的运算命令,但由于除法运算符的除数必须是2的乘方,所以不能实现除数为任意整数的除法,其使用领域受到很大限制。 另外,很多综合工具对除法指令不能综合满意的结果,有些不能综合。 即使可以合并,也需要相对多的资源。

最简单的方法是通过减法实现除法器。 (例如,十进制的a/b,首先比较a和b的大小,在ab的情况下,对商加1,使a=a-b,直到ab为止商不变,馀数为a那样比较大小。 但是,这种方式通常速度较慢,实际上模拟手动计算除法的过程是更快的方法:

实际图表显示了与十进制数差不多的二进制数的除法。 但是,十进制除法商的各位有0-9十种可能性,所以用十进制作除法器需要用二分法逐一判断商的各位数字,但由于二进制只有两种,所以不会太麻烦。 (但是,实际上两者的本质是一样的,算法的时间复杂度是一样的。 )流程图:

graphlrid0(32位整数a除以--id1(a ) a的高位扩展32位) id0 ) 32位整数a除以b )--id2(b ) b的低位扩展32位) id1 -- id3(a ) a向左1位) id3----id4id4----是----id5(a-b1 ) id5----id6 )班次次数32 ) id4----id6id6----是--- id3id 6

moduleint_div(input[31:0]a,input[31:0] b,output reg [31:0] yshang,output reg [ 313:0 ] y yushushu reg[31:0] tempb; reg[63:0] temp_a; reg[63:0] temp_b; integer i; Always@(aorb ) begin tempa=a; tempb=b; endalways@(tempaortempb ) begin temp_a={32'h00000000,tempa}; temp_b={tempb,32'h00000000}; for(I=0; i 32; i=i 1 ) begin temp_a={temp_a[62:0],1'b0}; if(temp_a[6:32]=tempb ) temp _ a=temp _ a-temp _ b 1’B1; elsetemp_a=temp_a; end yshang=temp_a[31:0]; yyushu=temp_a[63:32]; endendmodule testbench:

` time scale1ns/1 nsmoduleint _ div _ TB; reg [31:0] a; reg [31:0] b; wire [31:0] yshang; wire [31:0] yyushu; initialbegin#10 a=$random () 000; b=$random () 00; #100 a=$random () 00; b=$random () 0; #100 a=$random () 0; b=$random (; #1000; endint_divdiv(.a(a )、 b )、 yShang )、 yYushu ); initial begin $fsdbDumpvars (; $dumpvars (; #1000 $finish 结束模块波形:

上述写法其实不是一个好的写法。 这是因为,纯组合逻辑的实现有很大的延迟,锁存器可能会被集成。 因此,将其设计为时序逻辑是更好的选择。 详见下篇《Verilog --任意整数除法器(二)》。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。