加班猫

人于人区别,就是远见不一样。

HDMI 2K 图像旋转90度算法

0
阅读(472) 评论(1)

HDMI2 旋转90度算法.pdf

      如果对于PAL的电视,640*320@30Hz的YCBCR旋转90°,使用SDRAM的存储图像,旋转九十度的算法。图像是按行写入,读取的时候是按列读取数据,考虑使用MT48LC32M16A2,Bank 地址(BA0, BA1),行地址A0–A12,列地址A0–A9。

 


       用SDRAM地址编码是 IMA_ADDR = BANK[1:0] + ROW[12:0] + COL[9:0]。写入数据,切换一行然后写入COL的页面写入,再切换ROW地址,再切换BANK地址。对于640×320的图像,COL地址A0-A9,是写入的图像640的列数据。ROW的地址A0-A8数据。

       读取数据的时候,切换行ROW[12:0]读取,读取一个数据,切换一行,效率极低。

 

       如果提高效率,BANK地址用来做图像的行数据,也就是IMA_ADDR = ROW[12:0] +BANK[1:0] + COL[9:0]。写入数据不会有变化,但是读取的数据的时候,可以切换bank模式,提高效率。

 

       但是还想提高效率。考虑前端数据写入不切换行是完全过于浪费,因存在写入fifo,以及图像的行消隐时间,所以将列地址分成更多份。BANK[1:0] + ROW[0] + COL[5:0]代表是写入图像列数据,需要切换2次行,在写入数据利用写入数据缓冲完成可以满足切换两次。而COL[9:6],代表是旋转90度的按列读取,可以同时读取16个数据,从0-15行第一列,COL[5:0]==1切换16-31行第一列。ROW[12:1]==1读取第二列。

        IMA_ADDR = ROW[12:1] + COL[9:6]+BANK[1:0] + ROW[0] + COL[5:0]。


      输入为HDMI  2K分辨率2560×1440@60Hz的时候,SDRAM效率完全不能满足,因为HDMI2.0已经是145M速率,SDRAM最高速率是125M。假设使用DDR3的芯片。速率是800M,16位。理论上说旋转90度,使用DDR3完全可以满足带宽要求。

      以MT41J64M16内存颗粒为例子,row地址是A[12:0],bank地址是BA[2:0],COL地址A[9:0],使用控制器的IMA_ADDR = ROW[12:0] +BANK[2:0] + COL[9:0],地址{BANK[0],COL[9:0]}为一行的图像的列地址。旋转90度的,读取数据从{ROW[9:0],BANK[2:1]},由于DDR存在突发模式,也就是说必须列写入或读取数据必须多个数据读取,DDR3可以一次性写入或者读取4或者8,但是不存在只能写或读一个数据能力。所以DDR3读取数据,一个CAS延时+每次要突发数据读取+预充电的时间。

 

所以必须考虑使用FPGA内部的BLOCKRAM。在写入数据时候,利用矩阵8 X 1440存储8行的显示数据,直接读取8行的第一列数据,写入DDR3中。由于写入到最后一行才能读取数据,所以用两个大的RAM进行乒乓操作避免数据覆盖问题。IMA_ADDR = ROW[12:1] + COL[2:0]+ROW[0]+BANK[2:0] + COL[9:3]。每次写入的数据ROW[12:1] +COL[2:0]为第0-2559行0列,ROW[0]+BANK[2:0]+COL[9:3]为0-2559行的列数,从0-1439列,。如果读取的数据的时候,可以COL[2:0],一次性读取0-7行数据,然后再切换ROW[12:1],读取8-15行数据。

 

       但是读和写DDR3操作还是需要每隔8个数据切换一行,所以为了提高效率。MA_ADDR = ROW[12:3] + COL[4:0]+ROW[2:0]+BANK[2:0] + COL[9:5]。每次写入的数据ROW[12:3] +COL[4:0]为第0-2559行0列,ROW[2:0]+BANK[2:0]+COL[9:5]为0-2559行的列数,从0-1439列。写入数据,COL[2:0]写入第0-7行的第0列数据,COL[9:5]==1为第0-7第1列数据,COL[9:5]==2为第0-7第2列数据,写入完成512列数据,ROW[2:0]增加1,切换到512-1023列数据,完成513,ROW[2:0]增加1,切换到1024-1440列数据。完成全部列后,改变COL[3],到16-31列数据。


       如果读取的数据的时候,可以持续利用读操作,可以COL[4:0],一次性读取0-31行0列数据,然后再切换ROW[12:3],读取32-63行数据0列数据。切换下一列,改变COL[9:5]==1数据。到0-31行1列数据。改变COL[9:5]==2数据,到0-31行2列数据

   

       估计很多屌丝问学这个有什么用,显示器直接倒过来不就可以了啊。懂这个工资可以加1万。你们满意了吗?

更多信息


  1. 陶大师,这个思路是你自己悟的,还是参考了某代码?话说我刚看到这个帖子感觉好惊讶.