SRIO学习(3)使用SRIO IP核进行设计

文章目录

  • 前言
  • 一、设计框图
  • 二、模块介绍
  • 三、上板验证

前言

本文将通过使用SRIO IP核实现数据通信,重点在于打通数据链路,具体的协议内容设计并非重点,打通了链路大家自己根据设计需求来即可。

一、设计框图

看了前面高速接口的一些设计,大家应该也比较熟悉xilinx的高速接口设计风格了,无非就是时钟、复位、common还有IP核。
在这里插入图片描述

二、模块介绍

复位和时钟模块在上一篇介绍时钟和复位的时候进行了介绍。与之前高速接口不同的是RapidIO有一套自己的交互协议规范,所以在基于FPGA进行设计的时候,需要按照规范进行传输数据和解析数据。我们重点不在于这块,因为我没有接触过这方面的需求,所以暂时只是可以使IP核实现正常的通信即可。
以下是一个很简单的数据收发模块,参考FPGA奇哥:https://space.bilibili.com/497026889/?spm_id_from=333.999.0.0

该代码实现以下功能:

  1. 发起一次写事务
  2. 发起一次门铃事件
  3. 发起一次读事件
  4. 发起一次消息事件

由于我是在FPGA上进行通信,所以整个实验仅仅是实现了这些消息的传输过程,并没有所谓的DMA,中端处理等。

