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 如果时序ojk 你理解 CPLD 有误:
CPLD 里面的 “引线” 不是直接连过去,一个引脚到另一个引脚就成能成为“导线”的,尽管你将 IO 设置为 inout ,但是这需要时序配合才行。
建议看看 CPLD 的原理。
内部逻辑连接必须配合时序来指定方向,你需要配合 SDRAM 的控制脚控制 CPLD 的数据线方向,至于单向的信号,比如地址线、读写控制什么的可以指定为输入或输出单功能引脚,然后直接 assign。 楼上正解,CPLD或FPGA在使用双向IO口时,除了定义inout,还需要配合相应逻辑通道方向,我之前用过用三态门去控制,或者软件assign指定模拟一个三态门也可以。作为输出时,三态门使能,作为输入时,三态门断开。而且这个读写时序要是配合不好,可能会出现输出对输出的情况,就导致芯片发热了... inout管脚是需要有信号来控制的
某一时刻可能是输入,也可能是输出,如何不加控制,恰好,mcu管教输出1,cpld管脚输出0,此时这根线上的电流就比较大,导致芯片发热. 时序对了就能 本帖最后由 zq6220 于 2014-8-28 13:35 编辑
alcohol 发表于 2014-8-28 11:51
你理解 CPLD 有误:
CPLD 里面的 “引线” 不是直接连过去,一个引脚到另一个引脚就成能成为“导线”的, ...
我只读的,data方向是单一的,所有的信号线方向都是单一的。 难道必须设置一个寄存器,cpld管脚输出时就必须连到寄存器上?但这样的话似乎就会带来了时钟延迟了,拖慢的读取的速度了!控制信号经cpld传输至sram会有一个cpld系统时钟周期的延迟,然后数据从sram经cpld到stm32又会有一个cpld系统时钟周期的延迟,是这样的吗? 有没更好的解决办法啊? 你要是绝对确定,以及肯定是单一的(尽管我不理解这么做是怎么回事,难道是双口RAM?),那么SRAM到MCU的逻辑,也就是MCU看上去的“读”逻辑,可以写死为单向的。(这仍有隐患——假如总线挂载其他器件,而且带来额外的功耗问题),CPLD约束的好的话延迟可以忽略不计,但是程序没写好,时序约束不好,就可能有很糟糕的延迟。
还有,CPLD内延迟,如果写对逻辑的话,异步触发,我没写过 SRAM 的,但是我猜测是可以不需要时钟的。这样带来的延迟主要是逻辑翻转的延迟和内部传输的延迟,不会很高,对 SRAM 来说,不算是问题。
总之,为了以策安全和降低功耗的目的,建议根据 时序,写一个 CPLD 的程序,而不是简单的连线——尽管有人说 CPLD 的作用就是粘合逻辑,但是 CPLD 可以做的更多。
程序上你可能声明了若干寄存器——比如暂存 DATA 的数据,但是实际上编译后很可能就被优化掉了一些,但也不能完全指望编译器。 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视图如下:
alcohol 发表于 2014-8-28 19:36
你要是绝对确定,以及肯定是单一的(尽管我不理解这么做是怎么回事,难道是双口RAM?),那么SRAM到MCU的逻 ...
我发现信号经过了缓冲区后的数据信号由低变高可以,但是由高变低却不可以;没有经过缓冲区的信号信号由低变高很迅速,但是由高变低却较缓慢,这是什么原因啊? 一、代码还没有改为带有时序控制的版本;
二、你看看管脚的设置对不对,工作方式 发热,我觉得是IO没配置好,两个都设置成输出,其中1个拉低,另外一个就可能发热 zsdshuai 发表于 2014-9-4 10:31
发热,我觉得是IO没配置好,两个都设置成输出,其中1个拉低,另外一个就可能发热 ...
io的配置不知道怎么丢了,重新配置一下就可以了,但是发现不太稳定,RTL视图里面有些类似接口的东西不知道是什么东西,还请前辈指点一下,如图:图中红色字体旁边的类似与接口的是什么东西
是程序有bug的缘故吗?
发热应该是IO冲突吧。 ericw2012 发表于 2014-9-23 14:56
发热应该是IO冲突吧。
现在不发热了,我是想问问13楼图中红色字体旁边的类似与接口的是什么东西 前后两组逻辑矛盾,既然设置为高阻了,就不能再设置让他跟别的电平一致,把最后的高阻设置去掉试一下。 可以,需要用一个地址线来切换 数据IO口的方向
页:
[1]