Board logo

标题: Xilinx实现基于BlockRAM的高效移位寄存器 [此博文包含图片] [打印本页]

作者: 苹果也疯狂    时间: 2015-8-26 10:25     标题: Xilinx实现基于BlockRAM的高效移位寄存器 [此博文包含图片]

Xilinx使用block ramRAM_based shiftregister实现图像行存储(Video LineStroe)


-对应altera altshift_taps


详细可见:
http://www.altera.com.cn/literature/ug/ug_shift_register_ram_based.pdf

Xilinx 具体实现参考文档 Implementingand Testing Efficient Video Line Stores

http://www.xilinx.com/products/boards/s3estarter/files/s3esk_video_line_stores.pdf


整篇文档下半部分 详细介绍了基于blockram的数据移位寄存。

摘要几点中心思想:


1.在任何情况下,深度较深的以为寄存都强烈建议使用block ram


思路如上图所示,但实现不推荐用这么多D触发器,也不推荐使用SRL16 之类的slice级别移位寄存器。


2.对于(例如图像处理)分多通道时,不用拘泥于单通道对应单block ram


Block ram 9bit1920深度。输入格式为R10 G10 B10 ,如上图最大化利用位宽。


3.对于SDP 以及TDP 模式blockram应用的启发。


对于每一个port在读写都是全双工的。当使用TDP模式时,相当于一个Block RAM可以实现2路同时读,2路同时写的quad portmemory。

设定为read_first模式时,(同时,EN=WE=1)可以产生如下时序:


如此可知,控制每个port的地址位进行递增,便可以实现一个tap(引用altera的概念)


此时的硬件结构如上图


此时的时序如上图

这边需要注意的是,假定一行16个像素,1 17 对应。每列的像素需要对齐。
如果地址为16进制,那么117会差一个时钟周期,所以地址必须是15进制。
结论,地址位 (行像素数-1)进制。

4.使用EN引脚来过渡图像fly-back(个人觉得可以理解为行消隐blanking)而非WE

在遇到fly-back我们所需要的时序如下:


当使用WE引脚来做使能时,时序如下:


通过时序图对比直观反映了在使用WE引脚作为选通信号时,会过早的read出下一行第二个数据。

5.由于blockram的深度是相对固定的,必须评估ram的使用率。
在文档中详细介绍了各种位宽和深度。这边只列举一个对比启发增加使用率的思路。


1)当图像宽度为1024,位宽为18bit时,正好对应18位宽的block ram 级联成1024深度。


此时硬件结构如上,右边英文告诉你每8bit会有1bit奇偶位,其实就是普通的1bit

这个时候地址位控制为03FE1022)使用了1023个地址位,最后一位地址永远用不到,正是为了前面提到过的每列数据对齐。


注意,这边的1022是计数器的最后一位,1023说明移位有1023个状态,1024是一行像素数,不要相互混淆。


这个时候,得出的结论是

2)当行像素数为768时,同样使用的是1024深度的block ram
此时,只会使用前面的767个地址,后面的地址就浪费了,所以要想办法再利用后面的257个地址。方法如下:


因为768 = 256 x 3那么 后面的地址可以组成一个 256深度x 3 6位宽移位寄存器。


硬件结构如上,下面说明的正是后面的存储空间的利用。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0