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位宽移位寄存器。
硬件结构如上,下面说明的正是后面的存储空间的利用。
来源:https://blog.csdn.net/weixin_42625444/article/details/102729309