Xilinx-BlockRAM-高效移位寄存器

匆匆过客 提交于 2019-12-02 06:19:39

 

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

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

 

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

 

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

 

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

 

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

 

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

 


 

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

 

此时的硬件结构如上图

 

此时的时序如上图

 

这边需要注意的是,假定一行16个像素,1 与 17 对应。每列的像素需要对齐。

如果地址为16进制,那么1与17会差一个时钟周期,所以地址必须是15进制。

结论,地址位 (行像素数-1)进制。

 

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

 

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

 

 

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

 

 

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

 

5.由于blockram的深度是相对固定的,必须评估ram的使用率。

 

在文档中详细介绍了各种位宽和深度。这边只列举一个对比启发增加使用率的思路。

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

 

 

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

 

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

 

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

 

这个时候,得出的结论是

 

2)当行像素数为768时,同样使用的是 1024深度的block ram。

此时,只会使用前面的767个地址,后面的地址就浪费了,所以要想办法再利用后面的257个地址。方法如下:

 

 

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

 

 

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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!