赞
踩
64B/66B编码将64bit“数据或控制信息”编码成66bit块来进行传输,这66bit中,前两位表示同步头(2bit Sync Header),主要用于接收端的数据对齐和接收数据位流的同步。
同步头有“01”和“10”两种:
(1)“01“表示后面的64bit都是数据。
(2)“10”表示后面的64bit是数据和控制信息的混合,其中紧挨着同步头的8b是类型域,后面的56bit是控制信息或者数据或者两者的混合
64B/66B编码格式图如下图所示:其中,D表示数据编码,每个数据码8bit;Z表示控制码,每个控制码7bit;S表示包的开始,T表示包的结束。S只会出现在8字节中的第0和第4字节,T能够出现在任意的字节。
图 1 Aurora 64B/66B 通道概述
图2 Aurora 64B/66B IP核心配置
在s_axi_tx_tvalid和s_axi_tx_tready同时为高时,发送数据。
在m_axi_tx_tvalid为高时,接收数据。
代码如下,m_axis_tvalid && m_axis_tready为1时,数据累加
- `timescale 1ns / 1ps
-
-
- module user_req_generate #(
- parameter USER_WR_DATA_WIDTH = 64
- )(
- input clk,
- input reset,
-
- input lane_up,
- input channel_up,
-
- output reg m_axis_tvalid,
- input m_axis_tready,
- output reg [USER_WR_DATA_WIDTH-1:0] m_axis_tdata,
- output [USER_WR_DATA_WIDTH/8-1 :0] m_axis_tkeep,
- output reg m_axis_tlast
-
- );
-
- localparam CNT_MAX = 150;
-
- reg [7:0] reset_timer;
- reg reset_sync_d0;
- reg reset_sync_d1;
- reg reset_sync;
- wire vio_wr;
- reg vio_wr_d0;
- reg vio_wr_d1;
- reg vio_wr_d2;
- reg [7:0] cnt;
-
- assign m_axis_tkeep = {USER_WR_DATA_WIDTH/8{1'b1}};
-
- always @(posedge clk or posedge reset) begin
- if (reset)
- reset_timer <= 8'd0;
- else if (~ (lane_up | channel_up) )
- reset_timer <= 8'd0;
- else if (reset_timer <= 8'haf)
- reset_timer <= reset_timer + 1'b1;
- else
- reset_timer <= reset_timer;
- end
-
- always @(posedge clk or posedge reset) begin
- if (reset)begin
- reset_sync_d0 <= 1'b1;
- reset_sync_d1 <= 1'b1;
- reset_sync <= 1'b1;
- end
- else begin
- reset_sync_d0 <= reset_timer <= 8'haf;
- reset_sync_d1 <= reset_sync_d0;
- reset_sync <= reset_sync_d1;
- end
- end
-
-
- always @(posedge clk) begin
- vio_wr_d0 <= vio_wr;
- vio_wr_d1 <= vio_wr_d0;
- vio_wr_d2 <= vio_wr_d1;
- end
-
-
- always @(posedge clk) begin
- if (reset_sync)
- cnt <= 8'd0;
- else if (cnt == CNT_MAX && m_axis_tvalid && m_axis_tready)
- cnt <= 8'd0;
- else if (m_axis_tvalid && m_axis_tready)
- cnt <= cnt + 1;
- end
-
- always @(posedge clk) begin
- if (reset_sync)
- m_axis_tvalid <= 1'b0;
- else if (vio_wr_d1 && ~vio_wr_d2)
- m_axis_tvalid <= 1'b1;
- else if (cnt == CNT_MAX && m_axis_tvalid && m_axis_tready)
- m_axis_tvalid <= 1'b0;
- end
-
- always @(posedge clk) begin
- if (reset_sync)
- m_axis_tlast <= 1'b0;
- else if (cnt == CNT_MAX - 1 && m_axis_tvalid && m_axis_tready)
- m_axis_tlast <= 1'b1;
- else if (cnt == CNT_MAX && m_axis_tvalid && m_axis_tready)
- m_axis_tlast <= 1'b0;
- end
-
- always @(posedge clk) begin
- if (reset_sync)
- m_axis_tdata <= 0;
- else if (m_axis_tvalid && m_axis_tready)
- m_axis_tdata <= m_axis_tdata + 1;
- else
- m_axis_tdata <= m_axis_tdata;
- end
- vio_0 vio_0 (
- .clk(clk), // input wire clk
- .probe_out0(vio_wr) // output wire [0 : 0] probe_out0
- );
- endmodule
讲ZCU102板作为发射端,VC707板作为接收端,光口10G模块测试收发。
ZCU102发送从0开始的递增数
VC707接受到0开始的递增数,验证成功。
后续将用PCIE与Aurora进行数据交互
需要改进的地方:
对于TX端,可连接一个异步FIFO,这样解决了数据源的数据到aurora IP核tx_data的跨时钟域问题。tx_fifo的输入和rx_fifo的输出,tx_fifo的写时钟和rx_fifo的读时钟速率小于user_clk(156.25Mhz),所以对于可以向tx_fifo一直写入数据,rx_fifo中也一直由数据读出.
与aurora 64B66B 发送端 AXI4-Stream接口 相连的FIFO设置_aurora fifo-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。