同步双口RAM问题求教
异步双口RAM是通过busy线、中断、信号灯的方式来避免出现存储单元竞争的问题,可是同步时序的双口RAM上没有上述三个机制,那它是如何来避免同一存储单元的读写竞争呢? 有谁知道呢,不甚感激! FPGA的双口RAM没有仲裁机制,避免不了 回复【2楼】h2feo4 无机酸-----------------------------------------------------------------------
不管是FPGA也好,CPLD也好,实现双口RAM的方式也不外乎同步和异步两种,实际中异步用的较多;不管异步还是同步都有同时访问同一单元地址冲突的问题,这个是必须要避免的,不可能避免不了;如果不避免,必会出现数据错误。
同步里面有个计数器功能,难道是通过这个来避免的么?求真相啊! 回复【3楼】vdakulav
-----------------------------------------------------------------------
无论同步还是异步,都没有仲裁机制,它根本不保证数据正确,因为根本也不存在"正确"的解
他只保证冲突写入不会造成物理损坏,不会污染其它地址的数据,不影响下一周期的写入 回复【4楼】h2feo4 无机酸
-----------------------------------------------------------------------
唉,推荐你看看cy7c018的datasheet!
FPGA块里没有,是因为这部分较为灵活,推荐用户自己编程,而不是没有!
双口RAM逻辑一个最大的注意项就是:避免同时对同一单元地址又读又写,这是最基本的,什么物理地址,什么污染,我不是做芯片的,我不关心! 回复【5楼】vdakulav
-----------------------------------------------------------------------
我一直说的是FPGA里没有,要用户自己实现和没有有什么区别?
你说的芯片不是FPGA,要非要在这里问,我只能说,您发错版了 回复【6楼】h2feo4 无机酸
-----------------------------------------------------------------------
FPGA是要让你来写,你不懂就不要再说啦。再说了,人家没有,设计者就不考虑了?你纠缠了半天,只表达了,没有就是没有,难道人家没有,我们就不管了?
很多设计者们根据异步的双口RAM的仲裁处理方式,在FPGA中实现了,现在我就想知道同步的该如何避免,你和我叽歪了半天,不是说,没有就是说发错版,你这样有意思么? 很佩服楼主的理解能力和狡辩勇气 回复【8楼】duzhang
-----------------------------------------------------------------------
项目中需要边采集边上报,因为有时钟信号,又涉及两种CPU访问同一存储器件的情况,所以首要考虑用FPGA实现的双口来实现,但是,出现的问题就是虽然有此模块,但是没有仲裁,也就是说,当两边在采集数据时,可能会出现同时对同一地址的读/存,现在必须要想个办法来解决,查阅了大量资料,发现对于异步的有很好的解决办法,同步的却没有,因此有此一问,不知道如何利用同步的机制来避免!
你所谓的狡辩从何而来?
你知道,我很感谢你的帮助,如果不懂,就静静的和我一看看看有没有高手做过同步的吧,废话就不要说了! 回复【7楼】vdakulav
-----------------------------------------------------------------------
把 -双口RAM的存储单元- 和 -DPRAM+控制逻辑构成的芯片- 混在一起讨论本身就有问题。
DPRAM存储单元本身,如*h2feo4 无机酸*所说,自身无任何控制逻辑,但是其本身保证必要的特性:比如同时双口同时写,无物理损坏;同地址一读一写,会有已经定义的行为,etc。
基于DPRAM单元的特性,完成对应的控制逻辑就应该是你指的“同步双口RAM”了,异步怎么干同步也可以怎么干,芯片是否集成对应逻辑与怎么完成这个操作此事无关。
同步引入的问题就是单时钟vs多时钟;多时钟下两个时钟的关系等等。双时钟不相关的情况就是退化到异步DPRAM;其它好于这个的情形,可以优化逻辑提高操作速度。我理解是因此Sync DPRAM不提供更为完善的功能。
至于你说的DPRAM中的计数器,据我看过的IDT的手册,那个是地址发生,就是连续访问DPRAM单元的时候,可以不用外部地址了,用那个直接发生地址。似乎某些情况下延迟可小。 回复【10楼】dr2001
-----------------------------------------------------------------------
很感谢。
因为DRAM还有刷新问题,所以不想用。至于-双口RAM的存储单元- 和 -DPRAM+控制逻辑构成的芯片一说,可能是我没有说清楚,这不是混用,查看普通的已经集成好的cy7c018的datasheet就可以知道,同步双口里面好像就没有仲裁(对比,异步的,datasheet里面将仲裁讲的很详细),因此,我很奇怪同步的是如何来避免对同一地址的冲突的。 回复【9楼】vdakulav
-----------------------------------------------------------------------
异步的速度高到能在一个最小时钟周期内完成的时候,就可以直接拿来用于同步应用。
同步的另外一个问题是前级往往是流水线的,访问冲突了需要必要的方法暂停流水线,这个会麻烦。异步往往前级已经有类似的机制了。
总之的话,就是那句老话:具体问题具体分析。不止是硬件,还有软件上的,作为整体来考虑。
如果,用的双CPU系统是完全独立的,根本没有硬件Wait等可控信号,软件上也不愿意实现信号量等功能,那就基本无解。如果有信号就拿地址仲裁然后Wait就是。 回复【11楼】vdakulav
-----------------------------------------------------------------------
如无机酸所说,在外边由用户自行实现。和FPGA里干的事情几乎一样。时钟的关系以及访问DPRAM的人的时序要求,不同的应用差太多,厂商也没办法设计一个逻辑通吃所有情况。
如果DPRAM阵列本身的特性满足你的要求,那么同步的DPRAM完全可以不要仲裁。。。如果用FPGA做,可以看FPGA DPRAM的手册。
与其纠结硬件上如何折腾此事并且保证足够的效率,不如通盘考虑软件硬件,寻求合理解决方案来的快捷简便。
另:DPRAM是Dual Port RAM的缩写,不是DRAM的缩写。不知道你的刷新从哪里来的。。。 回复【楼主位】vdakulav
异步双口ram是通过busy线、中断、信号灯的方式来避免出现存储单元竞争的问题,可是同步时序的双口ram上没有上述三个机制,那它是如何来避免同一存储单元的读写竞争呢?
-----------------------------------------------------------------------
讨论的口气别那么差......急就靠自己,谁叫你能力差.
你的ram在外部还是fpga内部
fpga内部没有这个问题
2个同时写入一个区域有意义吗?竟争什么? 同步何来竞争?仲裁是自己做的,因为读写操作前可以知道读写的地址!异步的问题就是时钟域不同,所以仲裁要ram来做。
不用太过关注这些,重点是根本没选对东西
用fifo就行了,当然很多异步fifo的确用的是异步双口ram 噢,如果是altera的FPGA,他的某些型号FPGA的Memory有read through write 的功能,当同步双口ram用的时候,如果某个clk,读写地址一样,用户可以设定电路的行为,决定当前读出的数据是新写入的那个还是刚被擦除的那个。如果FPGA的memory单元在物理上不支持该行为的设定,可以让quartus工具来添加一些LE辅助实现。
具体的实现请自己看quartus的手册,大概在Recommended HDL Coding Styles, 或是 Implementing Inferred RAM 那部分
可以自行google quartus read through write
不知道楼主是否说的是这个功能 其实同步双口RAM的冲突情况比较简单,无非是
1)两口同时写同一地址,不同的内容。结果是某口优先,或者是结果不确定。
2)一口读,另一口写同一地址。结果可能是
a.读口总是读到旧内容
b.读口总是读到写口新写进去的内容
c.结果不确定。
具体哪种情况,会随着FPGA的不同而不同,有的FPGA是固定的,有的允许你在生成RAM的时候选择。
至于LZ真正关心的两个数据源同时写一个RAM地址的情况,不是我们能够回答的,要看LZ的应用要求怎样的行为,是A设备占先,还是无所谓。
不管是怎样的情况,处理冲突这个功能已经超出了RAM本身提供的功能范围了,需要根据你的应用来决定。 弱弱的问一句,对于双端口SRAM,不需要时钟CLK,用Verilog编写这个程序双口SRAM时读写操作时该如何控制?我现在都用的是电平控制,现在一边可以,另外一边不可以,请各位大神赐教
页:
[1]