概述

RapidIO标准定义为三层:逻辑层、传输层、物理层。

  • 逻辑层:定义总体协议和包格式,包含设备发起/完成事务的必要信息。

  • 传输层:提供包传输的路由信息(对顶层不可见)。

  • 物理层:描述设备级接口细节(包传输机制、流控、电气特性、低级错误管理)。


逻辑层(LOG)

逻辑层划分为模块控制并解析数据包,包含三种接口:

  1. 用户接口(User Interface)

    • 可配置端口数量和事务类型。

    • 支持通过AXI4-Lite总线访问本地/远程寄存器。

  2. 传输接口(Transport Interface)

    • 相当于缓存Buffer(对顶层不可见)。

  3. 配置接口(Configuration Fabric Interface)

    • 读写本地配置空间及逻辑层/传输层寄存器。

用户接口详解

  • I/O端口集
    1. 支持I/O事务(NWRITEs、NWRITE_Rs、SWRITEs、NREADs、RESPONSEs)。

    2. 可选支持消息事务(取决于IP核配置)。

    3. 支持门铃事务。

  • 消息端口:专用于消息事务。

  • 维护端口:专用于维护事务。

  • 用户自定义端口:支持自定义事务类型(未使能时丢弃包)。

I/O端口类型
  1. Condensed I/O
    • 单AXI4-Stream通道发送/接收所有包类型。

  2. Initiator/Target
    • 分离请求与响应事务,共4个AXI4-Stream通道。

数据流协议
  • 支持HELLO格式与SRIO Stream格式。

  • 通道映射关系:
    • s_axis_ireq* → ireq(本地请求)

    • m_axis_iresp* → iresp(远程响应)

    • m_axis_treq* → treq(远程请求)

    • s_axis_tresp* → tresp(本地响应)


物理层(PHY)

  • 功能:处理链路训练、初始化、协议、CRC校验、应答标识符插入。

  • 接口:
    • 通过AXI4-Stream通道连接传输层。

    • AXI4-Lite接口连接配置层。

    • 串行接口连接高速收发器(通常使用FPGA集成的GT接口)。

寄存器空间

  • 能力寄存器空间(CAR)

  • 命令和状态寄存器空间(CSR)

均在逻辑层实现。

HELLO包格式

  • 标准化包头域,包头与数据分离传输。

  • Size域规则
    • 值 = 传输字节总数 - 1(有效范围0~255,对应实际1~256字节)。

    • 需与RapidIO包的size/address/wdptr域一致。

    • 因AXI4-Stream的tdata为8字节,需分情况处理:
      • 数据量 < 8字节

      • 数据量 > 8字节


SRIO事务类型及关系梳理

1. 直接I/O(DMA)事务

事务类型特性应用场景
NWRITE写操作,无需响应高效无确认数据传输
NWRITE_R写操作,需响应需数据完整性的场景
SWRITE流式写(数据长度需为8B整数倍)连续数据流(如视频)
NREAD读操作,返回响应包+数据读取目标地址数据

2. 消息传递事务

事务类型特性应用场景
DOORBELL短消息通知(如中断触发)轻量级事件通知
MESSAGE长消息传输(邮箱路由)动态通信/软件管理交互

3. 维护事务

  • MAINTENANCE READ/WRITE:读写配置寄存器(初始化/错误处理)。

事务对比

特性直接I/O事务消息传递事务
效率高(硬件控制)低(软件介入)
可靠性NWRITE无确认依赖软件处理
延迟较高
典型场景DSP与FPGA间实时通信多处理器系统通知

事务类型对应表如下,更具体地可以见PG007开发手册P73页。


SRIO事务时序仿真

仿真步骤(Vivado 2020.1)

  1. 创建工程及SRIO IP核。

  2. 右键IP核 → "Open IP Example Design"。

  3. 运行仿真,添加request/response模块观察信号。

  1. 运行约1000us捕获事务动作。