module SRIO_engine(input               i_clk                   ,input               i_rst                   ,output              m_axis_ireq_tvalid      , input               m_axis_ireq_tready      , output              m_axis_ireq_tlast       , output [63:0]       m_axis_ireq_tdata       , output [7 :0]       m_axis_ireq_tkeep       , output [31:0]       m_axis_ireq_tuser       , input               s_axis_iresp_tvalid     , output              s_axis_iresp_tready     , input               s_axis_iresp_tlast      , input  [63:0]       s_axis_iresp_tdata      , input  [7 :0]       s_axis_iresp_tkeep      , input  [31:0]       s_axis_iresp_tuser      , input               s_axis_treq_tvalid      , output              s_axis_treq_tready      , input               s_axis_treq_tlast       , input  [63:0]       s_axis_treq_tdata       , input  [7 :0]       s_axis_treq_tkeep       , input  [31:0]       s_axis_treq_tuser       , output              m_axis_tresp_tvalid     , input               m_axis_tresp_tready     , output              m_axis_tresp_tlast      , output [63:0]       m_axis_tresp_tdata      , output [7 :0]       m_axis_tresp_tkeep      , output [31:0]       m_axis_tresp_tuser       
);
/******************************function*****************************//******************************parameter****************************//******************************mechine******************************/
localparam              P_ST_IDLE           = 0 ,P_ST_WRITE          = 1 ,P_ST_DB             = 2 ,P_ST_READ           = 3 ,P_ST_MESSAGE        = 4 ,P_ST_END            = 5 ;reg  [7 :0]             r_st_current            ;
reg  [7 :0]             r_st_next               ;
reg  [15:0]             r_st_cnt                ;
/******************************reg**********************************/
reg                     rm_axis_ireq_tvalid     ;
reg                     rm_axis_ireq_tlast      ;
reg  [63:0]             rm_axis_ireq_tdata      ;
reg  [7 :0]             rm_axis_ireq_tkeep      ;
reg  [31:0]             rm_axis_ireq_tuser      ;
reg                     rs_axis_iresp_tready    ;
reg                     rs_axis_treq_tready     ;
reg                     rm_axis_tresp_tvalid    ;
reg                     rm_axis_tresp_tlast     ;
reg  [63:0]             rm_axis_tresp_tdata     ;
reg  [7 :0]             rm_axis_tresp_tkeep     ;
reg  [31:0]             rm_axis_tresp_tuser     ;
reg  [15:0]             r_pkt_cnt               ;
reg  [7 :0]             r_read_cmd              ;
reg                     r_read_cmd_valid        ;
reg                     r_read_triger           ;
reg  [15:0]             r_treq_cnt              ;
reg  [15:0]             r_read_cnt              ;
/******************************wire*********************************/
wire                    w_m_axis_ireq_act       ;
wire                    w_s_axis_iresp_act      ;
wire                    w_s_axis_treq_act       ;
wire                    w_m_axis_tresp_act      ;
/******************************component****************************//******************************assign*******************************/
assign m_axis_ireq_tvalid  = rm_axis_ireq_tvalid    ;
assign m_axis_ireq_tlast   = rm_axis_ireq_tlast     ;
assign m_axis_ireq_tdata   = rm_axis_ireq_tdata     ;
assign m_axis_ireq_tkeep   = rm_axis_ireq_tkeep     ;
assign m_axis_ireq_tuser   = rm_axis_ireq_tuser     ;
assign s_axis_iresp_tready = rs_axis_iresp_tready   ;
assign s_axis_treq_tready  = rs_axis_treq_tready    ;
assign m_axis_tresp_tvalid = rm_axis_tresp_tvalid   ;
assign m_axis_tresp_tlast  = rm_axis_tresp_tlast    ;
assign m_axis_tresp_tdata  = rm_axis_tresp_tdata    ;
assign m_axis_tresp_tkeep  = rm_axis_tresp_tkeep    ;
assign m_axis_tresp_tuser  = rm_axis_tresp_tuser    ;
assign w_m_axis_ireq_act   = m_axis_ireq_tvalid & m_axis_ireq_tready;
assign w_s_axis_iresp_act  = s_axis_iresp_tvalid & s_axis_iresp_tready;
assign w_s_axis_treq_act   = s_axis_treq_tvalid & s_axis_treq_tready;
assign w_m_axis_tresp_act  = m_axis_tresp_tvalid & m_axis_tresp_tready;
/******************************always*******************************/
always@(posedge i_clk,posedge i_rst) 
beginif(i_rst) r_st_current <= P_ST_IDLE;else r_st_current <= r_st_next;
endalways@(*)
begincase(r_st_current)P_ST_IDLE       :r_st_next <= r_st_cnt == 1000                          ? P_ST_WRITE    : P_ST_IDLE     ;P_ST_WRITE      :r_st_next <= w_m_axis_ireq_act & rm_axis_ireq_tlast    ? P_ST_DB       : P_ST_WRITE    ;P_ST_DB         :r_st_next <= w_m_axis_ireq_act & rm_axis_ireq_tlast    ? P_ST_READ     : P_ST_DB       ;P_ST_READ       :r_st_next <= w_s_axis_iresp_act & s_axis_iresp_tlast   ? P_ST_MESSAGE  : P_ST_READ     ;P_ST_MESSAGE    :r_st_next <= w_m_axis_ireq_act & rm_axis_ireq_tlast    ? P_ST_END      : P_ST_MESSAGE  ;P_ST_END        :r_st_next <= P_ST_IDLE;default         :r_st_next <= P_ST_IDLE;endcase 
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)r_st_cnt <= 'd0;else if(r_st_current != r_st_next)r_st_cnt <= 'd0;else r_st_cnt <= r_st_cnt + 1;
end//======================Initiator===========================//
//组包逻辑
always@(posedge i_clk,posedge i_rst)
beginif(i_rst)rs_axis_treq_tready <= 'd0;else rs_axis_treq_tready <= 'd1;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)rs_axis_iresp_tready <= 'd0;else rs_axis_iresp_tready <= 'd1;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)rm_axis_ireq_tvalid <= 'd0;else if(w_m_axis_ireq_act && rm_axis_ireq_tlast)rm_axis_ireq_tvalid <= 'd0;else if(r_st_current == P_ST_WRITE && r_st_cnt == 0)rm_axis_ireq_tvalid <= 'd1;else if(r_st_current == P_ST_DB && r_st_cnt == 0)rm_axis_ireq_tvalid <= 'd1;else if(r_st_current == P_ST_READ && r_st_cnt == 0)rm_axis_ireq_tvalid <= 'd1;else if(r_st_current == P_ST_MESSAGE && r_st_cnt == 0)rm_axis_ireq_tvalid <= 'd1;else rm_axis_ireq_tvalid <= rm_axis_ireq_tvalid;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)rm_axis_ireq_tlast <= 'd0;else if(w_m_axis_ireq_act && rm_axis_ireq_tlast)rm_axis_ireq_tlast <= 'd0;else if(r_st_current == P_ST_DB && r_st_cnt == 0)rm_axis_ireq_tlast <= 'd1;else if(r_st_current == P_ST_MESSAGE && w_m_axis_ireq_act)rm_axis_ireq_tlast <= 'd1;else if(r_st_current == P_ST_READ && r_st_cnt == 0)rm_axis_ireq_tlast <= 'd1;else if(r_st_current == P_ST_WRITE && r_pkt_cnt == 32 - 1)rm_axis_ireq_tlast <= 'd1;else rm_axis_ireq_tlast <= rm_axis_ireq_tlast;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)rm_axis_ireq_tdata <= 'd0;else if(r_st_current == P_ST_WRITE && r_st_cnt == 0)rm_axis_ireq_tdata <=  {8'd0,4'b0101,4'b0100,1'b0,2'b1,1'b0,8'd255,2'b0,34'd0};else if(r_st_current == P_ST_DB && r_st_cnt == 0)rm_axis_ireq_tdata <= {8'd0,4'b1010,4'd0,1'b0,2'b0,1'b0,8'd0,2'b0,2'b0,8'd0,8'd0,16'd0};else if(r_st_current == P_ST_READ && r_st_cnt == 0)rm_axis_ireq_tdata <= {8'd0,4'b0010,4'd4,1'b0,2'b0,1'b0,8'd255,2'b0,34'd0};else if(r_st_current == P_ST_MESSAGE && r_st_cnt == 0)rm_axis_ireq_tdata <= {4'd0,4'd0,4'b1011,4'd0,1'b0,2'b0,1'b0,8'd63,2'b0,34'd0};else if(w_m_axis_ireq_act)case(r_pkt_cnt)0       :rm_axis_ireq_tdata <= {4{r_pkt_cnt}};default :rm_axis_ireq_tdata <= {4{r_pkt_cnt}};endcase else rm_axis_ireq_tdata <= rm_axis_ireq_tdata;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)r_pkt_cnt <= 'd0;else if(r_pkt_cnt == 32 && w_m_axis_ireq_act)r_pkt_cnt <= 'd0;else if(r_st_current == P_ST_WRITE && w_m_axis_ireq_act)r_pkt_cnt <= r_pkt_cnt + 1;else r_pkt_cnt <= r_pkt_cnt;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)rm_axis_ireq_tkeep <= 8'hff;else rm_axis_ireq_tkeep <= 8'hff;
end     always@(posedge i_clk,posedge i_rst)
beginif(i_rst)rm_axis_ireq_tuser <= 'd0;else rm_axis_ireq_tuser <= 'd0;
end//==================================Target===========================//
always@(posedge i_clk,posedge i_rst)
beginif(i_rst)r_treq_cnt <= 'd0;else if(w_s_axis_treq_act && s_axis_treq_tlast)r_treq_cnt <= 'd0;else if(w_s_axis_treq_act)r_treq_cnt <= r_treq_cnt + 1;else r_treq_cnt <= r_treq_cnt;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)r_read_cmd <= 'd0;else if(w_s_axis_treq_act && r_treq_cnt == 0)r_read_cmd <= s_axis_treq_tdata[55:48];else r_read_cmd <= r_read_cmd;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)r_read_cmd_valid <= 'd0;else if(w_s_axis_treq_act && r_treq_cnt == 0)r_read_cmd_valid <= 'd1;else r_read_cmd_valid <= 'd0;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)r_read_triger <= 'd0;else if(r_read_cmd_valid && r_read_cmd == {4'b0010,4'd4})r_read_triger <= 'd1;else r_read_triger <= 'd0;
end/*----带数据的响应报文----*/
always@(posedge i_clk,posedge i_rst)
beginif(i_rst)rm_axis_tresp_tvalid <= 'd0;else if(w_m_axis_tresp_act && rm_axis_tresp_tlast)rm_axis_tresp_tvalid <= 'd0;else if(r_read_triger)rm_axis_tresp_tvalid <= 'd1;elserm_axis_tresp_tvalid <= rm_axis_tresp_tvalid;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)rm_axis_tresp_tlast <= 'd0;else if(w_m_axis_tresp_act && rm_axis_tresp_tlast)rm_axis_tresp_tlast <= 'd0;else if(r_read_cnt == 32 - 0)rm_axis_tresp_tlast <= 'd1;elserm_axis_tresp_tlast <= rm_axis_tresp_tlast;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)rm_axis_tresp_tdata <= 'd0;else if(r_read_triger)rm_axis_tresp_tdata <= {8'd0,4'b1101,4'b1000,1'b1,2'd1,1'b0,8'd0,2'd0,34'd0};else if(w_m_axis_tresp_act)rm_axis_tresp_tdata <= {4{r_read_cnt - 1}};elserm_axis_tresp_tdata <= rm_axis_tresp_tdata;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)r_read_cnt <= 'd0;else if(r_read_cnt == 32 && w_m_axis_tresp_act)r_read_cnt <= 'd0;else if(r_read_triger || (r_read_cnt && w_m_axis_tresp_act))r_read_cnt <= r_read_cnt + 1;else r_read_cnt <= r_read_cnt;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)rm_axis_tresp_tkeep <= 'd0;elserm_axis_tresp_tkeep <= 8'hff;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)rm_axis_tresp_tuser <= 'd0;elserm_axis_tresp_tuser <= 'd0;
end     endmodule

