【连载7.3.3】3*3像素阵列的HDL实现
2赞申明:前面看不明白Bayer转RGB中3*3矩阵的小朋友,可以看看这里了。
Bingo当年在做这方面设计的时候,查询过很多资料,3*3阵列的获取,大概有以下三种方式:
(1)通过2个或3个RAM的存储,来实现3*3像素阵列
(2)通过2个或3个FIFO的存储,来实现3*3像素阵列
(3)通过2行或3行Shift_RAM的移位存储,来实现3*3像素阵列
不过经验告诉大家,最方便的实现方式,非Shift_RAM莫属了,都感觉Shift_RAM甚至是为实现3*3阵列而生的(只不过Altera和Xilinx的工具给了这个IP,ASIC木有,得自己用RAM来实现)!
首先介绍一下Shift_RAM,宏定义模块如下图所示:
Shift_RAM可定义数据宽度、移位的行数、每行的深度。这里我们固然需要8Bit,640个数据每行,同时移位寄存2行即可(原因看后边)。同时选择时钟使能端口clken。详细的关于Shift_RAM的手册参数,可在宏定义窗口右上角Document中查看,如下:
http://www.altera.com/literature/ug/ug_shift_register_ram_based.pdf
手册给出了一个非常形象的一位寄存示意图,如下所示:
看懂这个示意图,没有任何继续往下看手册的意义!!!直接上战场!!!思路是这样子的,Shift_RAM中存2行数据,同时与当前输入行的数据,组成3行的阵列。这里新建VIP_Matrix_Generate_3X3_8Bit文件,在此实现8Bit宽度的3*3像素阵列功能。具体的实现步骤如下:
(1)首先,将输入的信号用像素使能时钟同步一拍,以保证数据与Shift_RAM输出的数据保持同步,如下:
(2)接着,例化并输入row3_data,此时可从Modelsim中观察到3行数据同时存在了,HDL如下:
这里需要注意的是,本模块使用的Shift_RAM不仅仅通过LPM得到,Bingo对此作了手脚,即每行的深度通过宏定义输入,这样方便了仿真,以及未来不同分辨率之间图像的移植。打开Shift_RAM文件可见Bingo做的手脚,所以建议大家不要乱动!
在经过Shift_RAMd 移位存储后,我们得到的row0_data,row1_data,row2_data的仿真示意图如下所示:
数据从row3_data输入,从第3行的输入开始,便有了3行图像阵列的同时移位输出。从图像第三行输入开始,到图像的最后一行,我们均可从row_data得到完整的3行数据,即为实现3*3阵列奠定了基础。不过这样做有2个不足之处,即第一行与第二行不能得到完整的3*3阵列(至少需要三行数据)。但从主到次,且不管算法的完美型,我们先验证3X3模板实现的正确性。因此直接在行有效期间读取3*3阵列,机器方便快捷的实现了我们的目的。
(3)Row_data读取信号的分析及生成
这里涉及到了一个问题,数据从Shift_RAM存储耗费了一个时钟,因此3*3阵列的读取使能与时钟,需要进行一个clock的偏移,如下所示:
最后得到的matrix_p11、p12、p13、p21、p22、p23、p31、p32、p33即为得到的3*3像素阵列,仿真时序图如下所示(新架构没有*_clken):
(5)完整的Bingo版VIP时序
前面Bingo说过,所有Video_Image_Processor包含的图像处理架构,均用统一的Bingo版时序,因此这里3X3的像素阵列生成也不例外。前面Shift_RAM存储耗费了一个时钟,同时3*3阵列的生成耗费了一个时钟,因此我们需要人为的将行场信号、像素使能读取信号移动2个时钟,如下所示: