1. FPGA与FSMC接口的多串口控制器设计背景
在工业控制和嵌入式系统开发中,多串口通信需求非常普遍。传统方案通常采用专用串口扩展芯片或MCU软件模拟,但这些方法存在成本高、延迟大、灵活性差等问题。FPGA凭借其并行处理能力和可编程特性,成为实现高性能多串口控制器的理想选择。
FSMC(Flexible Static Memory Controller)是ARM处理器常用的外部总线接口,通过将FPGA挂载到FSMC总线上,可以像访问内存一样方便地读写FPGA内部的寄存器。这种设计既保留了硬件加速的优势,又简化了软件端的操作流程。
我在最近的一个工业网关项目中,需要实现8路独立的UART通信通道,每路都要支持115200bps及以上的波特率。经过对比评估,最终选择了Xilinx Spartan-6 FPGA + STM32F407的方案,其中FPGA负责所有UART的底层收发,STM32通过FSMC接口与FPGA交互数据。实测表明,这种架构可以稳定实现8路同时通信,CPU占用率几乎为零。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计与核心模块
2.1 整体硬件连接方案
系统硬件连接如下图所示(文字描述):
- STM32F407的FSMC总线连接到FPGA的Bank1
- FPGA的8组UART TX/RX引脚通过电平转换芯片连接到外部设备
- FPGA内部实现地址解码,将不同UART通道映射到FSMC的不同地址段
- 每组UART对应两个32位寄存器:数据寄存器和状态寄存器
这种设计的关键优势在于:
- 软件端可以像操作内存一样通过指针访问UART
- 所有UART的收发由FPGA并行处理,不占用CPU时间
- 新增UART通道只需扩展FPGA逻辑,软件架构无需改动
2.2 FPGA内部UART核心设计
每个UART核心采用经典的"接收FIFO+发送FIFO+波特率发生器"结构,但针对FSMC接口做了以下优化:
-
数据宽度匹配:虽然UART是8位数据,但FSMC接口使用32位总线。我们在FPGA内部将4个UART通道打包为一组,共享同一个32位数据寄存器。
-
状态寄存器设计:
- Bit0: 接收FIFO非空标志
- Bit1: 发送FIFO满标志
- Bit2: 帧错误标志
- Bit3: 溢出错误标志
- Bit8-15: 接收FIFO当前数据量
-
中断聚合:将8个UART的中断信号通过或门合并为一个中断输出到STM32,通过状态寄存器查询具体中断源。
3. FSMC接口的Verilog实现细节
3.1 FSMC总线时序适配
STM32的FSMC总线在访问不同速度的设备时需要配置等待周期。我们的FPGA逻辑需要严格满足以下时序要求:
verilog复制// FSMC接口关键信号
input wire FSMC_CLK;