三、上板验证

三次last信号分别表示了写事务、门铃以及读事务,发起端通过ireq通道发送,目的端通过treq接收。

在这里插入图片描述
这里是发起端通过iresp通道收到来自的目的端的带数据回应(针对于发起端发起的一次读事件,在目的端是通过tresp通道发送)
在这里插入图片描述

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

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

相关文章

探索算力(云计算、人工智能、边缘计算等):数字时代的引擎

引言 在数字时代&#xff0c;算力是一种至关重要的资源&#xff0c;它是推动科技创新、驱动经济发展的关键引擎之一。简而言之&#xff0c;算力即计算能力&#xff0c;是计算机系统在单位时间内完成的计算任务数量或计算复杂度的度量。随着科技的不断发展和应用范围的不断扩大…

流式密集视频字幕

流式密集视频字幕 摘要1 IntroductionRelated Work3 Streaming Dense Video Captioning Streaming Dense Video Captioning 摘要 对于一个密集视频字幕生成模型&#xff0c;预测在视频中时间上定位的字幕&#xff0c;理想情况下应该能够处理长的输入视频&#xff0c;预测丰富、…

C语言 | Leetcoce C语言题解之第18题四数之和

题目&#xff1a; 题解&#xff1a; int comp(const void* a, const void* b) {return *(int*)a - *(int*)b; }int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes) {int** quadruplets malloc(sizeof(int*) * 1001);*returnSize…

