FPGA|CPLD|ASIC论坛
直播中

0383

4年用户 3经验值
私信 关注
[问答]

FPGA乘除运算在内部怎么实现的?

在使用verilogHDL编程数据运算时使用了乘除运算不知道会出错不,求指导

回帖(3)

卿小小_9e6

2020-5-27 15:38:03
Verilog支持乘除运算。
01.常规数据注意数据的位宽,防止数据溢出。代码处理结果一般都是四舍五入的整数。
02.浮点数据(例如0x3f800000表示1)支持小数运算结果,具体精度与选取数据的小数部分位宽有关系。Vivado软件里有一个floating的IP支持该种运算,Quartus-ii不清楚。同时vivado里还可以调用DSP48进行数据运算。
03.常规数据可以表示小数,例如16bit位宽的数据,高八位表示整数,低八位表示纯小数。具体整数/纯小数的位宽自己定义。
04.为了提高运算速度(会导致占用更多资源)一般都会对数据进行位宽拆分,这个自己百度。
05.建议自己仿真一下。

  1. //-----------------------------------------------------------
  2.         wire        [31:00]         test_1  ;
  3.         wire        [31:00]         test_2  ;
  4.         wire        [31:00]         test_3  ;
  5.         wire        [31:00]         test_4  ;
  6. //        wire    real        [31:00]         test_5  ;
  7.         real                        test_5 =    3.1415926 ;
  8.         wire        [31:00]         test_6  ;
  9.         wire        [31:00]         test_7  ;
  10.         wire        [31:00]         test_8  ;
  11.         wire        [31:00]         test_9  ;
  12.         reg         [00:00]         ena     ;
  13.         reg         [31:00]         mem_addra ;
  14. //-----------------------------------------display         //下列描述不符合语法规则会报错
  15. parameter       PI  =   3.1415926       ;//PI              // parameter       PI  =   32'd3.1415926       ;//PI     
  16. parameter       A   =   3.61E2          ;//361.0           // parameter       A   =   32'd3.61E2          ;//361.0  
  17. parameter       B   =   3.61E-3         ;//0.00361         // parameter       B   =   32'd3.61E-3         ;//0.00361
  18.                                                            
  19. assign          test_1  =   PI          ;//   3
  20. assign          test_2  =   A           ;// 361
  21. assign          test_3  =   B           ;//   0
  22. assign          test_4  =   PI * 1000   ;//3142
  23. assign    #1000 test_6  =   test_1 * 1000   ;//3000
  24. assign          test_7  =   3 / 2.0  * 1000   ;//1500
  25. assign          test_8  =   0.9001 / 4.5  * 1000   ;//200
  26. assign          test_9  =   (0.9001 / 4.5 + 3/2.0)  * 1000   ;//1700
2 1 举报
  • 卿小小_9e6: 仿真代码不全,这只是用来理解四舍五入处理的情况。
  • 冷锋 回复 卿小小_9e6: 好久不来,最佳答案被你超过这么多了,哈哈,给你点个赞

郑生

2020-5-28 08:32:39
{:1:}{:1:}{:1:}
举报

麻军平

2021-4-9 23:37:36
乘法可以用fpga内部的 dsp来做。
除法的话,除数不大的情况下,可以用查表的方式先计算除数的倒数,然后再做乘法。
如果除数比较大的话,就要设计专门的除法单元了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分