矩阵转置 FPGA

发布于 2019-09-26 作者 风铃 75次 浏览 版块 前端

http://hsanyi.blog.163.com/blog/static/55022325201141410240710/


矩阵转置,算是矩阵运算里头最常用也是比较简单的操作,其算法思想是比较简单的,



但是放到FPGA上来实现,我们要考虑的就没有那么简单了,



因为我们并不只是单单实现其功能,还用考虑速度和面积这两个因素;



由于矩阵转置中,没有涉及其他运算,比如乘、加等,涉及的主要是移位,因此,个人认为可以着重考虑面积这个因素;



这里采用了折叠的设计思路,



首先根据3×3矩阵与其转置矩阵间元素的关系,列出了元素的寿命表,分析寿命图,主要是因果违例,以此得到最小寄存器的个数—4个。



寿命分析时,也可以采用循环寿命图,这个更加简单一些;



接下来采用“前向后向”寄存器分配技术,得到寄存器分配表,并根据寄存器分配表,绘制最终的电路。



参考图1-4:



 



Cycle




Input




R1




R2




R3




R4




Output




0




a




 




 




 




 




 




1




b




a




 




 




 




 




2




c




b




a




 




 




 




3




d




c




b




a




 




 




4




e




d




c




b




a




a




5




f




e




d




c




b




d




6




g




f




e




b




c




g




7




h




c




f




e




b




b




8




i




h




c




f




e




e




9




 




i




h




c




f




h




10




 




 




i




f




c




c




11




 




 




 




i




f




f




12




 




 




 




 




i




i



最终电路:






 Synplify Pro综合的电路:







 Modelsim仿真波形:







 




Synplify Pro 综合后信息:










可知,整个设计占用芯片资源不多,而且工作频率已经达到443.6MHz;当然,这里采用的是折叠的设计方法,着重考虑的是芯片面积,同样的,也可以采用展开或者流水线/并行的设计技术,增加面积来提高工作速度。






这是测试数据(IEEE-754):




inpX_int




inpX_ieee




oupX_int




oupX_ieee




1




1065353216 




1




1065353216 




2




1073741824




4




1082130432




3




1077936128 




7




1088421888




4




1082130432




2




1073741824




5




1084227584




5




1084227584




6




1086324736




8




1090519040




7




1088421888




3




1077936128




8




1090519040




6




1086324736




9




1091567616




9




1091567616




这里实现的是3×3矩阵转置,接下来,考虑实现M×N矩阵转置。



前向后向寄存器分配共有6个步骤:


1.通过寿命分析确定最小寄存器数目,如果在给定周期里有多个输入变量,这些变量就分配到多个不同的寄存器,原则是寿命越长的变量所分配的寄存器越靠前,寿命越短的变量所分配的寄存器越靠后(靠近出口);其实,这些寄存器构成了一个非严格意义的FIFO。3x3矩阵转置需要4个寄存器 R1/R2/R3/R4,构成一个非严格FIFO,R1->R2->R3->R4,R1最靠前,R4最靠后。


3.每个变量都以这种前向的方式分配,直至变量消亡或者达到末尾寄存器。前向分配的是指,如果变量a当前存储在寄存器i中,那么下一个周期变量a将移动到寄存器i+1,如果寄存器i+1不可用,那么变量a分配给第一个可用的前向寄存器。


4.因为分配是周期的,当前迭代l的分配在接下来的k*N+l迭代中会重复,因此,如果R_j在迭代l被某个变量占据,则R_j在所有k*N+l迭代都被该变量的新版本所占据。


5.对于到达末尾寄存器但仍未消亡的变量,可以计算它的剩余寿命,然后基于先到先得的原则,将这些变量以后向的方式分配给寄存器。如果后向分配中有多个寄存器可用,首先尝试选择在末尾寄存器和该寄存器之间已进行过后向分配的寄存器。如果有不止一个寄存器符合后向分配,在候选寄存器中,选择有最少但足够多的前向寄存器来完成变量分配的那个寄存器。一个变量经过后向分配后,再进行前向分配,直至消亡或再次到达末尾寄存器。这个步骤中需要注意的几点是:


l在后向分配中,尽可能使用已经使用过的后向路径。从硬件电路的角度思考,减少后向路径的类型,有助于简化硬件连线、控制器和选路器。要是存在多条不同的后向路径,那意味着硬件上有多条相应的“传输通道”,用于将变量从末尾寄存器转存入某一个靠前的空闲寄存器。


6.按要求重复步骤4和5直至所有变量分配完成。
收藏
暂无回复