FPGA开发之SRIO接口回环测试

一、接口部分

s_axis_ireq:发送接口

m_axis_treq:接收接口

m_axis_iresp:接收应答接口

s_axis_tresp:发送应答接口

tvalid : 表示数据有效

tdata : 有效数据,要有HELLO包头

tready : IP核输出,表示可以向其发送数据

tlast : 标志最后一个数据

tuser : ID号,仅tvalid 的第一个时钟周期内有效

tkeep : 固定为8’hFF

二、HELLO包头

见官方手册《PG007》P.76
HELLO格式的包中Size域的值等于传输的字节的总数减1,Size域的有效值范围为0~255字节
RapidIO协议定义了七种事务类型,每种事务类型执行不同的功能。RapidIO包格式中的FTYPE字段与TTYPE字段共同确定了事务的类型

三、外设数据传输

发送外设数据流总体流程是:

  1. 产生64位数据 :具体多少位依据IP核的配置

  1. 写s_axis_ireq接口时序 :只提供一种简单的时序,还有另一种多HELLO包传输格式的。注意一定要有包头!!!,tready在接收到包头后会输出1T的电平后拉高,所以包头后紧跟的数据需要多保持1T,具体可以看最后的仿真图;tvalid一定要保持高电平!!!,否则会进入第二种传输格式,本人在此处走了大量弯路。
    但是,如果你的数据无法连续,那么就在D0后拉低tvalid,等待有效数据,当再次拉高tvalid后tready依旧会在下1T拉低,之后再有效,详见仿真二。

  2. IP核自动通过srio_tx_p和srio_tx_n 发送数据

  3. 短接srio_tx_p核srio_rx_p 、srio_tx_n 和srio_rx_n

  4. 抓取m_axis_treq接口输出信号,可以看到包头已被修变,载荷正常
    仿真一:数据连续


    仿真二:数据不连续,注意在tready拉低时不要丢失数据,这里丢失了3

四、程序

