简介
现如今设计上对速度的要求越来越高,而矩阵相乘含有大量的乘法和加法计算,造成计算时间长从而影响性能,本章节利用FPGA实现浮点型矩阵运算,可在极短时间内完成矩阵运算。
知识介绍
矩阵计算公式如下:
需要保证A的列(P)和B的行数相等才能做乘法运算。
前期数据准备
为验证代码功能是否无误,需要事先准备一组数据作为仿真使用,例如实现C=A*B的矩阵,首先使用DeepSeek生成A矩阵和对应的16进制浮点数,如下图所示:
DeepSeek将浮点数转换成16进制表示,转换如下(IEEE 754 格式):
矩阵 A 的十六进制值
值 | 十六进制表示 |
---|---|
1.0 | 0x3F800000 |
2.0 | 0x40000000 |
3.0 | 0x40400000 |
4.0 | 0x40800000 |
5.0 | 0x40A00000 |
6.0 | 0x40C00000 |
7.0 | 0x40E00000 |
8.0 | 0x41000000 |
9.0 | 0x41100000 |
10.0 | 0x41200000 |
11.0 | 0x41300000 |
12.0 | 0x41400000 |
13.0 | 0x41500000 |
14.0 | 0x41600000 |
15.0 | 0x41700000 |
16.0 | 0x41800000 |
17.0 | 0x41880000 |
18.0 | 0x41900000 |
19.0 | 0x41980000 |
20.0 | 0x41A00000 |
21.0 | 0x41A80000 |
22.0 | 0x41B00000 |
23.0 | 0x41B80000 |
24.0 | 0x41C00000 |
25.0 | 0x41C80000 |
26.0 | 0x41D00000 |
27.0 | 0x41D80000 |
28.0 | 0x41E00000 |
29.0 | 0x41E80000 |
30.0 | 0x41F00000 |
31.0 | 0x41F80000 |
32.0 | 0x42000000 |
33.0 | 0x42040000 |
34.0 | 0x42080000 |
35.0 | 0x420C0000 |
36.0 | 0x42100000 |
矩阵B如下:
矩阵 B 的十六进制值
值 | 十六进制表示 |
---|---|
0.1 | 0x3DCCCCCD |
0.2 | 0x3E4CCCCD |
0.3 | 0x3E99999A |
0.4 | 0x3ECCCCCD |
0.5 | 0x3F000000 |
0.6 | 0x3F19999A |
0.7 | 0x3F333333 |
0.8 | 0x3F4CCCCD |
0.9 | 0x3F666666 |
1.0 | 0x3F800000 |
1.1 | 0x3F8CCCCD |
1.2 | 0x3F99999A |
1.3 | 0x3FA66666 |
1.4 | 0x3FB33333 |
1.5 | 0x3FC00000 |
1.6 | 0x3FCCCCCD |
1.7 | 0x3FD9999A |
1.8 | 0x3FE66666 |
1.9 | 0x3FF33333 |
2.0 | 0x40000000 |
2.1 | 0x40066666 |
2.2 | 0x400CCCCD |
2.3 | 0x40133333 |
2.4 | 0x4019999A |
2.5 | 0x40200000 |
2.6 | 0x40266666 |
2.7 | 0x402CCCCD |
2.8 | 0x40333333 |
2.9 | 0x4039999A |
3.0 | 0x40400000 |
3.1 | 0x40466666 |
3.2 | 0x404CCCCD |
3.3 | 0x40533333 |
3.4 | 0x4059999A |
3.5 | 0x40600000 |
3.6 | 0x40666666 |
C矩阵结果如下:
以上是DeepSeek生成的,多次重复计算还是有问题,所以DeepSeek的坑还是挺多的。
重新通过在线工具计算,计算结果如下:
再使用MATLAB将浮点数转换成16进制表示,如下图所示:
矩阵 C的十六进制值
每个浮点数乘法器和加法器都会占用DPS或者逻辑资源,在保证FPGA够用的条件下尽可能地提高运算速度,本设计使用36个乘法器,5个加法器做高速运算。
以上浮点数转16进制可通过网址在线进制转换-IEE754浮点数16进制转换做验证。
FPGA代码这里不做提供。
FPGA仿真
仿真结果如下:
对比仿真结果和MATLAB的结果一致,验证无误。