搜索
bottom↓
回复: 17

stm32 能否隔着CPLD读取SRAM?

[复制链接]

出0入0汤圆

发表于 2014-8-28 11:06:17 | 显示全部楼层 |阅读模式
我打算用STM32的FSMC隔着CPLD读取SRAM内的数据,不知道能否行得通?我用的语言是verilog HDL,  CPLD内不做任何逻辑只是做连线,将CPLD与stm32连接的管脚  在CPLD内部连接至  CPLD与SRAM连接的管脚,这些管脚我都设置成了inout,并且设置成了zz, 但现在我通过stm32读取sram的数据始终是0xFFDF,并且stm32发热严重(不开启读sram相关的功能就不会发热),明显stm32与sram没有通, 望各位大神帮我看看,程序如下:
input           rst;
input           clk;

inout [18:0]   sram_addr1;
inout [15:0]   sram_data1;      
inout          sram_we_n1;
inout          sram_oe_n1;
inout          sram_ce_n1;
inout [1:0]    sram_be_n1;

inout [18:0]   fsmc_a;
inout [15:0]   fsmc_d;     
inout          fsmc_ne;                //cs
inout          fsmc_oe;
inout          fsmc_we;
inout [1:0]    fsmc_nbl;

               
assign fsmc_a = sram_addr1;        //帧计数为奇时fsmc连接sram1,偶数场时连接sram2
assign fsmc_d = sram_data1;
assign fsmc_ne = sram_ce_n1;
assign fsmc_oe = sram_oe_n1;
assign fsmc_we = sram_we_n1;
assign fsmc_nbl = sram_be_n1;

assign sram_addr1 = 19'hzz;
assign sram_data1[9:0] = 10'hzz;
assign sram_we_n1 = 1'hzz;
assign sram_oe_n1 = 1'hzz;
assign sram_ce_n1 = 1'hzz;
assign sram_be_n1 = 2'hzz;

endmodule  

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-8-28 11:31:08 来自手机 | 显示全部楼层
如果时序ojk

出0入0汤圆

发表于 2014-8-28 11:51:19 | 显示全部楼层
你理解 CPLD 有误:

CPLD 里面的 “引线” 不是直接连过去,一个引脚到另一个引脚就成能成为“导线”的,尽管你将 IO 设置为 inout ,但是这需要时序配合才行。
建议看看 CPLD 的原理。

内部逻辑连接必须配合时序来指定方向,你需要配合 SDRAM 的控制脚控制 CPLD 的数据线方向,至于单向的信号,比如地址线、读写控制什么的可以指定为输入或输出单功能引脚,然后直接 assign。

出0入0汤圆

发表于 2014-8-28 12:04:12 | 显示全部楼层
楼上正解,CPLD或FPGA在使用双向IO口时,除了定义inout,还需要配合相应逻辑通道方向,我之前用过用三态门去控制,或者软件assign指定模拟一个三态门也可以。作为输出时,三态门使能,作为输入时,三态门断开。而且这个读写时序要是配合不好,可能会出现输出对输出的情况,就导致芯片发热了...

出0入0汤圆

发表于 2014-8-28 12:04:41 | 显示全部楼层
inout管脚是需要有信号来控制的
某一时刻可能是输入,也可能是输出,如何不加控制,恰好,mcu管教输出1,cpld管脚输出0,此时这根线上的电流就比较大,导致芯片发热.

出0入22汤圆

发表于 2014-8-28 12:23:54 来自手机 | 显示全部楼层
时序对了就能

出0入0汤圆

 楼主| 发表于 2014-8-28 13:34:27 | 显示全部楼层
本帖最后由 zq6220 于 2014-8-28 13:35 编辑
alcohol 发表于 2014-8-28 11:51
你理解 CPLD 有误:

CPLD 里面的 “引线” 不是直接连过去,一个引脚到另一个引脚就成能成为“导线”的, ...


  我只读的,data方向是单一的,所有的信号线方向都是单一的。    难道必须设置一个寄存器,cpld管脚输出时就必须连到寄存器上?  但这样的话似乎就会带来了时钟延迟了,拖慢的读取的速度了!  控制信号经cpld传输至sram会有一个cpld系统时钟周期的延迟,然后数据从sram经cpld到stm32又会有一个cpld系统时钟周期的延迟,是这样的吗?   有没更好的解决办法啊?

出0入0汤圆

