快速乘法器的设计(含verilog源码)

前言

  截止2022年2月15日,中国科学院大学《高等数字集成电路分析及设计》课程终于完结,所以我计划分享几个自己完成的实践作业,供大家交流学习。

设计收获

  • 对booth编码,wallace树,超前进位加法器原理有了充分的认识
  • 体会到了设计的巧妙性——booth编码后对进位值的处理
  • 学会了用verilog编写支持随机对比测试的testbench

快速乘法器设计题目

  实现快速乘法器组合逻辑,要实现的功能如下:
  输入为两个16位有符号数,输出32位相乘结果。要求采用Booth编码和Wallace树型结构。
  计算例子:
0110000010000000 * 1000000000000001 = 11001111110000000110000010000000
(24704) * (-32767) = (-809475968)
0x6080 0x8001 0xcfc06080
  顶层模块名为mul_tc_16_16,输入输出功能定义:

名称 方向 位宽 描述
a I 16 输入数据,二进制补码
b I 16 输入数据,二进制补码
product O 32 输出乘积a * b,二进制补码
设计要求:
  Verilog实现代码可综合,逻辑延迟越小越好,给出综合以及仿真结果(参考ASIC综合结果:SMIC 55nm工艺下工作时钟频率大于500 MHz)。

快速乘法器设计实现

原理

booth编码原理

  简单理解就是,把乘数中的每一个1看成“+2-1”。具体的数学原理及两位booth编码的实现逻辑如下:(为方便,这里引用计算机体系结构中PPT以32位数为例进行说明)


将上述逻辑看作译码器,其译码逻辑可以整理如下:

快速乘法器的设计(含verilog源码)_第1张图片
对应的电路实现逻辑就是这样的:

快速乘法器的设计(含verilog源码)_第2张图片

wallace树原理:

快速乘法器的设计(含verilog源码)_第3张图片
  下面展示了在分析8个1位的数使用wallave树压缩的实现(6个全加器和1个半加器),其对应的就是程序中mul_tc_16_16模块的实现逻辑。

快速乘法器的设计(含verilog源码)_第4张图片

32位先行进位加法器原理

  块内并行,块间并行的32位加法器实现原理。
  注意这里引用自《计算机体系结构》课程的PPT,在实现时发现红框部分标记得不够严谨,正确的标记应该是c31-29 c27-25 c23-21 c19-17 c15-13 c11-9 c7-5 c3-1,而剩余的进位输出来自第二层、第三层。

快速乘法器的设计(含verilog源码)_第5张图片

仿真(iverilog)

  这里使用verilog自带的有符号乘法运算和自己实现的16位乘法器结果结果进行对比来验证实现逻辑的正确性。这里输入了20组随机数进行测试,全部通过。

附录

源码获取见原文底部

你可能感兴趣的:(硬件开发,fpga开发)