关于浮点型矩阵加速模块设计的感想

5的问题原因已经找到,是因为用了cache的原因,需要在操作寄存器的时候将基地址的最高位置1,参考http://www.cnblogs.com/crazybingo/archive/2010/11/26/1889253.html

本次设计3*3以下矩阵乘法和加法,完成但是遇到的问题值得思考。

 

1,本次设计工程中整体架构的思考因为3阶以下矩阵相乘有1行3列*3行1列,2行1列乘以1行两列等等形式共27种,若分别求解相当麻烦,根据矩阵运算的性质如要求1行3列*3行1列,可以将两个3*3的矩阵这样赋值:矩阵a的第一行赋为1*3的矩阵的值,其余为0,矩阵b的第一列赋为3*1的矩阵的值,其余为0,那么两个3*3的矩阵相乘后的第一个元素就是结果值。

2,乘法和加法过程中根据矩阵运算的展开式可以发现运算具有并行特点。此过程用9个加法器和9个乘法器并行处理。

3,设计采用状态机机构,一个初始态,当运算完成或没有运算的时候就处于初始态,一旦contrl信号启动运算则立即跳转到对应运算中去,运算完成返回初始态。

4,考虑到后期驱动编写的方便性,当运算完成后将输入矩阵寄存器清零。写驱动时只需要把不为0的元素写入,其他元素就自动为0,缩小了写入的时间。

5,设计过程中硬件模块很顺利,但是到了软件部分,出现了问题,第一个问题是对寄存器的读写采用了niosii那些事中的写法,即定义了结构体,结构体地址指向加速模块基地址,但是出现了奇怪的现象:如果单步运行,没有问题,但是如果直接运行则所有寄存器都没有写入数据,通过signal tap 查看发现,所有信号都在初始状态,但是如果换用iowr和iord函数就能够正常运行。此问题的原因暂时不清楚,怀疑用结构体操作的方法不可行。

6,设计软件的过程出现的另一个问题是float型数据的转换,网上找的方法,比如一个变量temp为float型 float temp=1.0; unsigned int* temp99=(unsigned int *)&temp; 

这样就把temp的类型转换了,temp原来为1.0经转换后*temp99=3f800000;标准的float型存储格式。

7,在灌输据时发现,用寄存器操作比用iowr和iord要快一点,当然前提是绕过cache直接读写寄存器的方法,但是发现用memcpy更快,时间约缩短为原来的1/8,并且更为重要的是,支持由sdram直接copy到外设,这就非常方便了。

 

posted @ 2014-12-23 15:40  lianjiehere  阅读(243)  评论(0编辑  收藏  举报