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

FPGA 与 STM32 的 FMC 通信协议实现

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

CodeArtist发布于 2026/4/6更新于 2026/9/10117 浏览
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. 本方案涉及的引脚配置

更多推荐文章

查看全部
  • OpenClaw 多飞书机器人及多 Agent 团队实战指南
  • 2024 年中国行业大模型市场报告:规模增长、落地路径与发展趋势
  • 昇腾平台 DeepSeek-R1 与 Qwen2.5 强化学习训练优化实践
  • AI 辅助 Keil uVision5 开发:智能代码补全与调试
  • CTF 夺旗赛入门教程:从零开始掌握网络安全竞技
  • AI 产品经理核心能力模型与系统学习路径
  • Xilinx FPGA 实现 RISC-V 五级流水线 CPU 设计实战
  • 测试开发核心知识点梳理:网络、并发与框架原理
  • 使用 OpenClaw 搭建企业微信 AI Agent 实现自动化客服
  • 龙芯内核配置指南及引脚分配方案(适配龙邱库)
  • 基于腾讯云 AI 代码助手构建垃圾图片识别 Copilot
  • 基于 DeepSeek 和 Cursor 打造智能代码审查工具实践
  • 前端国际化实现指南:React 与 Vue 最佳实践
  • PPT 嵌入 VR 图片与全景图播放:霹雳设计助手实操指南
  • PyTorch 生成式人工智能:循环神经网络详解与实现
  • 积木报表快速入门指南:从零搭建数据可视化报表
  • C++ 多线程同步实战:互斥锁与死锁规避
  • Windows Git 安装与配置全流程指南
  • 滑动窗口算法实战:水果成篮与最小覆盖子串
  • OpenManus 开源自主规划智能体详解

相关免费在线工具

  • 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