0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

睿擎平台 FPGA 高速通信:DSMC 总线读写实战

RT-Thread官方账号 2026-04-15 18:12 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

工业控制和数据采集场景中,处理器FPGA 之间的高速数据交换是一个常见需求。传统方案通常采用SPI(速度受限,一般 < 10Mbps)或 PCIE(带宽高但引脚多、设计复杂)。有没有一种方案,既能达到 几十 MB/s 的带宽,又只需要少量引脚,设计简单?


今天分享一个基于睿擎派 RC3506的方案——利用 RK3506 芯片内置的DSMC(Double Data Rate Serial Memory Controller)总线,与 PGL22GB FPGA 实现 高速通信,完整演示从硬件连接到代码验证的全流程。


一、DSMC 是什么?

DSMC(Double Data Rate Serial Memory Controller)是瑞芯微 SoC 内部的一种高速存储与本地总线控制器,支持通过 DDR(双倍数据速率)方式与外部 PSRAM 或 LocalBus 设备(如 FPGA)进行数据通信。


DSMC 核心特性

89fa6ed8-38b3-11f1-ab55-92fbcf53809c.png


二、硬件准备

8a109b04-38b3-11f1-ab55-92fbcf53809c.png


连接方式

RC-PI-3506 开发板与 FPGA 扩展板通过 DSMC 接口连接:

8a2295b6-38b3-11f1-ab55-92fbcf53809c.png


睿擎派 RC3506 与 PGL22GB FPGA 扩展板连接示意

8a62eb0c-38b3-11f1-ab55-92fbcf53809c.png

睿擎派 RC3506 开发板


三、DSMC 读写原理

3.1 内存映射

DSMC 将外部设备映射到处理器的物理地址空间,软件可以通过直接读写内存地址的方式访问 FPGA:

处理器地址空间 │ ├── 0xC0000000 ──→ DSMC CS0 区域(FPGA RAM) │ 16KB 可读写 │ └── 其他外设...

3.2 读写流程

写入流程

1.处理器执行 writel(data, 0xC0000000 + offset)2.DSMC 控制器将数据通过 DDR 串行总线发送给 FPGA3.FPGA LocalBus 接口接收数据,写入内部 RAM

读取流程

1.处理器执行 readl(0xC0000000 + offset)2.DSMC 控制器向 FPGA 发送读请求3.FPGA LocalBus 接口从内部 RAM 读出数据,返回给 DSMC4.DSMC 控制器将数据返回给处理器

3.3 关键约束

4字节对齐访问:RK3506 的 DSMC 读写必须 4 字节对齐,即地址必须是 4 的倍数

默认频率 12MHz:可在设备树中修改,但需确保 FPGA 侧时序匹配

8 位宽模式:当前示例使用 8 线传输,可配置为 16 线提升带宽


四、代码实战

4.1 示例代码结构

完整示例代码位于 SDK 的 02_peripheral_dsmc 目录,核心逻辑如下:

