赛灵思
直播中

高颖

7年用户 180经验值
私信 关注
[问答]

在IP打包后出现真正的双端口BRAM问题的解决办法?

我正在研究直方图生成,作为视频处理管道的一部分。
在将程序框图打包为IP块之前,一切正常;
然而,在打包并将其放置在等效设计中之后,doutB会提供不正确的数据。
我正在使用此处的设计为1080p图像的单个通道实现256 bin直方图。
以下框图显示了我对720p图像的测试设置(使用74.25MHz的像素时钟):
Clk_wiz_0为dvi2rgb块生成200MHz参考时钟,clk_wiz_1为clk2x生成148.5MHz时钟,为clkIn90生成74.25MHz时钟,clkIn90是90度移位版本的像素时钟,用于切换weA和我的addrA寄存器
(addrA来自正在读入的像素的值)。
我有一个连接到addrB的8位计数器,它从0-255循环以验证块ram / histogram的输出。
从下面的波形可以看出,这种设计工作正常。
存储直方图数据。
AddrA从寄存器中获取每个像素的值,并使用它来访问内存中的位置,该位置递增1,然后写入相同的位置。
回读直方图数据。
EnA保持低电平,doutB递增以显示存储的值。
转到问题出现的地方,这是我正在打包的框图。
dinA,weA,doutA,addrA和enA都已经完成调试;
通常binOut将是唯一的输出。
这是我使用封装框图的设计。
Sw与有效视频信号进行AND运算以控制enA,同样,我有一个自由运行的计数器控制addrB。
当写入端口A时,端口A侧的所有内容都按预期工作,而doutB卡在输出值0- enB在这种情况下被绑定为高,因此doutB应显示存储的值。
问题出现在这里。在enA保持高电平的第一个周期内,doutB显示一个常数0.在enA下降并在下一个有效视频周期内返回高电平之后,doutB在上升时采用dinA(6)的值
enA的边缘并交替显示该值和0。
我的BRAM设置如下:独立真正的双端口RAM,公共时钟,最小区域,读/写宽度为21,读/写深度为256,两个端口设置为首先读取,两个端口使用en引脚,以及两个端口
有第一个针脚。
我已经尝试了多种变化而没有运气:当enA为低时将enB置为高触及切换,从clk_wiz_0生成2x和90 *移位时钟与从dvi2rgb块生成的像素时钟生成时钟,将BRAM设置为使用异步
/同步时钟,将dinB与0 /将dinB绑定到dinA,从头开始创建IP,并在每个IP和全局模式的OOC中合成设计。
详细设计显示BRAM原语端口上的所有内容都与我在框图中的连接方式相同。
我已经没有想法试图找到解决方案。
据我所知,这两个设计的功能相同,唯一的区别是直方图块包含在IP中。
我很感激有关修复或可能的错误来源的任何想法。
谢谢!

回帖(2)

李琴

2020-8-17 10:39:03
嗨@jtobin,
你尝试过模拟吗?
检查模拟结果:
- >首先在行为模拟中
- >然后在后期综合模拟中
- >然后在后期实施
这有助于找到问题的根本原因。
问候,
弗洛朗
FlorentProduct应用工程师 - Xilinx技术支持EMEA ------------------------------------------
--------------------------------------------------
----------------------------不要忘记回复,kudo,并接受作为解决方案。
举报

李丽

2020-8-17 10:55:49
我对它进行了模拟,发现了同样的问题。
在睡觉并回到设计之后,我意识到当我将其打包为IP块时,我将addrB设置为单宽度端口而不是8位。
愚蠢的错误,但它现在按预期工作。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分