module srio_top(input clk_125m_p,input clk_125m_n,input rstn,output srio_tx_p,output srio_tx_n,input  srio_rx_p,input  srio_rx_n);reg            ireq_tvalid  ;wire           ireq_tready  ;reg            ireq_tlast   ;reg   [63:0]   ireq_tdata   ;reg   [7:0]    ireq_tkeep   ;reg   [31:0]   ireq_tuser   ;wire           treq_tvalid ;wire           treq_tready ;wire           treq_tlast  ;wire  [63:0]   treq_tdata  ;wire  [7:0]    treq_tkeep  ;wire  [31:0]   treq_tuser  ;wire            log_clk;wire            log_rst;reg [7:0] SM_COUNT;reg [31:0] cnt_interval;reg [31:0] cnt_sent;
assign treq_tready = 1'b1;always @(posedge log_clk or posedge log_rst) beginif(log_rst == 1'b1) beginireq_tvalid <= 0;ireq_tlast  <= 0; ireq_tdata  <= 0; ireq_tkeep  <= 8'hff; ireq_tuser  <= 8'd1; SM_COUNT    <= 0;cnt_sent    <= 0;endelse begincase (SM_COUNT)8'd0: beginif(cnt_interval >= 32'd125_000_000)SM_COUNT <= 1;else beginSM_COUNT <= 0;ireq_tvalid <= 1'b0;ireq_tlast  <= 1'b0;endend8'd1: beginireq_tdata <= 64'h0154_2c80_0000_0007;SM_COUNT <= 2;end8'd2: beginireq_tvalid <= 1'b1;SM_COUNT <= 3;end8'd3: beginireq_tdata  <= 64'h0;SM_COUNT    <= 4;end8'd4: beginireq_tdata  <= ireq_tdata + 64'h01;if(cnt_sent <= 4'd10)begincnt_sent    <= cnt_sent + 1;SM_COUNT    <= 4;endelse beginSM_COUNT    <= 0;ireq_tlast  <= 1;cnt_sent    <= 0;endenddefault: ;endcaseendendalways @(posedge log_clk or posedge log_rst) beginif(log_rst == 1'b1) begincnt_interval <= 32'd0;endelse if(SM_COUNT == 8'd0) begincnt_interval <= cnt_interval + 32'd1;endelsecnt_interval <= 32'd0;endsrio_gen2_0 srio_gen_inst (.sys_clkp(clk_125m_p),                                            // input wire sys_clkp.sys_clkn(clk_125m_n),                                            // input wire sys_clkn.sys_rst(~rstn),                                              // input wire sys_rst.log_clk_out(log_clk),                                      // output wire log_clk_out.buf_rst_out( ),                                      // output wire buf_rst_out.log_rst_out(log_rst),                                      // output wire log_rst_out.gt_pcs_rst_out( ),                                // output wire gt_pcs_rst_out.gt_pcs_clk_out( ),                                // output wire gt_pcs_clk_out.cfg_rst_out( ),                                      // output wire cfg_rst_out.deviceid( ),                                            // output wire [15 : 0] deviceid.port_decode_error( ),                          // output wire port_decode_error.s_axis_ireq_tvalid(ireq_tvalid),                        // input wire s_axis_ireq_tvalid.s_axis_ireq_tready(ireq_tready),                        // output wire s_axis_ireq_tready.s_axis_ireq_tlast( ireq_tlast),                          // input wire s_axis_ireq_tlast.s_axis_ireq_tdata(ireq_tdata),                          // input wire [63 : 0] s_axis_ireq_tdata.s_axis_ireq_tkeep(ireq_tkeep),                          // input wire [7 : 0] s_axis_ireq_tkeep.s_axis_ireq_tuser(ireq_tuser),                          // input wire [31 : 0] s_axis_ireq_tuser.m_axis_iresp_tvalid( ),                      // output wire m_axis_iresp_tvalid.m_axis_iresp_tready(0 ),                      // input wire m_axis_iresp_tready.m_axis_iresp_tlast( ),                        // output wire m_axis_iresp_tlast.m_axis_iresp_tdata( ),                        // output wire [63 : 0] m_axis_iresp_tdata.m_axis_iresp_tkeep( ),                        // output wire [7 : 0] m_axis_iresp_tkeep.m_axis_iresp_tuser( ),                        // output wire [31 : 0] m_axis_iresp_tuser.m_axis_treq_tvalid(treq_tvalid),                        // output wire m_axis_treq_tvalid.m_axis_treq_tready(treq_tready),                        // input wire m_axis_treq_tready.m_axis_treq_tlast (treq_tlast ),                          // output wire m_axis_treq_tlast.m_axis_treq_tdata (treq_tdata ),                          // output wire [63 : 0] m_axis_treq_tdata.m_axis_treq_tkeep (treq_tkeep ),                          // output wire [7 : 0] m_axis_treq_tkeep.m_axis_treq_tuser (treq_tuser ),                          // output wire [31 : 0] m_axis_treq_tuser.s_axis_tresp_tvalid(0 ),                      // input wire s_axis_tresp_tvalid.s_axis_tresp_tready( ),                      // output wire s_axis_tresp_tready.s_axis_tresp_tlast(0 ),                        // input wire s_axis_tresp_tlast.s_axis_tresp_tdata(0 ),                        // input wire [63 : 0] s_axis_tresp_tdata.s_axis_tresp_tkeep(0 ),                        // input wire [7 : 0] s_axis_tresp_tkeep.s_axis_tresp_tuser(0 ),                        // input wire [31 : 0] s_axis_tresp_tuser.s_axi_maintr_rst(0 ),                            // input wire s_axi_maintr_rst.s_axi_maintr_awvalid(0 ),                    // input wire s_axi_maintr_awvalid.s_axi_maintr_awready( ),                    // output wire s_axi_maintr_awready.s_axi_maintr_awaddr(0 ),                      // input wire [31 : 0] s_axi_maintr_awaddr.s_axi_maintr_wvalid(0 ),                      // input wire s_axi_maintr_wvalid.s_axi_maintr_wready( ),                      // output wire s_axi_maintr_wready.s_axi_maintr_wdata(0 ),                        // input wire [31 : 0] s_axi_maintr_wdata.s_axi_maintr_bvalid( ),                      // output wire s_axi_maintr_bvalid.s_axi_maintr_bready(0 ),                      // input wire s_axi_maintr_bready.s_axi_maintr_bresp( ),                        // output wire [1 : 0] s_axi_maintr_bresp.s_axi_maintr_arvalid(0 ),                    // input wire s_axi_maintr_arvalid.s_axi_maintr_arready( ),                    // output wire s_axi_maintr_arready.s_axi_maintr_araddr(0 ),                      // input wire [31 : 0] s_axi_maintr_araddr.s_axi_maintr_rvalid( ),                      // output wire s_axi_maintr_rvalid.s_axi_maintr_rready(0 ),                      // input wire s_axi_maintr_rready.s_axi_maintr_rdata( ),                        // output wire [31 : 0] s_axi_maintr_rdata.s_axi_maintr_rresp( ),                        // output wire [1 : 0] s_axi_maintr_rresp.gt_clk_out( ),                                        // output wire gt_clk_out.drpclk_out( ),                                        // output wire drpclk_out.refclk_out( ),                                        // output wire refclk_out.buf_lcl_response_only_out( ),          // output wire buf_lcl_response_only_out.buf_lcl_tx_flow_control_out( ),      // output wire buf_lcl_tx_flow_control_out.idle2_selected( ),                                // output wire idle2_selected.idle_selected( ),                                  // output wire idle_selected.buf_lcl_phy_buf_stat_out( ),            // output wire [5 : 0] buf_lcl_phy_buf_stat_out.phy_clk_out( ),                                      // output wire phy_clk_out.gt0_qpll_clk_out( ),                            // output wire gt0_qpll_clk_out.gt0_qpll_out_refclk_out( ),              // output wire gt0_qpll_out_refclk_out.phy_rst_out( ),                                      // output wire phy_rst_out.sim_train_en(0),                                    // input wire sim_train_en.phy_mce( ),                                              // input wire phy_mce.phy_link_reset( ),                                // input wire phy_link_reset.force_reinit( ),                                    // input wire force_reinit.phy_lcl_phy_next_fm_out( ),              // output wire [5 : 0] phy_lcl_phy_next_fm_out.phy_lcl_phy_last_ack_out( ),            // output wire [5 : 0] phy_lcl_phy_last_ack_out.link_initialized( ),                            // output wire link_initialized.phy_lcl_phy_rewind_out( ),                // output wire phy_lcl_phy_rewind_out.phy_lcl_phy_rcvd_buf_stat_out( ),  // output wire [5 : 0] phy_lcl_phy_rcvd_buf_stat_out.phy_rcvd_mce( ),                                    // output wire phy_rcvd_mce.phy_rcvd_link_reset( ),                      // output wire phy_rcvd_link_reset.port_error( ),                                        // output wire port_error.port_initialized( ),                            // output wire port_initialized.clk_lock_out( ),                                    // output wire clk_lock_out.mode_1x( ),                                              // output wire mode_1x.port_timeout( ),                                    // output wire [23 : 0] port_timeout.srio_host( ),                                          // output wire srio_host.phy_lcl_master_enable_out( ),          // output wire phy_lcl_master_enable_out.phy_lcl_maint_only_out( ),                // output wire phy_lcl_maint_only_out.gtrx_disperr_or( ),                              // output wire gtrx_disperr_or.gtrx_notintable_or( ),                        // output wire gtrx_notintable_or.phy_debug( ),                                          // output wire [223 : 0] phy_debug.srio_txn0(srio_tx_n),                                          // output wire srio_txn0.srio_txp0(srio_tx_p),                                          // output wire srio_txp0.srio_rxn0(srio_rx_n),                                          // input wire srio_rxn0.srio_rxp0(srio_rx_p)                                          // input wire srio_rxp0
);ila_0 your_instance_name (.clk(log_clk), // input wire clk.probe0(ireq_tvalid ), // input wire [0:0]  probe0  .probe1(ireq_tready ), // input wire [0:0]  probe1 .probe2(ireq_tlast  ), // input wire [0:0]  probe2 .probe3(ireq_tdata  ), // input wire [63:0]  probe3 .probe4(treq_tvalid ), // input wire [0:0]  probe4 .probe5(treq_tready ), // input wire [0:0]  probe5 .probe6(treq_tlast  ), // input wire [0:0]  probe6 .probe7(treq_tdata  ) // input wire [63:0]  probe7
);    endmodule