企业版ChatGPT用户激增至60万;百度文心一言推出个性化声音定制功能

&#x1f989; AI新闻 &#x1f680; 企业版ChatGPT用户激增至60万 摘要&#xff1a;OpenAI首席运营官Brad Lightcap在接受采访时透露&#xff0c;企业版ChatGPT的注册用户已超60万&#xff0c;相较2024年1月的15万用户&#xff0c;短短三个月内增长了300%。这一版本自2023年…

C++11新特性(2) ——动态内存和智能指针从入门到入坑

动态内存与智能指针 动态内存的使用十分容易出现问题&#xff08;内存泄漏/非法内存&#xff09;&#xff0c;而智能指针能更安全、容易的使用动态内存&#xff0c;因为他负责自动释放所指向的对象&#xff0c;并且在出现异常时&#xff0c;也会自动释放。 两种智能指针&#…

《springcloud alibaba》 四 seata安装以及使用

目录 准备调整db配置准备创建数据库 seata配置nacos配置confi.txt下载向nacos推送配置的脚本 启动seata新建项目order-seata项目 订单项目数据库脚本pom.xmlapplication.yml启动类实体类dao类service类controller类feign类mapper类 stock-seata 库存项目数据库脚本pom.xmlappli…

STM32学习和实践笔记(5):时钟树

STM32一共有4个时钟源。外部时钟高低速各一个&#xff0c;内部时钟高低速各一个。 外部高速时钟是&#xff1a;4-16MHZ的HSE OSC。HS表示高速high speed. E表示外部的external。开发板该处安装的8M晶振。 外部低速时钟是&#xff1a;32.768KHz的LSI OSC。LS表示高速low speed…

为说阿拉伯语的国家进行游戏本地化

阿拉伯语是由超过4亿人使用的语言&#xff0c;并且是二十多个国家的官方语言。进入这些国家的市场并非易事——虽然他们共享一种通用语言&#xff0c;但每个国家都有自己独特的文化&#xff0c;有自己的禁忌和对审查的处理方式。这就是为什么视频游戏公司长期以来都远离阿拉伯语…

Qt QML的插件(Qt Quick 2 Extension Plugin)方法

Qt Quick的插件方法 序言环境前置注意概念——Qt Quick插件的相关知识插件里的qml文件模块名的相关知识模块名本身注意事项模块名版本注意事项 以示例来说明创建插件qmltypes的生成qmltypes的可能性失效 插件的编码注意1、插件模块版本控制2、pro里的注意 调用插件插件信息输入…

