基于FPGA的32位ALU软核设计

时间:2011-02-28来源:网络

2.3 乘法模块
比较好的带符号数的乘法是布斯(Booth)算法。但是本模块既要实现有符号数运算,也要实现无符号数运算,用Booth算法反而复杂。综合考虑逻辑资源的使用和速度两个方面的因素,本设计采用下面的算法:不管是有符号数还是无符号数乘法,都转换成无符号数相乘,最后根据需要对计算结果进行转换。如果是无符号数相乘,乘积不作变化。如果是有符号数相乘,只有两位乘数符号不一样时才对乘的结果做处理,否则结果不变。乘积处理的方法是将乘积取反加1。假设乘数是32位数a,b,乘法主要通过移位和加法组成,设a=a31,a30…a0,如果ai=1则b向左移i位且右边添i个0,否则b不作变化,a中有多少个1就要进行多少次移位操作,最后将所有移位值相加既得a×b的值。乘法的仿真图如图3所示。仿真结果表示设计完全正确。32位有符号和无符号数乘法模块占用逻辑资源不到800 LE,且由于各种移位并发进行,故速度较快。


2.4 除法模块
目前运用VHDL进行乘法运算的研究较多,而除法只有少数学者研究。文中综合考虑速度和资源的占用,采取下列算法实现:对于32位无符号被除数a,先将a转换成高32位是0低32位是a的数temp_a。在每个周期开始时temp_a向左移动一位,最后一位补0,然后判断temp_a的高32位是否≥除数b,如是则temp_a的高32位减去b并且低32位加1,得到的新值仍赋给temp_a。如不是直接进入下一步。上面的移位、比较、减法要进行32次,经过32个周期后,运算结束,所得到的temp_a的高32位为余数,低32位为商。
对于32位有符号数的除法,采用的算法是将被除数与除数均变成无符号的32位数,紧接着的计算过程与无符号数除法一样,只是需要判断商和余数是正数还是负数。令,如果d=0则被除数与除数同为正数或者负数,最终商为正数。如果d=1说明被除数与除数符号相反,最终商为负数。被除数是负数时余数为负,否则为正。最后根据d的值对商作处理;如果d=0商不需任何处理,如果d=1则将商取反加1才是正确的结果。余数的调整则根据被除数的符号位进行。



3 结束语
文中在FPGA芯片上,利用VHDL语言设计了功能强大的32位ALU。由于ALU是CPU的重要组成部分,各类系统中都不可避免地需要ALU,因此本设计的应用泛围较广。

1 2

关键词: FPGA ALU 软核

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版