国科大高等数字集成电路大作业,利用verilog实现四阶复数矩阵求逆。
已知4×4的复数矩阵A,A的逆矩阵为4×4的复数矩阵B, 且满足A*B=I,这里I为4×4的单位矩阵。
要求设计一个矩阵求逆时序逻辑电路,支持计算4×4的复数矩阵求逆。模块内部可以采用串行或流水结构实现,能够处理多组输入数据。顶层模块名为cmat_inv。
注:输入各个数据a均为16 bit二进制补码形式,小数部分15 bit,取值范围(-1, 1);输出各个数据b均为24 bit二进制补码形式,小数部分15 bit,取值范围(-256, 256)。
设计要求:
- Verilog实现代码可综合,给出详细设计文档、综合以及仿真结果。
- 选择适合硬件实现且数值稳定的矩阵求逆算法
- 每组输入数据在模块空闲或上一次计算完成之后再输入。
- 计算过程进行适当精度控制,保证输出结果精确度,输出定点格式(精度范围)可以根据需要进行调整;当输入矩阵为奇异或接近奇异时,需要对计算结果进行相应处理。
设计思路:
对于复数矩阵求逆,可用如下公式运算:
若复数矩阵C=A+iB,则C的逆矩阵为:
因此将复数矩阵求逆转变为实数范围内的矩阵运算。
根据公式需要设计矩阵相乘和矩阵求逆两个模块,其中矩阵相乘采用直接相乘法,即前矩阵的行元素和后矩阵的列元素积的和作为新矩阵的元素,通过简单的编写即可实现。但在本题目中,还需要注意定点格式的问题,这一点将在后面提及。
矩阵求逆则采用分块矩阵法,其原理如下:
在本次实验中,我采用了第二个矩阵分解公式作为计算公式。除了分块矩阵法之外也可以用LU分解法来求逆矩阵。
因此对于四阶矩阵求逆又转化为二阶矩阵求逆和二阶矩阵之积的为题。这两个问题依照公式可迅速解决。
在实验中第二个问题是求矩阵的行列式以判断是否为奇异矩阵,在此采用的方法是代数余子式法,即:
如果行列式为0,则认为是奇异矩阵,最终结果输出零矩阵,如果不为0,则正常求逆。值得注意的是,由于在求逆过程中使用了分块矩阵法,因此除去四阶行列式不为0这一要求外,也应满足各个分块矩阵的行列式也尽量不为0,否则会导致求逆失败。
第三个问题是数据的输入问题,实验要求输入为16位符号数,小数部分15位,输出24 位,小数部分15 位。因此采用定点浮点数来解决这一问题。
例如实际输入0.5时,在代码中则输入0.5*2^15=16384。
在实验中,先对输入进行处理,拓展其符号位,使其为24位,小数部分15位,且取值(-1,1),以便后续处理。
对于加减法,直接运算即可,对于乘法,当两个数相乘时,例如(A*2^15)*(B*2^15),得到的结果是C*2^30。因此需要将结果右移15位以解决,同时需要保持符号位不变,最终得到的结果为C*2^15。
对于除法,采用的是在运算前先将除数左移15位的方式来解决,例如(A*2^15)/(B*2^15),先将除数左移15位,这样计算式为(A*2^30)/(B*2^15),这样得到的结果也是C*2^15。
在代码中,我并未对此重新编写一个模块来解决浮点数乘/除法问题,而是直接对数据进行处理以得到相同的结果。
仿真结果:
输入部分:
分别输入实部与虚部,例如程序中输入0.5*2^15=16384,代表实际中输入0.5。
输入矩阵为
0.5+0.5i 0.75+0.75i 0.5+0.5i 0.5+0.5i
0.5+0.5i 0.5+0.5i 0.75+0.75i 0.5+0.5i
0.5+0.5i 0.5+0.5i 0.25+0.25i 0.5+0.5i
0.25+0.25i 0.25+0.25i 0.75+0.75i 0.5+0.5i
输出结果:
分别表示输出的实部与虚部,例如程序中输出-65536,代表实际中输入-65536/2^15=-2,98304/2^15=3,32768/2^15=1。
对比网上的矩阵求逆计算器得到的结果,发现结果一样,可以认为实验成功。
当输入奇异矩阵时,比如实部行列式为0,是奇异矩阵。结果均会输出0。
总结与反思:经过这次大作业,我对verilog语法的理解更深一点了,通过自学掌握了之前不会知识,算这次代码算是编写过的最长的代码之一,虽然最终结果可以计算复数矩阵的逆矩阵,但是依然存在部分改进,比如四阶矩阵求逆可以采用矩阵分解法,或许可以求更高阶矩阵逆,也可以尝试使用LU分解法,更快的解决四阶矩阵求逆的问题。同时浮点数乘法部分也可以利用学到的快速乘法器来改进以提高运算速度,除法部分也可以设计相应的模块来提升整体性能。总之,我通过这次的大作业学到了许多,对我今后的学习工作都有很大的帮助。
代码部分:包括二阶矩阵求逆,求积,三级矩阵求行列式,四阶矩阵求积,求逆,求行列式和四阶复矩阵求逆的代码。代码附在txt文档中,请自行复制到程序中。
可以在我的主页中看到,附网址。
网址如下:
总代码:https://download.csdn.net/download/Karoski/88950339
四阶矩阵求逆:https://download.csdn.net/download/Karoski/88950353
四阶矩阵行列式:https://download.csdn.net/download/Karoski/88950361
四阶矩阵相乘:https://download.csdn.net/download/Karoski/88950358
注意以上代码均有对浮点数的要求