跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C

FPGA 与 STM32 的 FMC 通信协议实现

基于高云 FPGA 与 STM32 的 FMC 通信协议实现。内容包括 FPGA 端 FSMC 模块的 Verilog 代码设计,涉及地址线、数据线及控制信号的逻辑处理;同时分析了 STM32 侧 FMC 控制器的引脚配置与地址映射机制。通过对比双方引脚定义(如片选、读写使能等),阐述了硬件连接与软件配置的关键步骤,实现了两者间的数据读写交互。

CodeArtist发布于 2026/4/6更新于 2026/10/26146 浏览
FPGA 与 STM32 的 FMC 通信协议实现

文章配图

// fsmc read / write ep4ce6 demo module fsmc(
    ab,   // address
    db,   // data
    wrn,  // wr
    rdn,  // rd
    resetn, // resetn
    csn,  // cs
    ina,  // input data a
    inb,  // input data b
    inc,  // input data c
    ind,  // input data d
    ine,  // input data e
    inf,  // input data f
    ing,  // input data g
    inh,  // input data h
    outa, // output data a
    outb, // output data a
    outc, // output data a
    outd, // output data a
    oute, // output data a
    outf, // output data a
    outg, // output data a
    outh  // output data a
);
input [2:0] ab;
inout [15:0] db;
input wrn;
input rdn;
input resetn;
input csn;
input [15:0] ina;
input [15:0] inb;
input [15:0] inc;
input [15:0] ind;
input [15:0] ine;
input [15:0] inf;
input [15:0] ing;
input [15:0] inh;
output reg [15:0] outa;
output reg [15:0] outb;
output reg [15:0] outc;
output reg [15:0] outd;
output reg [15:0] oute;
output reg [15:0] outf;
output reg [15:0] outg;
output reg [15:0] outh;
wire rd;
wire wr;
reg [15:0] indata;
assign rd = !(csn & rdn); // get rd pulse
assign wr = !(csn & wrn); // get wr pulse
assign db = rd ? indata : 16'hzzzz; // write data, 根据地址线选择八个空间写入,每个空间 16 位
always @(negedge wr or negedge resetn) begin
    if (!resetn) begin
        outa <= 16'h0000;
        outb <= 16'h0000;
        outc <= 16'h0000;
        outd <= 16'h0000;
        oute <= 16'h0000;
        outf <= 16'h0000;
        outg <= 16'h0000;
        outh <= 16'h0000;
    end else begin
        case (ab)
            3'b000: outa <= db;
            3'b001: outb <= db;
            3'b010: outc <= db;
            3'b011: outd <= db;
            3'b100: oute <= db;
            3'b101: outf <= db;
            3'b110: outg <= db;
            3'b111: outh <= db;
            default: ;
        endcase
    end
end
// read data 根据地址线选择 8 个空间读取,每个空间 16 位
always @(rd or !resetn) begin
    if (!resetn) indata <= 16'h0000;
    else begin
        case (ab)
            3'b000: indata <= ina;
            3'b001: indata <= inb;
            3'b010: indata <= inc;
            3'b011: indata <= ind;
            3'b100: indata <= ine;
            3'b101: indata <= inf;
            3'b110: indata <= ing;
            3'b111: indata <= inh;
            default: ;
        endcase
    end
end
endmodule

FMC 通信协议说明

文章配图

这里的 FMC_A0 表示的是地址线。这里有 13 位地址线和 16 位数据线,行地址与列地址是公用的,作为行地址时使用了 012 位,作为列地址时使用了 08 位。

  • FMC_SDNWE:低电平时写,高电平时读;
  • FMC_SDNCAS:列地址选通信号,低电平有效;
  • FMC_SDNRAS:行地址选通信号,低电平有效;
  • FMC_SDNE0:片选信号,低电平有效;
  • FMC_BA0~1:Bank 选择信号,两位对应 4 个区域;
  • FMC_SDCKE0:时钟使能信号;
  • FMC_SDCLK:时钟信号;
  • FMC_NBL0~1:写访问的输出字节屏蔽,数据掩码。

本方案涉及的引脚配置

文章配图

这实际上是 FMC 控制器对内核地址映射的结果,其实质就是对于地址的控制。

在 STM32 上,有一些引脚被专门设计成地址线,还有一些被专门设计成数据线,还有一些被设计成控制线。这些地址线和数据线对应着固定的地址,只要外部的 DRAM 等存储器将对应的数据线连接到 STM32 这些对应的引脚上,引脚功能设置为复用模式,通过配置 FSMC,可以直接给上面那个固定的地址赋值,其他操作 STM32 都会自动完成,就可以把数据存储到 SRAM 中。

这里 FPGA 的通信也是如此,在配置好引脚后对其进行自动赋值,然后再对地址进行读写操作。

文章配图

在高云 FPGA 这里,有二十二个引脚需要我们去配置。

这是目前对于 Muxed PSRAM 的配置。

文章配图

文章配图

文章配图

这里我们重点挑出以下引脚进行研究:

  • FMC_NL
  • FMC_NOE
  • FMC_NWE
  • FMC_NE2

这里一共有 20 个引脚,对应一下 FPGA 的引脚定义。

文章配图

FPGA 这里除了数据线外多了 RST、FPGA_WR_NWE、FPGA_RD_NOE、FPGA_NL_NADV、FPGA_CS_NEL、CLK。这里有 22 个引脚,我们可以发现,这里多了两个引脚,一个是由 PLL 来进行时钟控制,还有一个则是用于硬件的复位重启。

目录

  1. FMC 通信协议说明
  2. 本方案涉及的引脚配置

更多推荐文章

查看全部
  • C++ Elasticsearch 第三方库 elasticlient 详解
  • C++ 类和对象:默认成员函数详解
  • VS Code 前端开发 AI 工具对比:Copilot、通义灵码、iFlyCode 与 Trae
  • MySQL 数据库核心操作详解:创建、修改与备份
  • C++ 二叉排序树原理与实现
  • 鸿蒙电商购物全栈项目:商品浏览与智能推荐
  • GitHub 汉化插件安装教程
  • TrendRadar 本地部署:Docker 配置、AI 模型接入与 MCP 服务对接
  • 二叉树算法实战:深度计算与先序排列求解
  • go-zero 微服务架构入门与实践
  • ClawPanel 开源管理面板:支持 20+ 通道接入与多模型配置
  • YOLOv5 模型构建源码详解:yaml 配置与 parse_model 解析
  • ThinkPHP 5 在 Windows IIS 上的部署与 PHP 版本兼容性配置
  • 《Agent Runtime 工程化》我对生产级 Agent Runtime 的 10 条工程判断
  • 微软常用 Visual C++ 运行库合集
  • WriteGPT 人工智能写作框架使用指南
  • VS Code 跨平台安装与配置优化指南
  • 二叉树算法实战:美国血统重建与深度宽度计算
  • ERNIE-4.5-0.3B 超轻量模型部署与实战测评
  • openJiuwen 开源 Agent 平台架构设计与企业级部署实战

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online