FPGA开发之SRIO接口相关推荐

  1. 微信公众号开发之 “`高级接口`” 总结

    微信公众号开发之 "高级接口" 总结 代码如下: <?php// $weixin = new class_weixin("", "") ...

  2. FPGA开发之RAM IP的使用

    CORE Generator里有很多的IP核,适合用于各方面的设计.一般来说,它包括了:基本模块,通信与网络模块,数字信号处理模块,数字功能设计模块,存储器模块,微处理器,控制器与外设,标准与协议设计 ...

  3. Mybatis-Dao层开发之Mapper接口

    Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法. Mapper接口开发 ...

  4. arcEngine开发之IMapControl接口

    简介 IMapControl接口最重要的是包含IMap属性,还提供另外的属性用于:管理一般的外观显示,管理图层,加载地图文档以及跟踪在界面上显示的图形. 小知识点:一般一个接口的最新实现是 Defau ...

  5. FPGA开发之UART的使用

    UART使用过程中的一些错误提示 首先是关于UART测试的步骤: 在使用超级终端软件测试UART的回显时,一定要遵循以下步骤: 1.烧写工程与测试程序给FPGA芯片 2.连接串口通信线 3.打开软件  ...

  6. 物联网开发笔记(96)- Micropython ESP32开发之SPI接口控制Micro SD卡TF卡模块挂载内存卡

    一.目的 这一节我们学习如何使用乐鑫的ESP32开发板连接SD卡模块,进行目录.文件的相关操作. 在早前我们也介绍过TFT SD卡的操作,这里我们重新复习一下. 物联网开发笔记(60)- 使用Micr ...

  7. FPGA开发之SD卡初始化

    终于找到一篇说人话的了.使用下面的东西进行SD卡初始化,接着用命令进行读写操作看下一篇博客! 1.SD卡的官方资料(我承认这个资料很垃圾,比起民间的技术总结它的内容可谓又臭又长,但是作为基础也要了解一 ...

  8. ArcGIS Engine开发之旅08--和查询相关的对象和接口

    ArcGIS Engine开发之旅08--和查询相关的对象和接口 原文:ArcGIS Engine开发之旅08--和查询相关的对象和接口 查询在GIS领域应该是一个很频繁的操作,在GIS中除了具有属性 ...

  9. android 接口实现方法,Android应用开发之Android 请求网络接口实现方法

    本文将带你了解Android应用开发之Android 请求网络接口实现方法,希望本文对大家学Android有所帮助. public   class Fragment01 extends Fragmen ...

最新文章

  1. 2-Entity RANSAC:在变化的环境中进行稳健的视觉定位
  2. 正则表达式(Regular Expressions)
  3. poj3070 Fibonacci 矩阵快速幂
  4. 从业务在线到互联互通,钉钉宜搭进入低代码3.0阶段新模式
  5. Elasticsearch之插件介绍及安装
  6. php正则表达式图谱
  7. event事件的坐标 offsetWidth client scroll
  8. web.config中特殊字符的处理
  9. 无人车业务中的视觉三维重建
  10. LearnGL - 13 - PointLight - 点光源
  11. DBCP连接池配置优化分析
  12. 从faker.js 开源作者Marak已删除了GIthub所有代码我们得到了什么教训
  13. 关于极光APP推送JPUSH的服务器端使用
  14. 【自动化测试】自动化测试框架那些事儿
  15. BackTrack5(BT5)及BT5支持网卡列表
  16. 癌症来临,应该怎么办?
  17. 网易游戏AI Lab招聘计算机视觉日常实习生
  18. 【QT】Qtcreator常用快捷键
  19. Delphi 程序运行提示 “Database Login”对话框,让输入ADOConnection1 的UserName和Password...
  20. 风电随机性动态经济调度模型(Matlab代码实现)

热门文章

  1. php文件上传七牛云,PHP 文件上传七牛云
  2. lex(flex)yacc(bison)
  3. 树莓派配置mjpg视频流
  4. 好用的windwos office网站
  5. js 单引号替换成双引号,双引号替换成单引号 操作
  6. Ajax的特性以及用法
  7. L0CV开源项目节选 | 第 23 章 轻量级网络浅析
  8. 深度强化学习算法调参
  9. 互斥锁的含义及其使用
  10. 安卓手机4G/5G网络数据流量(非WiFi)设置加密DNS