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字段共同确定了事务的类型
三、外设数据传输
发送外设数据流总体流程是:
- 产生64位数据 :具体多少位依据IP核的配置
-
写s_axis_ireq接口时序 :只提供一种简单的时序,还有另一种多HELLO包传输格式的。注意一定要有包头!!!,tready在接收到包头后会输出1T的电平后拉高,所以包头后紧跟的数据需要多保持1T,具体可以看最后的仿真图;tvalid一定要保持高电平!!!,否则会进入第二种传输格式,本人在此处走了大量弯路。
但是,如果你的数据无法连续,那么就在D0后拉低tvalid,等待有效数据,当再次拉高tvalid后tready依旧会在下1T拉低,之后再有效,详见仿真二。
-
IP核自动通过srio_tx_p和srio_tx_n 发送数据
-
短接srio_tx_p核srio_rx_p 、srio_tx_n 和srio_rx_n
-
抓取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