华为手机 鸿蒙系统 或者安卓系统的百度网盘下载的文件保存在手机什么位置如何查看

华为手机 鸿蒙系统 或者安卓系统的百度网盘下载的文件保存在手机什么位置如何查看 连接电脑后一般在这里位置 计算机\Mate 20 Pro (UD)\内部存储\Download\BaiduNetdisk 也就是用usb&#xff08;数据线&#xff0c;不是充电线&#xff0c;要四心的 )连接手机后&#xff0c;打…

计算机网络——40各个层次的安全性

各个层次的安全性 安全电子邮件 Alice需要发送机密的报文m给Bob Alice 产生随机的对称秘钥&#xff0c; K s K_s Ks​使用 K s K_s Ks​对报文进行加密&#xff08;为了效率&#xff09;对 K s K_s Ks​使用Bob的公钥进行加密发送 K s ( m ) K_s(m) Ks​(m)和 K B ( K S ) K…

uniapp如何配置后使用uni.chooseLocation等地图位置api

在uniapp中想要使用uni.getLocation、uni.chooseLocation ……api的时候我们需要在小程序就开启配置&#xff0c;不然无法使用。 第一步&#xff1a;首先找到manifest.json 第二步&#xff1a;点击源码视图 第三步&#xff1a;在 mp-weixin 加入下面代码 "permission&…

Paper Digest | GPT-RE:基于大语言模型针对关系抽取的上下文学习

持续分享 SPG 及 SPG LLM 双驱架构应用相关进展 1、动机 在很多自然语言处理任务中&#xff0c;上下文学习的性能已经媲美甚至超过了全资源微调的方法。但是&#xff0c;其在关系抽取任务上的性能却不尽如人意。以 GPT-3 为例&#xff0c;一些基于 GPT-3 的上下文学习抽取方…

DXP学习002-PCB编辑器的环境参数及电路板参数相关设置

目录 一&#xff0c;dxp的pcb编辑器环境 1&#xff0c;创建新的PCB设计文档 2&#xff0c;PCB编辑器界面 1&#xff09;布线工具栏 2&#xff09;公用工具栏 3&#xff09;层标签栏 ​编辑 3&#xff0c;PCB设计面板 1&#xff09;打开pcb设计面板 4&#xff0c;PCB观…

【HTML】简单制作一个分形动画

目录 前言 开始 HTML部分 效果图 ​编辑​编辑​编辑​编辑总结 前言 无需多言&#xff0c;本文将详细介绍一段代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建一个文本文档&#xff0c;其中HTML的文件名改为[index.html]&a…

JavaEE初阶之单例模式详解

目录 题外话 正题 单例模式 概念 优点 缺点 饿汉式单例模式 代码及详解 懒汉式单例模式 代码及详解 小结 题外话 昨天爬山去了,回来吃了个烧烤有点累,昨天旷了一天,每周稳定发个五篇文章是没什么太大问题的 正题 单例模式 概念 是一种常见的软件设计模式,确保一个类…

nginx 配置访问地址和解决跨域问题(反向代理)

1、配置访问地址&#xff08;通过ip访问&#xff09; //配置ip访问地址 location ^~/auditApp{alias /usr/local/front-apps/cbd/auditApp;index index.html;if (!-e $request_filename) {rewrite ^/(.*) /auditApp/index.html last;break;}} 2、解决跨域问题&…

电商技术揭秘十四:大数据平台的选择与构建

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

如何使用Java和RabbitMQ实现延迟队列(方式二)?

前言 昨天写了一篇关于Java和RabbitMQ使用插件实现延迟队列功能的文章&#xff0c;今天来讲下另外一种方式&#xff0c;不需要RabbitMQ的插件。 前期准备&#xff0c;需要安装好docker、docker-compose的运行环境。 需要安装RabbitMQ的可以看下面这篇文章。 如何使用PHP和R…

AWS入门实践-在EC2上部署Wordpress网站

在AWS EC2上部署WordPress涉及到几个步骤&#xff0c;包括启动EC2实例、配置数据库、安装WordPress等。以下是详细的步骤和相应的命令脚本 第一步: 启动 EC2 实例 登录 AWS 控制台,进入 EC2 服务启动一个新的 EC2 实例,选择 Amazon Linux 2 AMI选择合适的实例类型(例如 t2.mi…