微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 请教-------双口RAM的疑惑!

请教-------双口RAM的疑惑!

时间:10-02 整理:3721RD 点击:
问题描述:新项目中,DSP要与FPGA进行数据交互,一开始通过寄存器方式来实现,考虑到时钟异步担心出现亚稳态问题(DSP读取时FPGA正好在更新数据),查询资料貌似双口RAM 能解决此问题,于是用了真双口RAM核,在DSP侧和FPGA侧编写了测试程序,检验发现还是会出现数据交互错误。而且错误情况是:读取到的是上一次的值。
请教各位:
1、真双口RAM能解决对于不同端口: A和B端口数据交互的冲突问题吗?(为了避免同时对同一地址单元写操作;本人已故意将地址划分:0~127单元DSP只读FPGA只写;128~255单元DSP只写FPGA只读)

2:通常大家都是怎么解决MCU和FPGA间数据交互的?希望能给点意见!

本人初学者,等待大侠的出现!

可以利用类似DMA的操作,给RAM增加一个标志位,FPGA每写一次,就将标志位改成1,DSP不停的读取(或者中断的方式)这个RAM,每读到一个标志位是1的就表示FPGA写过,那么将数据读出来,然后再将标志位写0.如此往复。

感谢acgoal 小编!我按照您的思路再考虑一下!顺便再请教acgoal :目前FPGA侧的数据更新我用了一个类似1ms的任务在刷新(读该读的寄存器数据,写改写的寄存器数据);DSP内的任务是1ms的。个人感觉这种办法不是很好,不知道acgoal 怎么看待?
请教:怎么考虑FPGA刷新双口RAM数据?

你的ram是read first模式的吧,所以每次读写冲突的时候都读到旧值。把你的ram选成write first模式就可以了,这样每次冲突的时候就都是先写再读,就都是新值。

对于同一块RAM的调度的话,
1. 你用地方法是基于时间的,每个设备各占用1ms的时间(如果我没有理解错的话),但是这样不够保险,因为每个设备,特别是DSP,数1ms的时间不是那么准确,不能保证和FPGA是不是有冲突。
2. 还有另外一种方法,就是可以用我之前说的握手,FPGA在某段时间内处理RAM,处理完毕之后,产生中断信号,告知DSP,那么DSP就知道FPGA处理完了,轮到DSP处理了,等DSP处理完毕之后。再写一个寄存器(或者是标志),告诉FPGA,那么FPGA又知道DSP处理完了。就一直这样循环下去。



    是的!是设置的read first!可是如果是write first的话,我仔细阅读过xilinx的双口RAM的资料,如果是write first的话对于另外一个port的数据是无效的!
    不知道您的意思是------?

学习一下!


       应该不是无效的吧。你看看xilinx的ug363和383。我手边上没有模型,不然做个功能仿真就知道了。
------------------------------------------------------
    During a write operation, the content of the memory at the location specified by the address on the ADDR inputs is replaced by the value on the DI pins and is immediately reflected on the output latches (in WRITE_FIRST mode); when Write Enable (WE) is High.

使用异步FIFO



    谢谢您的回复!
本人是初学FPGA,未使用过FIFO。请教您:FIFO应该是按照次序来存储和读取数据的吧?如果要读取某个值,是不是要将前面的值都要读一次?



   感谢您的指导!忘了说明本项目用的FPGA器件为xc3s400a-4ft256!
   在Using Block RAM in Spartan-3 Generation FPGAS (XAPP463 (v2.0) March 1, 2005)文档有点老 ;
As a dual-port RAM, the block RAM allows both ports to simultaneously access the same
memory cell. Potentially, conflicts arise under the following conditions.
1. If the clock inputs to the two ports are asynchronous, then conflicts occur if clock-to-clock
setup time requirements are violated.
2. Both memory ports write different data to the same RAM location during a valid write cycle.
3. If a port uses WRITE_MODE=NO_CHANGE or WRITE_FIRST, a write to the port
invalidates the read data output latches on the opposite port.
If Port A and Port B different memory organizations and consequently different widths, only the
overlapping bits are invalid when conflicts occur.
If Port A and Port B different memory organizations and consequently different widths, only the
overlapping bits are invalid when conflicts occur.
这个是针对的另外个端口的冲突说明!



    那你不要用真双口ram吧,用两个简单双口ram去乒乓操作吧。就跟你说的一样,dsp操作ram0的时候,fpga操作ram1,反之依然。 这样就可以了。


对,FIFO是需要按顺序读写,一般来说,假设DSP发送数据给FPGA,都是期望先发送的先被收到,除非有特殊需求。FIFO在这里的作用有两个:
1. 解决跨频问题。
2. 解决读写不同步的数据缓冲问题。

当FIFO满时不能写入,当FIFO空时不能读出,可以保证读写不会出错。FIFO的深度需要根据你读写速度和一次需要处理数据量的大小来决定。

到底使用几个FIFO,可以根据需求来决定。
举个例个,DSP透过FPGA上的VGA控制器为显示器绘图
使用两个FIFO会比较好,FIFO1, FIFO2,每个FIFO的深度都是一帧数据。
1. DSP写FIFO1,而FPGA从FIFO2读取数据
2. FIFO1被填满后,DSP写FIFO2,而FPGA从FIFO1读数据。
3. 重复1
4. 重复2
........
这其实就是乒乓操作。

假设FPGA也需要发送数据给DSP。
则需要另一组FPGA写而DSP读的FIFO。

再说双口RAM问题:
1. 可以解决亚稳态这类问题,但由于读写时钟的不一致性,读错数据是必然的,因为双口RAM没有做读写控制(即什么时候可以写什么时候可以读),如果加了这些,那其实还是FIFO。
2. 两个双口RAM,一个FPGA写,一个DSP写,这只是双向而已,并不是乒乓操作。



    非常感谢vongy !讲解的很详细!我按照FIFO考虑一下!再次感谢!感谢eetop!

好帖!学习了

上一篇:时序约束求教
下一篇:xilinx的DNA加密

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top