- 实验目的
Verilog实现乘法用多种方法,可以直接使用官方现成的IP,也可以自己写RTL代码。本系列研究Xilinx乘法器IP核的配置使用方法、不同配置下资源占用情况,以及和自己设计的RTL多级流水乘法器对比,本文只针对Xilinx Multiplier IP的使用情况和不同配置下资源占用情况进行分析,下一篇文章将对比不同流水情况下的情况。
实验代码及测试代码:
- 实验知识点
1、Multiplier的配置:对于Multiplier IP核的配置还是比较简单的,个人觉得注意以下几点就行了。
Data Type:根据自己输入数据是符号数据还是无符号数据进行选择;
Width:输入数据位宽,这个就根据自己的情况设置了;
Multiplier Construction:这个选项是来设置Multiplier是用哪种片上资源来实现(DSP48 or LUT),这需要结合你自己的工程考虑了,如果片子里DSP资源比较紧张,那就选择LUT构成乘法器;LUT资源紧张则可考虑用DSP48来实现;
Optimization Options:这个就牵扯到速度与面积的选择了,这个需要根据具体情况具体来说,本实验没有仔细研究,可参考IP的使用说明书。
Output Product Range:这个可以默认就行,我觉得官方应该比你考虑的周到。
Pipeline Stages:为了提高性能,这个值最好>1,本实验会研究不同配置下的资源及和自己编写的流水代码做对比。
- 实验1: Multiplier Construction:DSP48
1.IP配置情况:
Data Type:signed
Width:16
Optimization Options:Speed optimization
Output Product Range:31
Pipeline Stages:1
2.代码仿真
代码端口:
仿真波形:
其中波形标红:o_data是IP核输出结果;result是仿真代码计算的结果,通过打印信息可以看出IP输出结果和仿真结果一直。
资源使用情况:综合后的结果
- 实验2: Multiplier Construction:LUT
1.IP配置情况:同上
2.代码仿真:同上
代码端口:同上
仿真波形:
资源使用情况:综合后的结果
- 实验总结
1.使用DSP48和LUT构成乘法器计算在基本配置相同的情况下结果相同;
2.在使用Verilog乘法计算符(*)时,一定得定义清楚输入数据是signed还是unsigned,因为不指明的话默认是unsigned型乘法。
3.仿真时initial块中的代码是按顺序执行的,每行代码执行完才进行下一行的执行,虽然时间差很小(可忽略)但是一定得小心,如果不注意就会出现错误的结果。
4.仿真中一般都使用阻塞复制(每行代码执行都会占用有很小的时间),但是为了实现打一拍的作用可以使用非阻塞复制。
仿真代码中需要注意的部分: