在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5757|回复: 13

[求助] 用FPGA读写SDRAM的时候,如何隔离数据输入和SDRAM输出???

[复制链接]
发表于 2012-3-5 16:10:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 kleist 于 2012-3-5 16:20 编辑

我在FPGA里面写了一个模块A,它的输出端口Dout连接到外部SDRAM芯片的数据线DQ上,负责往SDRAM里面写数据。

还写了一个模块B,也在FPGA里面,它的输入端口Din也连接到SDRAM的DQ上,负责从SDRAM里面读数据。

现在的问题是,当Din从SDRAM里面读数据的时候,Dout也在输出数据,虽然这时的数据是无效的,但是它和SDRAM的引脚DQ出来的数据造成冲突了

(我本来想在Dout和Din之间加一个三态门,但是发现FPGA内部没有三态门)

请问这里该怎么设计啊???
发表于 2012-3-5 16:58:24 | 显示全部楼层
FPGA内部是可以设计三态的。。

如果你用的是xilinx的fpga,那只要用个IOBUF就可以了,你可以查下ise的user's manual。

如果是altera的,那三态逻辑要自己写。端口定义成inout就可以了
 楼主| 发表于 2012-3-5 18:48:21 | 显示全部楼层
本帖最后由 kleist 于 2012-3-5 19:17 编辑




我是用的Alterla的 CycloneII ,不是xilinx。。。我确定CycloneII 内部是没法产生高阻态的(管脚可以)
我最开始的做法就是在Dout和Din之间加一个三态门,但是下载到器件上才发现,这个三态门被综合成了锁存器
当时的写法是这样的:
assign tri_out=sel? Dout : 16'hz;
然而,当sel变为低电平的时候,tri_out输出的不是高阻态,而是锁存住了Dout的值
发表于 2012-3-5 19:22:22 | 显示全部楼层
altera的是锁存器。。 确实是没有高阻态的。。 你这个是什么SDRAM? DDR2? 不是应该有命令控制的嘛。。 根据前面发的命令就知道后面的DQ线上出的数据该是读回的、还是写入的了。。  不了解你的设计具体情况啊。。
发表于 2012-3-5 21:38:11 | 显示全部楼层
双向数据传输都是通过管脚实现的。你的dram controller就应该有这样的逻辑。读写不会同时工作的。
 楼主| 发表于 2012-3-5 22:39:42 | 显示全部楼层


altera的是锁存器。。 确实是没有高阻态的。。 你这个是什么SDRAM? DDR2? 不是应该有命令控制的嘛。。 根 ...
catcat_2 发表于 2012-3-5 19:22




我这个是 SDR SDRAM。
是有命令控制DQ上的数据是读还是写,但是问题和DQ无关,因为我需要阻断的是内部的信号DOUT,在DQ输出的时候,它也在输出,那接受数据的DIN到底是接受哪一个?是DQ还是DOUT?因为它们是连在一起的,不能分开。如果分开了,就不能给DQ写数据。最好的办法就是用三态门产生高阻,但是现在没有三态门
 楼主| 发表于 2012-3-5 22:52:39 | 显示全部楼层


双向数据传输都是通过管脚实现的。你的dram controller就应该有这样的逻辑。读写不会同时工作的。
digitalimage 发表于 2012-3-5 21:38




读写是不会同时工作
我重新描述一下问题:现在有三根线,Dout写,Din读,DQ读写复用,它们是连在一起的,写SDRAM的时候,DQ是读,数据从DOUT到DQ和Din,这没问题。(注意现在是一个写接两个读,是不会出现错误的)
读SDRAM的时候,问题就来了,DQ变成了写,那现在DQ和Dout都是写,两个写连在一起了,导致Din不知道接受的是什么数据
(现在是两个写接一个读,出错误了)
如果能用三态门将其中一个写(即Dout)阻断,就没问题了,但是现在又没有三态门,因为Dout是一个内部逻辑。
如果SDRAM的读写线是分开的,就没问题了。我觉得只要是使用读写复用的器件,都会遇到这个问题的。
发表于 2012-3-6 09:13:01 | 显示全部楼层
你参考参考这个? DQ_data接你的DQ。。
---------------------------------------------------------------
input   oe;
input   clk;
input   [7:0] Dout;
output  [7:0] Din;
inout   [7:0] DQ_data;

reg     [7:0] a;
reg     [7:0] b;

assign DQ = oe ? a : 8'bZ ;
assign Din  = b;

// Always Construct

always @ (posedge clk)
begin
    b <= DQ_data;
    a <= Dout;
end
-------------------------------------------------------
发表于 2012-3-6 10:10:37 | 显示全部楼层
回复 7# kleist
我不是很理解,感觉你接反了。请参考你楼下的代码。
发表于 2012-3-6 10:27:13 | 显示全部楼层
回复 1# kleist
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-25 05:21 , Processed in 0.023140 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表