关键事务时序

  1. MAINTENANCE READ REQUEST
    • 接收请求,无响应(val_tresp_tvalid=0)。

  1. SWRITE请求(发送)

    • val_ireq_tvalid拉高,ftype=6, ttype=0

  2. SWRITE请求(接收)

    • response模块验证事务类型。
      ftype(6)和ttype(0)

  3. NWRITE_R请求(发送)

    • 请求包发送。

  4. NWRITE_R请求(接收+响应)

    • 接收请求后发送响应包,和发送的请求包一致,该事务会产生响应,在一段时间后可以看到val_tresp_tvalid拉高一个周期,发送响应包val_tresp_tdata = 64’h25d0_4000_0000_0000。

  5. NREAD请求(发送)

    • 仅包头无数据。

  6. NREAD请求(接收)

    • 接收模块返回响应包+数据。

  1. NREAD响应(发送)
    • size=8'h3f → 发送64字节数据(8个周期)。

  1. NREAD响应(接收)
    • 接收包头(val_iresp_tdata=64'h4bd8400000000000)及数据。 跟在包头后面的是数据0。


自定义事务传输仿真

计划仿真NWRITE和SWRITE两种事务类型,通过FIFO实现用户层时钟到IP核跨时钟传输以及数据缓存的功能,方便用户直接使用。

移植srio_example工程

  1. 配置参数

    parameter SIM_VERBOSE            = 1,  // 仿真详细日志
    parameter VALIDATION_FEATURES    = 0,  // 关闭验证功能
    parameter QUICK_STARTUP          = 1,  // 启用快速启动
    parameter STATISTICS_GATHERING   = 0,  // 关闭统计功能
    parameter C_LINK_WIDTH           = 4   // 4x通道
  2. 将示例工程文件夹import拷贝到自己工程中

  1. 添加文件
    除了仿真文件其余都加进去。

添加好的工程目录如下:

搭建好总的框架,并对SRIO官方案例工程进行一些修改

  1. 创建收发模块

  • 首先创建好两个模块,分别是Message_TX数据发送模块和Message_RX数据接收模块。

  1. 创建顶层模块

  • 创建一个顶层模块srio_demo。

  1. 对srio_example模块进行修改

  • 要提前对srio_example模块进行一些处理,添加一些信号给数据收发模块用。(下面图片中左边时示例程序,右边是对其修改后的程序)

  • 首先把一些不必要的报告和一些附加功能屏蔽掉

  • 然后把port_initialized和link_initialized两个信号引出来

  • 然后把log_clk用户时钟引出来给外部使用

  • 然后把ireq和treq相关AXI总线信号引出来

  • 最后就是把IP核的其他输入信号赋上一些初始值,主要是iresp和tresp,保证IP核正常运行。

  • 最终修改好之后整体框架如下图:

加上FIFO IP核,并配置好相应参数,编写好发送模块

  • 这里描述简单些,例化好FIFO IP,并给FIFO相关信号赋值

  • 最后编写发送模块的剩余代码,发送模块状态转换图如下图所示

加上FIFO IP核,并配置好相应参数,编写好接收模块

  • 这里描述简单些,接收模块的状态转换图如下图所示

编写仿真程序,仿真调试

  • 首先创建仿真文件

  • 把顶层文件的端口添加到仿真文件中

  • 例化两个端,分别是PORTA端和PORTB端,两个端TX和RX引脚反接,并设置A端作为发送端,B端设为接收端

  • 产生时钟和复位信号

  • 添加上一些监测信号

  • 编译完成后,点击仿真,添加PORTA的tx模块和PORTB的rx模块进波形窗口

  • 继续运行仿真,看一下是否link上。在58us左右的时候,port_initialized拉高

  • 在77us左右link_initialized拉高,表示建链成功。一般port_initialized&link_initialized作为初始化完成的标志。

  • 在94us左右treq_tdata不会有动作,跟之前示例工程有区别,这是没有传数过去,是正常的。

  • 编写传输数据流程:

  • 点击开始仿真,100us时tx_vld正常拉高,tx_data数据传输也正常。

  • ireq信号启动发送流程,时间大概再100.6us左右,这里帧头是0x006020fcd0000600,事务类型是SWRITE。

  • PORTB的接收模块的treq信号在101.6us左右有动作。

  • 接收模块输出的结果如下图所示,即rx_vld信号拉高之后开始数据接收的数据,不包括SRIO帧头。

至此,仿真验证结束,结果符合预期。

本期分享结束,感谢大家看完,私信我可获取相关源码工程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91377.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91377.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/91377.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习:简介与任务分类总览

一、什么是深度学习&#xff1f;1.1 深度学习的定义深度学习&#xff08;Deep Learning&#xff09;是机器学习的一种特殊形式&#xff0c;它依赖于具有多层结构的神经网络自动从数据中学习特征并完成任务&#xff0c;如图像识别&#xff0c;语音识别&#xff0c;自然语言处理等…

MSPM0开发学习笔记:二维云台画图(2025电赛 附源代码及引脚配置)

前言 今年的电赛&#xff08;2025&#xff09;&#xff0c;很多题都与云台相关&#xff0c;因此为备战电赛&#xff0c;博主这边也是准备了一个由两个42步进电机驱动的云台并提前进行调试&#xff0c;避免赛题出来之后手忙脚乱的&#xff0c;这边的两个42步进电机采用同一个驱…

借助 Wisdom SSH 的 AI 助手构建 Linux 开发环境

借助Wisdom SSH的AI助手构建Linux开发环境 在Linux系统的开发场景中&#xff0c;快速、准确地搭建开发环境至关重要。Wisdom SSH凭借其强大的AI助手&#xff0c;能极大简化这一过程&#xff0c;其官网为ssh.wisdomheart.cn。以下以在Ubuntu 22.04服务器上构建Python开发环境&am…

Python 程序设计讲义(44):组合数据类型——集合类型:创建集合

Python 程序设计讲义&#xff08;44&#xff09;&#xff1a;组合数据类型——集合类型&#xff1a;创建集合 目录Python 程序设计讲义&#xff08;44&#xff09;&#xff1a;组合数据类型——集合类型&#xff1a;创建集合一、集合的特征二、创建集合&#xff1a;使用set()函…

10 - 大语言模型 —Transformer 搭骨架,BERT 装 “双筒镜”|解密双向理解的核心

目录 1、为什么 BERT 能 “懂” 语言&#xff1f;先看它的 “出身” 2、核心逻辑 2.1、“自学阶段”—— 预训练&#xff0c;像婴儿学说话一样积累语感 2.1.1、简述 2.1.2、核心本事&#xff1a;“双向注意力”&#xff0c;像人一样 “聚焦重点” 2.2、“专项复习”—— …

【Spring Boot 快速入门】四、MyBatis

目录MyBatis&#xff08;一&#xff09;入门简介MyBatis 入门LombokMyBatis 基础操作数据准备删除预编译新增更新查询XML 映射文件MyBatis&#xff08;一&#xff09;入门 简介 MyBatis 是一款 优秀的持久层框架&#xff0c;它支持 自定义 SQL、存储过程以及高级映射&#xf…

Spring IOC 基于Cglib实现含构造函数的类实例化策略

作者&#xff1a;小凯 分享、让自己和他人都能有所收获&#xff01; 一、前言 技术成长&#xff0c;是对场景设计细节不断的雕刻&#xff01; 你觉得自己的技术什么时候得到了快速的提高&#xff0c;是CRUD写的多了以后吗&#xff1f;想都不要想&#xff0c;绝对不可能&#xf…

composer 常用命令

### 设置镜像源全局设置composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/当个项目设置composer config repo.packagist composer https://mirrors.aliyun.com/composer/恢复官方源composer config -g --unset repos.packagist### 常用源阿里云…

【python】Python爬虫入门教程:使用requests库

Python爬虫入门教程&#xff1a;使用requests库 爬虫是数据获取的重要手段&#xff0c;下面我将通过一个完整的示例&#xff0c;教你如何使用Python的requests库编写一个简单的爬虫。我们将以爬取豆瓣电影Top250为例。 【python】网络爬虫教程 - 教你用python爬取豆瓣电影 Top…

OpenCV图像缩放:resize

图像缩放是图像处理中的基础操作之一。无论是图像预处理、数据增强还是图像金字塔构建&#xff0c;cv::resize 都是我们最常用的函数之一。但你是否注意到&#xff0c;在 OpenCV 中同时还存在一个名为 cv::Mat::resize 的方法&#xff1f;这两个函数虽然名字类似&#xff0c;但…

汽车、航空航天、适用工业虚拟装配解决方案

一、现状在制造业数字化转型浪潮中&#xff0c;传统装配过程仍面临诸多挑战&#xff1a;物理样机试错成本高、装配周期冗长、工艺优化依赖经验、跨部门协作效率低下……如何打破“试错-返工”的恶性循环&#xff1f;目前总装工艺通过DELMIA、NX、Creo等工程软件进行工艺装配验证…

页面跳转和前端路由的区别

传统方式&#xff1a;通过改变浏览器地址栏的 URL 来实现window.location.href /new-page<a href"/new-page">跳转到新页面</a>会导致整个页面重新加载会触发浏览器向服务器发送新的请求页面状态不会保留&#xff0c;所有资源重新加载可以避免新上线的内…

C/C++核心知识点详解

C/C核心知识点详解 1. 变量的声明与定义&#xff1a;内存分配的本质区别 核心概念 在C/C中&#xff0c;变量的声明和定义是两个完全不同的概念&#xff1a; 声明&#xff08;Declaration&#xff09;&#xff1a;告诉编译器变量的名称和类型&#xff0c;但不分配内存空间定义&a…

物联网发展:从概念到应用的演变历程

物联网的发展历程是一部技术革新与社会需求共同驱动的进化史&#xff0c;其演变可划分为概念萌芽、技术积累、应用拓展和智能融合四个阶段&#xff0c;每个阶段均以关键技术突破或社会需求变革为标志&#xff0c;最终形成万物互联的智能生态。以下是具体演变历程&#xff1a;一…

一个人开发一个App(数据库)

后端要保存数据&#xff0c;我还是选择了关系型数据库Mysql, 因为其它的不熟悉。 flutter端这次我选择的是ObjectBox&#xff0c;以前都是直接用的sqlite3&#xff0c;看对比ObjectBox效率比sqlite3高许多&#xff0c;这次前端为了用户体验&#xff0c;我需要缓存数据&#xff…

天铭科技×蓝卓 | “1+2+N”打造AI驱动的汽车零部件行业智能工厂

7月24日&#xff0c;杭州天铭科技股份有限公司&#xff08;简称 “天铭科技”&#xff09;与蓝卓数字科技有限公司&#xff08;简称 “蓝卓”&#xff09;签订全面战略合作协议。天铭科技董事长张松、副总经理艾鸿冰&#xff0c;蓝卓副董事长谭彰等领导出席签约仪式&#xff0c…

技术复盘报告:Vue表格中多行文本字段数据保存丢失问题

1. 问题背景 在一个基于 Vue 2.0 和 ElementUI 的复杂数据维护页面中&#xff0c;用户报告了一个偶发但严重的问题&#xff1a;在表格中编辑一个多行文本&#xff08;textarea&#xff09;字段时&#xff0c;输入的内容有时会在点击“保存”后丢失。 具体表现&#xff1a; 前端…

#C语言——学习攻略:深挖指针路线(四)--字符指针变量,数组指针变量,二维数组传参的本质,函数指针变量,函数指针数组

&#x1f31f;菜鸟主页&#xff1a;晨非辰的主页 &#x1f440;学习专栏&#xff1a;《C语言学习》 &#x1f4aa;学习阶段&#xff1a;C语言方向初学者 ⏳名言欣赏&#xff1a;"暴力解法是上帝给的&#xff0c;优化解法是魔鬼教的。" 目录 1. 字符指针变量 1.1 使…

SpringBoot收尾+myBatis plus

一、数据传递返回值为:字符串package com.apesource.springboot_web_04.controller;import com.apesource.springboot_web_04.pojo.Emp; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;/*** 返回值为:字符…

基于 Spring Boot 实现动态路由加载:从数据库到前端菜单的完整方案

在后台管理系统中&#xff0c;不同用户角色往往拥有不同的操作权限&#xff0c;对应的菜单展示也需动态调整。动态路由加载正是解决这一问题的核心方案 —— 根据登录用户的权限&#xff0c;从数据库查询其可访问的菜单&#xff0c;封装成前端所需的路由结构并返回。本文将详细…