staticinttest_dsmc_read_write(void){ inti; interr_count =0; rt_uint64_tt_start, t_end; rt_uint64_twrite_cycles, read_cycles; constintWORD_NUM =4*1024; // 4K word = 16KB uintptr_tBASE_ADDR =0xC0000000; // DSMC CS0 基地址 rt_uint32_t*write_buf =rt_malloc(WORD_NUM *4); rt_uint32_t*read_buf =rt_malloc(WORD_NUM *4); if(!write_buf || !read_buf) { rt_kprintf("malloc failed!\n"); return-1; } // 准备测试数据 for(i =0; i < WORD_NUM; i++)    {        write_buf[i] = 0x12345678 + i;    }    // ========== 写入测试 ==========    t_start = rt_hw_global_timer_get();    for (i = 0; i < WORD_NUM; i++)    {        writel(write_buf[i], BASE_ADDR + i * 4); // 4字节对齐写入    }    t_end = rt_hw_global_timer_get();    write_cycles = t_end - t_start;    // ========== 读取测试 ==========    t_start = rt_hw_global_timer_get();    for (i = 0; i < WORD_NUM; i++)    {        read_buf[i] = readl(BASE_ADDR + i * 4);    }    t_end = rt_hw_global_timer_get();    read_cycles = t_end - t_start;    // ========== 数据校验 ==========    for (i = 0; i < WORD_NUM; i++)    {        if (read_buf[i] != write_buf[i])        {            err_count++;            rt_kprintf("ERR[%d]: R=0x%08X W=0x%08X\n",                        i, read_buf[i], write_buf[i]);            if (err_count >10) { rt_kprintf("......\n"); break; } } } // ========== 性能统计 ========== floatwrite_time_us = (float)write_cycles /24.0f; // 24MHz 定时器 floatread_time_us = (float)read_cycles /24.0f; floattotal_bytes = WORD_NUM *4.0f; floatwrite_speed = (total_bytes / (1024*1024)) / (write_time_us /1e6); floatread_speed = (total_bytes / (1024*1024)) / (read_time_us /1e6); if(err_count ==0) { rt_kprintf("\n==== DSMC TEST PASS ====\n"); rt_kprintf("Write: %lu cycles, %.2f us, %.2f MB/s\n", write_cycles, write_time_us, write_speed); rt_kprintf("Read : %lu cycles, %.2f us, %.2f MB/s\n", read_cycles, read_time_us, read_speed); } else { rt_kprintf("\n==== DSMC TEST FAIL ====\n"); rt_kprintf("Error count: %d\n", err_count); } rt_free(write_buf); rt_free(read_buf); return0;}MSH_CMD_EXPORT(test_dsmc_read_write, test dsmc read write);

4.2 关键代码解析

① 基地址定义

uintptr_tBASE_ADDR =0xC0000000; // DSMC CS0 区域

DSMC 的 CS0 片选对应的物理地址是 0xC0000000,软件直接读写该地址即可访问 FPGA。

② 4 字节对齐访问

writel(write_buf[i], BASE_ADDR + i *4); // 每次写入4字节read_buf[i] = readl(BASE_ADDR + i *4); // 每次读取4字节

RK3506 的 DSMC 控制器要求访问地址 4 字节对齐,因此使用 writel/readl 函数,偏移量每次增加 4。

③ 性能测量

t_start = rt_hw_global_timer_get(); // 获取硬件定时器计数值// ... 执行写入或读取 ...t_end = rt_hw_global_timer_get();cycles = t_end - t_start;time_us = cycles / 24.0f; // 定时器频率 24MHz

通过硬件定时器精确测量读写耗时,计算出实际带宽。


五、运行结果

将示例工程编译下载到睿擎派 RC3506,在串口终端执行:

msh/>test_dsmc_read_write

输出结果

==== DSMC TEST PASS ====Write: 73640 cycles, 3068.33 us, 5.09 MB/sRead : 240044 cycles, 10001.83 us, 1.56 MB/s

结果解读

指标

写入

读取

数据量

16KB

16KB

耗时

3.07 ms

10.00 ms

带宽

5.09 MB/s

1.56 MB/s

校验结果

全部通过

全部通过

写入带宽达到5MB/s,读取带宽1.5MB/s,通过调整demo的时序和位宽,以及dma的加持,带宽可以达到200MB/s


六、FPGA 工程说明

6.1 FPGA 实现的功能

FPGA 侧实现了一个LocalBus Server,功能如下:

接收 DSMC 发来的写请求,将数据存入 16KB 内部 RAM

响应 DSMC 的读请求,从 RAM 中读出数据返回

提供状态 LED 指示通信活动

6.2 FPGA 工程迁移

如果需要将 FPGA 工程迁移到不同版本的 IDE,步骤如下:

在目标 IDE 上创建 PGL22GB-6MBG324 工程

添加源文件:dsmc.fdc、dsmc_port.v、led.v

配置 RAM 和 PLL IP 核

RAM IP 核配置:

8a8b4c14-38b3-11f1-ab55-92fbcf53809c.png

PGL22GB RAM IP 核配置:16KB 容量,32 位数据宽度

PLL IP 核配置:

8a9e4968-38b3-11f1-ab55-92fbcf53809c.png

PGL22GB PLL IP 核配置:生成 DSMC 所需时钟


七、设备树配置

DSMC 的引脚复用和时钟频率在设备树中配置:

&dsmc { status ="okay"; clock-frequency = <12000000>; /* 12MHz,可修改 */ pinctrl-names ="default"; pinctrl-0= <&dsmc_pins>; dsmc_pins: dsmc-pins { pins ="GPIO0_A0","GPIO0_A1","GPIO0_A2","GPIO0_A3", "GPIO0_A4","GPIO0_A5","GPIO0_A6","GPIO0_A7", "GPIO0_B0","GPIO0_B1"; function="dsmc"; };};

注意事项

修改 clock-frequency 后,需同步修改 FPGA 侧 PLL 配置

引脚复用配置需与硬件原理图对应

当前示例使用 CS0,如需使用其他片选需修改设备树


八、工程实现说明

当前 DSMC 为8 位宽模式,开启 DSMC 的 CS0 的 FIFO region

默认频率为12MHz,在示例工程的 board.dts 中可修改

除 DSMC 的引脚复用与时钟,其他配置暂时不支持修改

DSMC 的 DMA 以及中断暂时不支持开启


九、应用场景

DSMC 与 FPGA 高速通信的典型应用场景:

场景

说明

高速 ADC 采集

FPGA 采集高速 ADC 数据,通过 DSMC 传输给处理器

电机控制

FPGA 实现多路 PWM 和编码器接口,处理器下发控制参数

视频预处理

FPGA 做 ISP 前处理,通过 DSMC 传输给处理器编码

协险品检测

FPGA 实现多传感器并行采集,处理器做 AI 推理


十、总结

这篇文章完整演示了睿擎派 RC3506 通过 DSMC 总线与 FPGA 实现高速通信:

理解 DSMC 的工作原理和内存映射机制

掌握 DSMC 与 FPGA 的硬件连接方式

学会使用 writel/readl 直接读写 DSMC 地址空间

完成 16KB 数据的读写测试和校验

了解 FPGA 工程的配置和迁移方法

DSMC 为处理器与 FPGA 之间提供了一种带宽适中、设计简单、引脚可控的高速通信方案,非常适合工业控制和数据采集场景。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1664

    文章

    22540

    浏览量

    640282
  • 总线
    +关注

    关注

    10

    文章

    3063

    浏览量

    91936
  • 高速通信
    +关注

    关注

    0

    文章

    61

    浏览量

    11200
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RK3576+紫光同创FPGA并口通信方案 基于DSMC/FlexBus并口的RK3576J与FPGA通信方案

    为大家带来基于DSMC/FlexBus并口的RK3576J与FPGA通信方案
    的头像 发表于 05-20 11:45 5387次阅读
    RK3576+紫光同创<b class='flag-5'>FPGA</b>并口<b class='flag-5'>通信</b>方案 基于<b class='flag-5'>DSMC</b>/FlexBus并口的RK3576J与<b class='flag-5'>FPGA</b><b class='flag-5'>通信</b>方案

    基于派轻松玩转Modbus工业通信

    。今天,我们就带来一篇实战教程,教大家如何基于派/工业平台,分别作为ModbusRTU主
    的头像 发表于 07-23 17:05 4038次阅读
    基于<b class='flag-5'>睿</b><b class='flag-5'>擎</b>派轻松玩转Modbus工业<b class='flag-5'>通信</b>

    平台实战:温湿度采集到MQTT云端通信

    前言在物联网时代,环境数据采集是构建智能系统的基础能力。本文将带您实战一个完整的物联网传感器项目:使用平台通过I2C总线读取温湿度数据,
    的头像 发表于 11-19 17:55 5481次阅读
    <b class='flag-5'>睿</b><b class='flag-5'>擎</b><b class='flag-5'>平台</b><b class='flag-5'>实战</b>:温湿度采集到MQTT云端<b class='flag-5'>通信</b>

    派】CANOpen总线之IO模块读写(DS401协议)

    派以瑞芯微RK3506为主控芯片,底层搭载RT-Thread操作系统,基于专为工业场景打造的工业平台进行开发。该
    的头像 发表于 12-24 18:01 7683次阅读
    【<b class='flag-5'>睿</b><b class='flag-5'>擎</b>派】CANOpen<b class='flag-5'>总线</b>之IO模块<b class='flag-5'>读写</b>(DS401协议)

    派】EtherCAT总线之IO模块读写

    在上一篇文章《【派】CANOpen总线之IO模块读写(DS401协议)》我写了关于派上C
    的头像 发表于 12-31 19:07 6037次阅读
    【<b class='flag-5'>睿</b><b class='flag-5'>擎</b>派】EtherCAT<b class='flag-5'>总线</b>之IO模块<b class='flag-5'>读写</b>

    平台极简开发重要实践—— PinMux 配置工具 | 派试用名单公示

    RT-Thread工业开发平台是为工业场景设计的软硬件一体化开发方案,全栈自主可控,赋能用户聚焦核心业务创新,大幅提升开发效率。
    的头像 发表于 06-11 17:05 1720次阅读
    <b class='flag-5'>睿</b><b class='flag-5'>擎</b><b class='flag-5'>平台</b>极简开发重要实践—— PinMux 配置工具 | <b class='flag-5'>睿</b><b class='flag-5'>擎</b>派试用名单公示

    最后召集!明日工业平台Workshop上海站开启!现场体验工业设备实战开发,最终席位即将关闭!

    明天(9月4日)下午1点,工业平台深度实战Workshop上海站将准时开启!所有技术设备已调试完毕,开发套件、全套资料均已就位,仅剩最后少量席位,报名通道将于今日24:00正式关闭
    的头像 发表于 09-03 14:47 1057次阅读
    最后召集!明日<b class='flag-5'>睿</b><b class='flag-5'>擎</b>工业<b class='flag-5'>平台</b>Workshop上海站开启!现场体验工业设备<b class='flag-5'>实战</b>开发,最终席位即将关闭!

    上海站圆满收官!工业开发平台Workshop深圳站报名开启!9.18,现场体验工业设备实战开发|知行工坊

    工业开发平台深度实战Workshop上海站已圆满结束!现场50余位开发者经历了4小时的高强度实战。现场氛围热烈,交流深入。这是一个充满技
    的头像 发表于 09-07 11:10 1212次阅读
    上海站圆满收官!<b class='flag-5'>睿</b><b class='flag-5'>擎</b>工业开发<b class='flag-5'>平台</b>Workshop深圳站报名开启!9.18,现场体验工业设备<b class='flag-5'>实战</b>开发|知行工坊

    上海站圆满收官!工业开发平台Workshop深圳站报名开启!9.18,现场体验工业设备实战开发 | 知行工坊

    上周四,工业开发平台深度实战Workshop上海站已圆满结束!现场50余位开发者经历了4小时的高强度实战。现场氛围热烈,交流深入。这是一
    的头像 发表于 09-09 17:26 1425次阅读
    上海站圆满收官!<b class='flag-5'>睿</b><b class='flag-5'>擎</b>工业开发<b class='flag-5'>平台</b>Workshop深圳站报名开启!9.18,现场体验工业设备<b class='flag-5'>实战</b>开发 | 知行工坊

    深圳站报名火热进行中!工业平台线下实战 Workshop,亲手实战4小时解锁工业级开发!|活动预告

    想一站式实战QT图形开发、EtherCAT通信、RPMSG多核交互?工业平台深度实战Work
    的头像 发表于 09-14 10:04 1501次阅读
    深圳站报名火热进行中!<b class='flag-5'>睿</b><b class='flag-5'>擎</b>工业<b class='flag-5'>平台</b>线下<b class='flag-5'>实战</b> Workshop,亲手<b class='flag-5'>实战</b>4小时解锁工业级开发!|活动预告

    【直播预告】10月14日晚8点|平台首场实战直播:从快速上手到实现远程监控网关

    一次直播,带你完整走通工业网关开发全流程面对新的开发平台,你是否也在为环境配置而头疼?想要快速验证平台能力却不知从何入手?好消息!平台
    的头像 发表于 10-09 14:46 770次阅读
    【直播预告】10月14日晚8点|<b class='flag-5'>睿</b><b class='flag-5'>擎</b><b class='flag-5'>平台</b>首场<b class='flag-5'>实战</b>直播:从快速上手到实现远程监控网关

    【直播预告】10月14日 本周二晚8点|平台首场实战直播:从快速上手到实现远程监控网关

    一次直播,带你完整走通工业网关开发全流程面对新的开发平台,你是否也在为环境配置而头疼?想要快速验证平台能力却不知从何入手?好消息!平台
    的头像 发表于 10-13 16:29 1099次阅读
    【直播预告】10月14日 本周二晚8点|<b class='flag-5'>睿</b><b class='flag-5'>擎</b><b class='flag-5'>平台</b>首场<b class='flag-5'>实战</b>直播:从快速上手到实现远程监控网关

    平台 V26.04.02 发布:DSMC 驱动正式上线,共享内存 NFS 挂载全面支持

    亲爱的开发者朋友们,平台于2026年4月2日正式发布了V26.04.02版本更新。本次更新在RC3506与RC3562双平台上同步发力,带来了D
    的头像 发表于 04-08 20:31 466次阅读
    <b class='flag-5'>睿</b><b class='flag-5'>擎</b><b class='flag-5'>平台</b> V26.04.02 发布:<b class='flag-5'>DSMC</b> 驱动正式上线,共享内存 NFS 挂载全面支持

    直播预告 | V26.04.02 新特性实战DSMC 双向读写 + 共享内存 NFS 开箱即用

    双系统之间传数据,还在用串口、拷文件?AMP混合部署,每次都要手配IP才能ping通?新版本发布了一堆特性,文档看了两遍还是不知道怎么上手?4月15日(周三)晚8点,我们把平台V26.04.02
    的头像 发表于 04-10 18:41 248次阅读
    直播预告 | <b class='flag-5'>睿</b><b class='flag-5'>擎</b> V26.04.02 新特性<b class='flag-5'>实战</b>:<b class='flag-5'>DSMC</b> 双向<b class='flag-5'>读写</b> + 共享内存 NFS 开箱即用

    平台AMP共享内存:Linux 与 RT-Thread 高速数据交换

    个核心问题。上一篇文章介绍了DSMC总线方案,适合与FPGA等外部设备高速通信。今天我们聚焦另一个场景——
    的头像 发表于 04-22 18:09 384次阅读
    <b class='flag-5'>睿</b><b class='flag-5'>擎</b><b class='flag-5'>平台</b>AMP共享内存:Linux 与 RT-Thread <b class='flag-5'>高速</b>数据交换