FPGA开发之SRIO接口

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) begin
        if(log_rst == 1'b1) begin
            ireq_tvalid <= 0;
            ireq_tlast  <= 0; 
            ireq_tdata  <= 0; 
            ireq_tkeep  <= 8'hff; 
            ireq_tuser  <= 8'd1; 
            SM_COUNT    <= 0;
            cnt_sent    <= 0;
        end
        else begin
            case (SM_COUNT)
                8'd0: begin
                    if(cnt_interval >= 32'd125_000_000)
                        SM_COUNT <= 1;
                    else begin
                        SM_COUNT <= 0;
                        ireq_tvalid <= 1'b0;
                        ireq_tlast  <= 1'b0;
                    end
                end
                8'd1: begin
                    ireq_tdata <= 64'h0154_2c80_0000_0007;
                    SM_COUNT <= 2
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值