一、FSMC 主要特性
FSMC 能够连接同步、异步存储器和 16 位 PC 存储卡。其主要用途如下:
- 将 AHB 数据通信事务转换为适当的外部器件协议
- 满足外部器件的访问时序要求
所有外部存储器共享地址、数据和控制信号,但有各自的片选信号。FSMC 一次只能访问一个外部器件。
FSMC 具有以下主要功能:
1. 连接静态存储器映射的器件:
— 静态随机访问存储器 (SRAM)
— 只读存储器 (ROM)
— NOR Flash/OneNAND Flash
— PSRAM(4 个存储区域)
2. 两个带有 ECC 硬件的 NAND Flash 存储区域,可检查多达 8 KB 的数据
3. 16 位 PC 卡兼容设备
4. 支持对同步器件(NOR Flash 和 PSRAM)的突发模式访问
5. 8 或 16 位宽的数据总线
6. 每个存储区域有独立的片选控制
7. 每个存储区域可独立配置
8. 可对时序进行编程,以支持各种器件,尤其是:
— 等待周期可编程(最多 15 个时钟周期)
— 总线周转周期可编程(最多 15 个时钟周期)
— 输出使能和写入使能延迟可编程(最多 15 个时钟周期)
— 独立的读和写时序和协议,以支持各种存储器和时序
9. 写使能和字节通道选择输出,可配合 PSRAM 和 SRAM 器件使用
10. 将 32 位的 AHB 事务转换为针对外部 16 位或 8 位器件进行的连续 16 位或 8 位访问。
11. 用于写入的 FIFO,2 字长(对于 STM32F42x 和 STM32F43x,为 16 字长),每个字为
32 位宽,仅用于存储数据,而不存储地址。因此,此 FIFO 仅会缓冲 AHB 批量写事务。
从而可对慢速存储器执行写入操作后能快速释放 AHB,以供其它操作使用。每次仅缓
冲一个突发事务:如果在有操作正在进行时发生一个新的 AHB 突发事务或者一个单独
事务,则 FIFO 将会清空。FSMC 将插入等待周期,直至当前存储器访问已完成)。
12. 外部异步等待控制
定义外部器件类型和其特性的 FSMC 寄存器通常在启动时进行设置,并且在下次上电或复位前保持不变。但也可随时更改这些设置。
二、FSMC框图
FSMC 包含四个主要模块:
-
-
- AHB 接口(包括 FSMC 配置寄存器)
- NOR Flash/PSRAM 控制器
- NAND Flash/PC 卡控制器
- 外部器件接口
-
框图下图所示:
其各个模块的相关控制信号见FSMC数据手册(注:片选信号FSMC_NE[4:1]决定了与哪个外设通信)。
三、外部器件地址映射
3.1、关于外部设备地址映像,从FSMC的角度看,可以把外部存储器划分为固定大小为256M字节的四个存储块:
● 存储块1用于访问最多4个NOR闪存或PSRAM存储设备。这个存储区被划分为4个NOR/PSRAM区并有4个专用的片选(存储块1用于与FPGA通信)。
● 存储块2和3用于访问NAND闪存设备,每个存储块连接一个NAND闪存。
● 存储块4用于访问PC卡设备
对于每个存储区域,所要使用的存储器类型由用户在配置寄存器中定义,地址范围如下图:
3.2、NOR和PSRAM地址映像
HADDR[27:26]位用于选择四个存储块之一:
HADDR[27:26] | 选择的存储块 |
00 | 存储块1 NOR/PSRAM 1 |
01 | 存储块1 NOR/PSRAM 2 |
10(本次使用) | 存储块1 NOR/PSRAM 3 |
11 | 存储块1 NOR/PSRAM 4 |
表3-1 NOR/PSRAM存储块选择
HADDR[25:0]包含外部存储器地址。HADDR是字节地址,而存储器访问不都是按字节访问,因此接到存储器的地址线依存储器的数据宽度有所不同,如下表:
数据宽度 | 连到存储器的地址线 | 最大访问存储器空间(位) |
8位 | HADDR[25:0]与FSMC_A[25:0]对应相连 | 64M字节 x 8 = 512 M位 |
16位(本次使用) | HADDR[25:1]与FSMC_A[24:0]对应相连,HADDR[0]未接 | 64M字节/2 x 16 = 512 M位 |
32位 | HADDR[25:2]与FSMC_A[23:0]对应相连,HADDR[1:0]未接 | 64M字节/4 x 32 = 512 M位 |
表3-2 外部存储器地址
3.3、NOR闪存和PSRAM的非对齐访问支持
每个NOR闪存或PSRAM存储器块都可以配置成支持非对齐的数据访问。
在存储器一侧,依据访问的方式是异步或同步,需要考虑两种情况:
● 异步模式:这种情况下,只要每次访问都有准确的地址,完全支持非对齐的数据访问。
● 同步模式:这种情况下,FSMC只发出一次地址信号,然后成组的数据传输通过时钟CLK顺序进行。
某些NOR存储器支持线性的非对齐成组访问,固定数目的数据字可以从连续的以N为模的地址读取,典型的N为8、16或32,可以通过NOR闪存的配置寄存器设置。此种情况 下,可以把存储器的非对齐访问模式设置为与AHB相同的模式。
如果存储器的非对齐访问模式不能设置为与AHB相同的模式,应该通过FSMC配置寄存器的相应位禁止非对齐访问,并把非对齐的访问请求分开成两个连续的访问操作。
四、外部存储器接口信号
PSRAM外部存储器接口信号。(与FPGA通信时相当于PSRAM存储器)
FSMC信号名称 | 信号方向 | 功能 |
CLK | 输出 | 时钟(同步突发模式使用) |
A[25:0] | 输出 | 地址总线 |
D[15:0] | 输入/输出 | 双向数据总线 |
NE[x] | 输出 | 片选,x = 1...4 (PSRAM称其为NCE(Cellular RAM既CRAM),低有效 |
NOE | 输出 | 输出使能,低有效 |
NWE | 输出 | 写使能,低有效 |
NL(=NADV) | 输出 | 地址有效(存储器信号名称为:NADV),低有效 |
NWAIT | 输入 | PSRAM要求FSMC等待的信号,低有效 |
NBL[1] | 输出 | 高字节使能(存储器信号名称为:NUB),低有效 |
NBL[0] | 输出 | 低字节使能(存储器信号名称为:NLB),低有效 |
表5-1 PSRAM
注:PSRAM存储器是按16位的字寻址,最大容量达64兆字节(26条地址线)。
FSMC 会为每个存储区域输出唯一的片选信号 NE[4:1]。所有其它信号(地址、数据和控
制)均为共享信号。
对于同步访问,FSMC 只有在读/写事务期间才会向所选的外部器件发出时钟 (CLK)。HCLK
时钟频率是该时钟的整数倍。每个存储区域的大小固定,均为 64 MB。
每个存储区域都通过专用的寄存器进行配置。
存储器的可编程参数包括访问时序(请参见表 5.1)和对等待管理的支持(用于在突发模式
下访问 NOR Flash 和 PSRAM)。
参数 | 功能 | 访问模式 | 单位 | 最小值 | 最大值 |
地址建立 | 地址建立阶段的持续时间 | 异步 | AHB 时钟周期 (HCLK) | 0 | 15 |
地址保持 | 地址保持阶段的持续时间 | 异步,复用I/O | AHB (HCLK) 时钟周期 | 1 | 15 |
数据建立 | 数据建立阶段的持续时间 | 异步 | AHB 时钟周期 (HCLK) | 1 | 256 |
总线周转 | 总线周转阶段的持续时间 | 异步和同步读取 | AHB (HCLK) 时钟周期 | 0 | 15 |
时钟分频比 | 构建一个存储器时钟周期 (CLK) 所 需的 AHB 时钟周期 (HCLK) 数量 | 同步 | AHB 时钟周期 (HCLK) | 2 | 16 |
数据延迟 | 在发出突发的第一个数据前向存储器发出的时钟周期数量 | 同步 | 存储器时钟周 期 (CLK) | 2 | 17 |
表5.1 NOR/PSRAM 的可编程访问参数
五、时序控制
本次与FPGA通信主要用到模式A,模式A读写时序如下:
六、FPGA逻辑关于FSMC总线的控制
input wire[25:0] lb_addr ,//26位地址
inout wire[15:0] lb_dio ,//16位数据
input wire lb_noe ,//读出FPGA使能
input wire lb_nwe ,//写入FPGA使能
input wire lb_nbyte_l ,//低字节使能
input wire lb_nbyte_h ,//高字节使能
assign lb_dio = (lb_noe) ? 16'hzzzz : lb_rddata;//将FPGA中的数据读到FSMC的数据总线上
always @(posedge lb_clk or posedge lb_rst)//将FSMC总线上的数据写到写到FPGA中
begin
if(lb_rst)
lb_wrdata <= #U_DLY 16'h0000;
else if(lb_nwe == 1'b0)
lb_wrdata <= #U_DLY lb_dio;
else
lb_wrdata <= #U_DLY lb_wrdata;
end
input wire[25:0] lb_addr ,//26位地址
inout wire[15:0] lb_dio ,//16位数据
input wire lb_noe ,//读出FPGA使能
input wire lb_nwe ,//写入FPGA使能
input wire lb_nbyte_l ,//低字节使能
input wire lb_nbyte_h ,//高字节使能
assign lb_dio = (lb_noe) ? 16'hzzzz : lb_rddata;//将FPGA中的数据读到FSMC的数据总线上
always @(posedge lb_clk or posedge lb_rst)//将FSMC总线上的数据写到写到FPGA中
begin
if(lb_rst)
lb_wrdata <= #U_DLY 16'h0000;
else if(lb_nwe == 1'b0)
lb_wrdata <= #U_DLY lb_dio;
else
lb_wrdata <= #U_DLY lb_wrdata;
end
七、更多关于FSMC总线设计参见手册
更多关于FSMC总线设计请参考FSMC数据手册,如需要参考FPGA通过FSMC总线与单片机通信的Verilog设计可私信我。