zq6220 发表于 2014-8-28 11:06:17

stm32 能否隔着CPLD读取SRAM?

我打算用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    sram_addr1;
inout    sram_data1;      
inout          sram_we_n1;
inout          sram_oe_n1;
inout          sram_ce_n1;
inout     sram_be_n1;

inout    fsmc_a;
inout    fsmc_d;   
inout          fsmc_ne;                //cs
inout          fsmc_oe;
inout          fsmc_we;
inout     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 = 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

zzj0329 发表于 2014-8-28 11:31:08

如果时序ojk

alcohol 发表于 2014-8-28 11:51:19

你理解 CPLD 有误:

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

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

MAO.J.L 发表于 2014-8-28 12:04:12

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

semonpic 发表于 2014-8-28 12:04:41

inout管脚是需要有信号来控制的
某一时刻可能是输入,也可能是输出,如何不加控制,恰好,mcu管教输出1,cpld管脚输出0,此时这根线上的电流就比较大,导致芯片发热.

zxq6 发表于 2014-8-28 12:23:54

时序对了就能

zq6220 发表于 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系统时钟周期的延迟,是这样的吗?   有没更好的解决办法啊?

alcohol 发表于 2014-8-28 19:36:30

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

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

zq6220 发表于 2014-8-29 16:02:01

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

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

output    sram_addr1;
inout    sram_data1;      
output          sram_we_n1;
output          sram_oe_n1;
output          sram_ce_n1;
output     sram_be_n1;

input    fsmc_a;
inout    fsmc_d;   
input          fsmc_ne;                //cs
input          fsmc_oe;
input          fsmc_we;
input     fsmc_nbl;
wire         fsmc_d_reg;
//reg         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视图如下:
      

zq6220 发表于 2014-8-29 16:24:07

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

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

alcohol 发表于 2014-9-1 08:35:12

一、代码还没有改为带有时序控制的版本;
二、你看看管脚的设置对不对,工作方式

zsdshuai 发表于 2014-9-4 10:31:52

发热,我觉得是IO没配置好,两个都设置成输出,其中1个拉低,另外一个就可能发热

zq6220 发表于 2014-9-23 14:18:55

zsdshuai 发表于 2014-9-4 10:31
发热,我觉得是IO没配置好,两个都设置成输出,其中1个拉低,另外一个就可能发热 ...

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

zq6220 发表于 2014-9-23 14:19:36

是程序有bug的缘故吗?

ericw2012 发表于 2014-9-23 14:56:35

发热应该是IO冲突吧。

zq6220 发表于 2014-9-23 15:46:00

ericw2012 发表于 2014-9-23 14:56
发热应该是IO冲突吧。

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

afeionline 发表于 2014-9-23 16:52:12

前后两组逻辑矛盾,既然设置为高阻了,就不能再设置让他跟别的电平一致,把最后的高阻设置去掉试一下。

LingYi 发表于 2014-9-24 16:31:04

可以,需要用一个地址线来切换 数据IO口的方向
页: [1]
查看完整版本: stm32 能否隔着CPLD读取SRAM?