发表于 2014-8-28 19:36:30 | 显示全部楼层
你要是绝对确定,以及肯定是单一的(尽管我不理解这么做是怎么回事,难道是双口RAM?),那么SRAM到MCU的逻辑,也就是MCU看上去的“读”逻辑,可以写死为单向的。(这仍有隐患——假如总线挂载其他器件,而且带来额外的功耗问题),CPLD约束的好的话延迟可以忽略不计,但是程序没写好,时序约束不好,就可能有很糟糕的延迟。
还有,CPLD内延迟,如果写对逻辑的话,异步触发,我没写过 SRAM 的,但是我猜测是可以不需要时钟的。这样带来的延迟主要是逻辑翻转的延迟和内部传输的延迟,不会很高,对 SRAM 来说,不算是问题。

总之,为了以策安全和降低功耗的目的,建议根据 时序,写一个 CPLD 的程序,而不是简单的连线——尽管有人说 CPLD 的作用就是粘合逻辑,但是 CPLD 可以做的更多。
程序上你可能声明了若干寄存器——比如暂存 DATA 的数据,但是实际上编译后很可能就被优化掉了一些,但也不能完全指望编译器。

出0入0汤圆

 楼主| 发表于 2014-8-29 16:02:01 | 显示全部楼层
alcohol 发表于 2014-8-28 19:36
你要是绝对确定,以及肯定是单一的(尽管我不理解这么做是怎么回事,难道是双口RAM?),那么SRAM到MCU的逻 ...

我现在把程序改了,但好像还是不行,经过了缓冲区的数据过不去,不知道怎么回事? 程序如下:
input           rst;
input           clk;
input                                write_read;

output [18:0]   sram_addr1;
inout [15:0]   sram_data1;      
output          sram_we_n1;
output          sram_oe_n1;
output          sram_ce_n1;
output [1:0]    sram_be_n1;

input [18:0]   fsmc_a;
inout [15:0]   fsmc_d;     
input          fsmc_ne;                //cs
input          fsmc_oe;
input          fsmc_we;
input [1:0]    fsmc_nbl;
wire [15:0]        fsmc_d_reg;
//reg [15:0]        sram_data1_reg;

assign sram_addr1 = fsmc_a;        //帧计数为奇时fsmc连接sram1,偶数场时连接sram2
//assign fsmc_d = sram_data1;
assign sram_ce_n1= fsmc_ne;
assign sram_oe_n1= fsmc_oe;
assign sram_we_n1 = fsmc_we;
assign sram_be_n1 = fsmc_nbl;

//assign fsmc_d_reg = 16'hfc84;
assign fsmc_d = write_read ? sram_data1 : 16'hz;
assign sram_data1 = write_read ? 16'hz : fsmc_d;

endmodule   


RTL视图如下:
      

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2014-8-29 16:24:07 | 显示全部楼层
alcohol 发表于 2014-8-28 19:36
你要是绝对确定,以及肯定是单一的(尽管我不理解这么做是怎么回事,难道是双口RAM?),那么SRAM到MCU的逻 ...

我发现信号经过了缓冲区后的数据信号由低变高可以,但是由高变低却不可以;没有经过缓冲区的信号信号由低变高很迅速,但是由高变低却较缓慢,这是什么原因啊?

出0入0汤圆

发表于 2014-9-1 08:35:12 | 显示全部楼层
一、代码还没有改为带有时序控制的版本;
二、你看看管脚的设置对不对,工作方式

出0入0汤圆

发表于 2014-9-4 10:31:52 | 显示全部楼层
发热,我觉得是IO没配置好,两个都设置成输出,其中1个拉低,另外一个就可能发热

出0入0汤圆

 楼主| 发表于 2014-9-23 14:18:55 | 显示全部楼层
zsdshuai 发表于 2014-9-4 10:31
发热,我觉得是IO没配置好,两个都设置成输出,其中1个拉低,另外一个就可能发热 ...

io的配置不知道怎么丢了,重新配置一下就可以了,但是发现不太稳定,RTL视图里面有些类似接口的东西不知道是什么东西,还请前辈指点一下,如图:  图中红色字体旁边的类似与接口的是什么东西

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2014-9-23 14:19:36 | 显示全部楼层
是程序有bug的缘故吗?

出0入0汤圆

发表于 2014-9-23 14:56:35 | 显示全部楼层
发热应该是IO冲突吧。

出0入0汤圆

 楼主| 发表于 2014-9-23 15:46:00 | 显示全部楼层
ericw2012 发表于 2014-9-23 14:56
发热应该是IO冲突吧。

现在不发热了,我是想问问13楼图中红色字体旁边的类似与接口的是什么东西

出0入0汤圆

发表于 2014-9-23 16:52:12 | 显示全部楼层
前后两组逻辑矛盾,既然设置为高阻了,就不能再设置让他跟别的电平一致,把最后的高阻设置去掉试一下。

出0入0汤圆

发表于 2014-9-24 16:31:04 | 显示全部楼层
可以,需要用一个地址线来切换 数据IO口的方向
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 02:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表