总的目录在这哦~
https://blog.csdn.net/z123canghai/article/details/114648658
目录
第二章 Rapidio技术概述
协议的出现是为了解决实际问题,所以对本章内容的理解要基于这一点。
Rapidio协议组成的基本要素是包和控制符号,包是基于各种协议的传输数据内容,控制符号是用于物理层的数据交互的调控。
本章讲述了推动rapidio互连技术的总体原则、协议规范的划分以及具体的协议内容。总体原则定了协议内容的走向,协议规范描述协议的框架,在这二者要求之下逐步逐层介绍协议内容。
2.1 总体原则
协议目的是为了:解决机箱间或板卡间或器件间的短距离高速互连
要具备的特点有:
- 提高性能:
- 限制协议开销,提高运载能力
- 管理硬件错误,互连技术应具有检测所有可能发生错误的能力,并可以利用硬件机制从错误中自动回复
- 限制硅片封装尺寸,芯片上也是寸土寸金啊,太大了不好。
- 限制对软件的影响,做好封装接口
- 增强兼容性和扩展性:
- 充分利用现有的I/O驱动技术和接收器技术,例如fpga直接用固有硬件GTP就可以了
- 协议划分规范,增强技术的重用性,以后在现有技术上增加内容也不受影响
因此,Rapidio体系的总体原则就是满足高性能嵌入式系统的独特需求,具有短距离、高性能、可兼容的应用特点。
2.2 协议概述
协议概述包括协议的传输机制、协议结构和协议格式三项内容。传输机制介绍数据包在器件间的传输方式,协议结构主要阐述协议的层级机构特点、协议格式简要说明协议包括的主要内容及大致分类。
2.2.1 传输机制
Rapidio操作是基于请求和响应进行的。请求即发送,例如A与B进行数据通信,A发送到B的数据可能是给B的数据,也可能是一个请求读的“信号”,无论是什么,我们都称之为请求数据包,当B接收到A的数据,若对此做出反应,我们称之为响应,那么A接收B的数据包就是响应包了,但B也可能主动给A发送数据,对A来说,依旧是响应数据包。总之,对于一端来说,发出去的就是请求,接收的就是响应。而数据包“包”是端点器件通讯的基本单元,所以说,不同器件间的数据交换就是数据包的传递。如下图就是一个请求数据包与响应数据包的传输流程。
在第一章我们阐述了对交互的理解,再次就不再赘述了。“Acknowledge Symbol”是物理层的数据包,它们就好像交通警察一样,协调各个路口的数据交换,以防拥堵、丢包、错包情况,我们称之为“控制符号”,在第四章会对此进行详细描述。
2.2.2 协议结构
Rapidio采用三级分层体系结构,实现基于请求和响应事务的逻辑操作。其中逻辑层定义包的格式,是数据产生之源头,数据发送之端点。传输层为包添加源和目的ID并指示其位宽。物理层主要有两个任务,一个是通过物理结构实现串并转换及8b/10b的编码与解码,另一个是为协议添加必要的信息,如下图可见,包就是在这三级分层中不断添加信息成的,就好像快递一样,不断的包装,最终组成一个可以完整传送到目的地的包裹。
这种层级结构具有很好的兼容性,当新加了一种规范或者说协议,不需要改变其它层的结构,更不需要更改硬件设备,非常的灵活。本章不讲具体的内容,就比如每个字符表示什么含义等,这在下一章节描述。
2.2.3 协议格式
2.2.2我们阐述了一包数据是如何包装的,这小节就来讲述这“包”里面装的是什么。也就是“事务类型和格式”。A想要从自己的帐户中转1000块钱到B的帐户里。那个从A开始转帐,到转帐结束的这一个过程,称之为一个事务。我觉得有必要再重复一下什么是rapidio,它是硬件和软件的集合,软件就是协议,就是上一节所阐述的内容,是我们通过代码来实现的,硬件就是在芯片里面会集成这样一个电路,满足我们进行rapidio协议的数据传输的需求。在一定程度上,我们可以把互连的rapoidio器件看作一个又一个的站点,那么互连的链路就是集散地和公路,在公路上我们可以开符合国家标准的车辆,这些车辆可以是卡车、轿车、救护车。同样,rapidIO的硬件链路上也支持满足其要求的不同类型的数据包,我们把不同类型的数据包称之为事务,大的事务又被分为多个小事务,林林总总一堆事务,就是rapidio各样的协议。这和卡车有大卡小卡,客车有大巴小巴一个道理。如果你研发了一款新车,只要符合国家要求,也可以上路,rapidio协议也是这样,这也就是前文所说的rapidio的灵活性。
Rapidio有多种协议方式,差不多15种。我们也可以理解为在rapidio链路上,有15种类型的车辆是允许上路的。我们在对协议进行归纳时也有多种分类方式,一般情况,我们有两种分类方式,一是按照数据格式分类,有时候称之为事务类型,准许的说是“格式类型”Ftype (Format Type),其实我们需要对它有个准确的称呼,这有助于对协议的理解。如果按照事务类型分类,常用的可以分为如下几类:大致看看就好,后续还会着重介绍的。
Ftype | Ttype | 包类型 | 功能 |
2 | 4’b0100 | NREAD | 读指定的地址 |
4’b1100 | ATOMIC increment | 先往指定的地址中传递数据,在把传递的数据加1,此操作为原子操作,不可打断 | |
4’b1101 | ATOMIC decrement | 先往指定的地址中传递数据,在把传递的数据减1,此操作为原子操作,不可打断 | |
4’b1110 | ATOMIC set | 把指定地址中的数据每个bit全部写1 | |
4’b1111 | ATOMIC clear | 把指定地址中的数据清0(每个bit全部清零) | |
5 | 4’b0100 | NWRITE | 往指定的地址写数据 |
4’b0101 | NWRITE_R | 往指定的地址写数据,写完成以后接收目标器件(Target)的响应 | |
4’b1101 | ATOMIC test/swap | 对指定地址中的数据进行测试并交换,此操作为原子操作,不可打断 | |
6 | 4’bxxxx | SWRITE | 以流写方式写指定的地址,与NWRITE以及NWRITE_R相比,此方式效率最高 |
8 | 4’b0000 | MAINTENANCE read request | 发起读配置,控制,状态寄存器请求 |
4’b0001 | MAINTENANCE write request | 发起写配置,控制,状态寄存器请求 | |
4’b0010 | MAINTENANCE read response | 产生读配置,控制,状态寄存器响应 | |
4’b0011 | MAINTENANCE write response | 产生写配置,控制,状态寄存器响应 | |
4’b0100 | MAINTENANCE write resquest | 端口写请求 | |
10 | 4’bxxxx | DOORBELL | 门铃 |
11 | 4’bxxxx | MESSAGE | 消息 |
13 | 4’b0000 | RESPONSE no data | 不带有效数据的响应包 |
4’b1000 | RESPONSE with data | 带有效数据的响应包 |
除了这种分类方式,还有其他的分类方式,例如按功能特点分类,也是xilinx的IP核所用的分类方式,这种分类方式在我看来也是比较好理解的。根据功能可分为I/O操作、维护操作、消息事务这三类。I/O操作就好比运输货物的卡车,载人的客车,目的是完成内容从一端到另一端的传递,由于采用不同的车型,所以会有以下几种I/O操作。
操作 | 使用的事务 | 描述 |
请求类事务 | NREAD、ATOMIC_inc、dec、set、clr | 从目标器件中读数据 |
写 | NWRITE | 往目标器件中写数据 |
有响应写 | NWRITE_R、RESPONSE | 往目标器件中写数据,写完后等待目标的响应 |
流写 | SWRITE | 面向大数据量DMA传输优化写数据 |
Atomic | ATOMIC、RESPONSE | 原子操作,读-修改-写,事务不能被打断 |
维护事务就可以理解为救火车、急救车等,是为了为何各个集散地的正常运行。消息事务是大喇叭,是广播,是传递些通知的内容。
就关于官方的实例分析,不仅实现了对核的配置、仿真,还对信号进行了整理,如下所示
开发软软件为vivado2016.4,打开工程点击“Flow”选择“open static simulation”打开静态仿真可直接查看信号波形
相关程序可关注“沧小海的FPGA”微信公众号回复“SRIO”即可获取,感谢关注~