打印

stm32 能否隔着CPLD读取SRAM?

[复制链接]
2664|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zq6220c|  楼主 | 2014-8-28 11:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我打算用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

相关帖子

沙发
aozima| | 2014-8-28 12:29 | 只看该作者
重点检查IO方向

使用特权

评论回复
板凳
forrest11| | 2014-8-28 12:59 | 只看该作者
CPLD不能这么用的,它不可能只有连线。
你必须和rd,wr信号一起,确定data方向。

使用特权

评论回复
地板
zq6220c|  楼主 | 2014-8-28 13:32 | 只看该作者
forrest11 发表于 2014-8-28 12:59
CPLD不能这么用的,它不可能只有连线。
你必须和rd,wr信号一起,确定data方向。 ...

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

使用特权

评论回复
5
forrest11| | 2014-8-28 13:49 | 只看该作者
不一定要连寄存器,但一定有一个LCELL。
你只读的话,必须说清楚方向,比如assign fsmc_a = sram_addr1, 那么SRAM_add1 为input, 不需要assign sram_addr1 = 19'hzz,其它的也这样。

使用特权

评论回复
6
zq6220c|  楼主 | 2014-8-29 16:08 | 只看该作者
我现在把程序改了,但好像还是不行,经过了缓冲区的数据过不去,不知道怎么回事? 程序如下:
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视图如下:

QQ截图20140829160138.jpg (218.99 KB )

RTL视图

RTL视图

使用特权

评论回复
7
zq6220c|  楼主 | 2014-8-29 16:09 | 只看该作者
图怎么传不上来!

QQ截图20140829160138.jpg (218.99 KB )

QQ截图20140829160138.jpg

使用特权

评论回复
8
zq6220c|  楼主 | 2014-8-29 16:25 | 只看该作者
forrest11 发表于 2014-8-28 13:49
不一定要连寄存器,但一定有一个LCELL。
你只读的话,必须说清楚方向,比如assign fsmc_a = sram_addr1,  ...

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

使用特权

评论回复
9
forrest11| | 2014-8-29 17:53 | 只看该作者
1. Verilog 设计用'hz时,必须清楚其意思。FPGA内部是没有‘hz状态的。
2. 发示波器图才可能知道信号变化问题。

使用特权

评论回复
10
zq6220c|  楼主 | 2014-9-23 14:14 | 只看该作者
forrest11 发表于 2014-8-29 17:53
1. Verilog 设计用'hz时,必须清楚其意思。FPGA内部是没有‘hz状态的。
2. 发示波器图才可能知道信号变化问 ...

SRAM的读取差不多可以了,就是很不稳定, RTL视图里面有些类似接口的东西不知道是什么东西,还请前辈指点一下,如图:(传不上来)看下一楼

使用特权

评论回复
11
zq6220c|  楼主 | 2014-9-23 14:16 | 只看该作者
图中红色字体旁边的类似与接口的是什么东西啊

QQ截图20140923141004.jpg (183.19 KB )

QQ截图20140923141004.jpg

使用特权

评论回复
12
forrest11| | 2014-9-23 16:29 | 只看该作者
截图是个2选1, 22位宽。类似于接口的就是内部模块模块之间接口。
很明显,不在你上面的代码当中体现。

使用特权

评论回复
13
zq6220c|  楼主 | 2014-9-23 17:24 | 只看该作者
forrest11 发表于 2014-9-23 16:29
截图是个2选1, 22位宽。类似于接口的就是内部模块模块之间接口。
很明显,不在你上面的代码当中体现。 ...

那应该就是内部接口了,应该就不是错误了吧?

使用特权

评论回复
14
zq6220c|  楼主 | 2014-9-23 17:27 | 只看该作者
forrest11 发表于 2014-9-23 16:29
截图是个2选1, 22位宽。类似于接口的就是内部模块模块之间接口。
很明显,不在你上面的代码当中体现。 ...

  output shp;
  reg shp;
reg [3:0]va;
  reg [3:0]t1;  

always@(posedge clk)
           if(!rst)
                  begin
                     shp<=1;
                          va<=4'd0;
                          t1<=0;                                       
                  end
                else
                  case(t1)
           0:if(va==4'd2)                //4
                         begin
                                           shp<=0;
                                                va<=4'd0;
                                                t1<=1;
                                          end
                   else
                                   va<=va+4'd1;
                     1:if(va==7)
                         begin
                                           shp<=0;
                                                va<=4'd0;
                                                t1<=1;
                                          end
                   else
                                          begin
                                           shp<=1;
                                                va<=va+4'd1;
                                          end
                  endcase
就是这段代码生成的!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

20

帖子

0

粉丝