平臺(tái):vivado2017.4
芯片:xc7k325tfbg676-2 (active)
關(guān)于Aurora的開發(fā)學(xué)習(xí)。使用xilinx官方提供的IP核。
官方資料,pg046-aurora-8b10b.pdf和pg074-aurora-64b66b-en-us-12.0.pdf。
IP核的生成步驟
首先在IP Catalog中搜索Aurora IP核關(guān)于此IP有兩種不同的IP,分別對(duì)應(yīng)兩種不同的編碼方式和兩份文檔(PG046和PG074)。

這里先選擇Aurora 8B/10B。

Component name |
IP默認(rèn)的名字 |
Lane width |
選擇在IP中使用的收發(fā)器字節(jié)寬度,以及TX和RX位寬。 |
Lane rate |
范圍0.5-6.6Gb/s。(64B/66B模式下支持10.3.125)。核心的總數(shù)據(jù)速率為(0.8*lane rate) |
GT Refclk(MHZ) |
參考時(shí)鐘頻率,取決于所選擇的lane rate。 |
INIT clk(MHZ) |
輸入一個(gè)有效的INIT時(shí)鐘速率。 |
DRP clk(MHZ) |
輸入一個(gè)有效的DRP時(shí)鐘頻率。(INIT clk和DRP clk相同) |
Dataflow Mode |
通信模式。僅TX和僅RX已經(jīng)全雙工。 |
Interface |
接口模式,可以選擇Framing和Streaming兩種模式。 |
Flow Control |
流控。 UFC允許用戶應(yīng)用程序發(fā)送一個(gè)簡(jiǎn)短的、高優(yōu)先級(jí)的消息。 NFC允許全雙工接收器調(diào)節(jié)發(fā)送給他們的數(shù)據(jù)速率。 Immediate允許在數(shù)據(jù)幀中插入空閑代碼。 Completion 只在完整的數(shù)據(jù)幀之間插入空閑代碼。 |
Back Channel |
默認(rèn)。 |
Use Scrambler/Descrambler |
使用加擾器和解擾器,為了確保在長時(shí)間內(nèi)不出現(xiàn)重復(fù)的數(shù)據(jù)。默認(rèn)不使用。 |
Little Endian Support |
小端模式,數(shù)據(jù)傳輸時(shí)先傳輸高位為大端模式,先傳輸?shù)臀粸樾《四J健?/span> |
Vivado Lab Tools |
此選項(xiàng)將為example project創(chuàng)建ila在線邏輯分析儀。 |
Use CRC |
用以檢測(cè)一個(gè)數(shù)據(jù)包是否在傳輸中發(fā)生錯(cuò)誤。 |
第二頁設(shè)置

GT選擇
在學(xué)習(xí)GTX的時(shí)候知道,一個(gè)Quad里面有四組GTXE2_CHANNEL,一個(gè)QPLL和一對(duì)差分輸入。每個(gè)GTXE2_CHANNEL包含一組TX和RX,以及一個(gè)CPLL。
這里lane可以選擇為1到16個(gè)。默認(rèn)選擇一個(gè)。
第三頁
共享邏輯選擇

默認(rèn)將共享邏輯放入example design
IP核的接口和含義
下面我們看一下IP核的整體接口。分別介紹IP的各個(gè)接口的意義。

用戶測(cè)端口介紹。
名字 |
方向 |
時(shí)鐘域 |
描述 |
USER_DATA_S_AXI_TX | |||
s_axi_tx_tdata |
輸入 |
user_clk |
正在輸出的數(shù)據(jù) |
s_axi_tx_tready |
輸出 |
user_clk |
核已經(jīng)準(zhǔn)備好發(fā)送數(shù)據(jù) |
s_axi_tx_tlast |
輸入 |
user_clk |
當(dāng)前發(fā)送的最后一個(gè)數(shù)據(jù) |
s_axi_tx_tkeep |
輸入 |
user_clk |
指定最后一個(gè)數(shù)據(jù)中的有效字節(jié)。 |
s_axi_tx_tvalid |
輸入 |
user_clk |
用戶發(fā)送數(shù)據(jù)有效。 |
USER_DATA_S_AXI_TX | |||
m_axi_rx_tdata |
輸出 |
user_clk |
接收的數(shù)據(jù) |
m_axi_rx_tlast |
輸出 |
user_clk |
最后一個(gè)數(shù)據(jù) |
m_axi_rx_tkeep |
輸出 |
user_clk |
最后一個(gè)數(shù)據(jù)中的有效字節(jié)。 |
m_axi_rx_tvalid |
輸出 |
user_clk |
接收的數(shù)據(jù)有效 |
狀態(tài)和控制端口
名字 |
方向 |
時(shí)鐘域 |
描述 |
Channel up |
輸出 |
user_clk |
當(dāng)Aurora 8B/10B通道初始化完成且該通道已準(zhǔn)備好進(jìn)行數(shù)據(jù)傳輸時(shí)有效。 |
lane_up |
輸出 |
user_clk |
在成功初始化時(shí)為每個(gè)lane斷言,每個(gè)位代表一個(gè)lane。 |
frame_err |
輸出 |
user_clk |
檢測(cè)到信道幀/協(xié)議錯(cuò)誤 |
hard_err |
輸出 |
user_clk |
檢測(cè)到硬錯(cuò)誤(在Aurora 8B/10B核心復(fù)位之前確認(rèn)) |
soft_err |
輸出 |
user_clk |
在傳入的串行流中檢測(cè)到軟錯(cuò)誤 |
reset |
輸入 |
async |
重置Aurora 8B/10B核心(活動(dòng)-高)。該信號(hào)必須斷言至少6個(gè)user_clk周期。 |
gt_reset |
輸入 |
async |
收發(fā)器的復(fù)位信號(hào)通過解凍器連接到頂層。在硬件中首次啟動(dòng)模塊時(shí),應(yīng)斷言gt_reset端口。這將系統(tǒng)地重置收發(fā)器的所有物理編碼子層(PCS)和物理介質(zhì)附件(PMA)子組件。信號(hào)使用init_clk_in,必須斷言6個(gè)init_clk_in周期。 |
link_reset_out |
輸出 |
init_clk |
熱插拔計(jì)數(shù)過期驅(qū)動(dòng)高 |
init_clk_in |
輸入 |
NA |
init_clk_in端口是必需的,因?yàn)閡ser_clk會(huì)在斷言gt_reset時(shí)停止。建議為init_clk_in選擇的頻率應(yīng)低于GT參考時(shí)鐘輸入頻率。 |
時(shí)鐘接口
名字 |
方向 |
描述 |
pll_not_locked |
輸入 |
如果使用PLL作為Aurora核心生成時(shí)鐘,則pll_not_locked信號(hào)應(yīng)該連接到PLL鎖定信號(hào)的倒數(shù)。如果PLL不用于Aurora8B/10B核心生成時(shí)鐘信號(hào)。則將pll_not_locked接地。 |
user_clk |
輸入 |
核和用戶應(yīng)用程序共享的并行時(shí)鐘。 |
sync_clk |
輸入 |
由收發(fā)器內(nèi)部同步邏輯所使用的并行時(shí)鐘。 |
用戶側(cè)數(shù)據(jù)接口時(shí)序。
Framing Interface

Streaming Interface

接口的數(shù)據(jù)傳輸都是在AXI總線下完成的,
Framing模式下:發(fā)送tvalid和tready同時(shí)有效時(shí)數(shù)據(jù)有效,同時(shí)需要tlast指示當(dāng)前最后一個(gè)數(shù)據(jù)。接收時(shí)tvalid有效時(shí)數(shù)據(jù)有效,tlast指示最后一個(gè)數(shù)據(jù)。
Streaming模式下:發(fā)送tvalid和tready同時(shí)有效時(shí)數(shù)據(jù)有效。接收時(shí)tvalid有效時(shí)數(shù)據(jù)有效。感興趣可以去看一下AXI總線協(xié)議。在來理解這個(gè)就很簡(jiǎn)單了。
(161條消息) AXI總線,AXI_BRAM讀寫仿真測(cè)試_愛漂流的易子的博客-CSDN博客
Aurora 8B/10B模式下的工程仿真
現(xiàn)在打開example project

打開設(shè)計(jì)示例,可以看到該示例
示例的工程結(jié)構(gòu)和GTX的例子工程結(jié)構(gòu)一致的。
模塊 |
作用 |
aurora_8b10b_0_support |
例化Aurora,例化時(shí)鐘,復(fù)位,原語等。 |
aurora_8b10b_0_CLOCK_MODULE |
產(chǎn)生user_clk和sync_clk等時(shí)鐘 |
aurora_8b10b_0_SUPPORT_RESET_LOGIC |
產(chǎn)生系統(tǒng)復(fù)位和GT復(fù)位 |
aurora_8b10b_0_gt_common_wrapper |
例化GTX原語 |
aurora_8b10b_0_LL_TO_AXI_EXDES |
將FRAME_GEN產(chǎn)生的數(shù)據(jù)信號(hào)轉(zhuǎn)化為AXI信號(hào)。 |
aurora_8b10b_0_FRAME_GEN |
重要模塊,TX數(shù)據(jù)產(chǎn)生模塊。 |
aurora_8b10b_0_AXI_TO_LL_EXDES |
將核接收到的數(shù)據(jù)轉(zhuǎn)換為RX數(shù)據(jù) |
aurora_8b10b_0_FRAME_CHECK |
檢查接收到的數(shù)據(jù),是否正常。 |
為了方便測(cè)試,我們先看一下xilinx提供的TB的結(jié)構(gòu)。

模塊之間RX和TX互連。
下面分析一下aurora_8b10b_0_FRAME_GEN模塊。讓數(shù)據(jù)動(dòng)起來。從模塊的代碼中可以看到,F(xiàn)RAMEE_GEN模塊發(fā)送提供的代碼為生成Generate random data using XNOR feedback LFSR。
//______________________________ Transmit Data __________________________________
//Generate random data using XNOR feedback LFSR
always @(posedge USER_CLK)
if(reset_c)
begin
data_lfsr_r <= `DLY 16'hABCD; //random seed value
end
else if(!TX_DST_RDY_N && !idle_r)
begin
data_lfsr_r <= `DLY {!{data_lfsr_r[3]^data_lfsr_r[12]^data_lfsr_r[14]^data_lfsr_r[15]},data_lfsr_r[0:14]};
end
產(chǎn)生隨機(jī)數(shù)。在這之前需要了解一下LocalLink和AXI4-Stream總線之間的轉(zhuǎn)換,xilinx提供的example模板是使用的LocalLink總線數(shù)據(jù)收發(fā),后來改成了AXI4-Stream,我們需要先了解一下各個(gè)信號(hào)的對(duì)應(yīng)關(guān)系。當(dāng)然也可以不使用xilinx提供的example project工程思路,直接使用AXI總線向Aurora IP核內(nèi)發(fā)數(shù)據(jù),結(jié)果也是一致的。
先看一下兩者的轉(zhuǎn)換代碼。
///
// (c) Copyright 2010 Xilinx, Inc. All rights reserved.
//
// This file contains confidential and proprietary information
// of Xilinx, Inc. and is protected under U.S. and
// international copyright and other intellectual property
// laws.
//
// DISCLAIMER
// This disclaimer is not a license and does not grant any
// rights to the materials distributed herewith. Except as
// otherwise provided in a valid license issued to you by
// Xilinx, and to the maximum extent permitted by applicable
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
// (2) Xilinx shall not be liable (whether in contract or tort,
// including negligence, or under any other theory of
// liability) for any loss or damage of any kind or nature
// related to, arising under or in connection with these
// materials, including for any direct, or any indirect,
// special, incidental, or consequential loss or damage
// (including loss of data, profits, goodwill, or any type of
// loss or damage suffered as a result of any action brought
// by a third party) even if such damage or loss was
// reasonably foreseeable or Xilinx had been advised of the
// possibility of the same.
//
// CRITICAL APPLICATIONS
// Xilinx products are not designed or intended to be fail-
// safe, or for use in any application requiring fail-safe
// performance, such as life-support or safety devices or
// systems, Class III medical devices, nuclear facilities,
// applications related to the deployment of airbags, or any
// other applications that could lead to death, personal
// injury, or severe property or environmental damage
// (individually and collectively, "Critical
// Applications"). Customer assumes the sole risk and
// liability of any use of Xilinx products in Critical
// Applications, subject only to applicable laws and
// regulations governing limitations on product liability.
//
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
// PART OF THIS FILE AT ALL TIMES.
//
//
///
//
// LL_TO_AXI
//
//
// Description: This light wrapper/shim convertes Legacy LocalLink interface
// signals to AXI-4 Stream protocol signals
//
//
///
`timescale 1 ns/1 ps
(* core_generation_info = "aurora_8b10b_0,aurora_8b10b_v11_1_3,{user_interface=AXI_4_Streaming,backchannel_mode=Sidebands,c_aurora_lanes=1,c_column_used=left,c_gt_clock_1=GTXQ0,c_gt_clock_2=None,c_gt_loc_1=1,c_gt_loc_10=X,c_gt_loc_11=X,c_gt_loc_12=X,c_gt_loc_13=X,c_gt_loc_14=X,c_gt_loc_15=X,c_gt_loc_16=X,c_gt_loc_17=X,c_gt_loc_18=X,c_gt_loc_19=X,c_gt_loc_2=X,c_gt_loc_20=X,c_gt_loc_21=X,c_gt_loc_22=X,c_gt_loc_23=X,c_gt_loc_24=X,c_gt_loc_25=X,c_gt_loc_26=X,c_gt_loc_27=X,c_gt_loc_28=X,c_gt_loc_29=X,c_gt_loc_3=X,c_gt_loc_30=X,c_gt_loc_31=X,c_gt_loc_32=X,c_gt_loc_33=X,c_gt_loc_34=X,c_gt_loc_35=X,c_gt_loc_36=X,c_gt_loc_37=X,c_gt_loc_38=X,c_gt_loc_39=X,c_gt_loc_4=X,c_gt_loc_40=X,c_gt_loc_41=X,c_gt_loc_42=X,c_gt_loc_43=X,c_gt_loc_44=X,c_gt_loc_45=X,c_gt_loc_46=X,c_gt_loc_47=X,c_gt_loc_48=X,c_gt_loc_5=X,c_gt_loc_6=X,c_gt_loc_7=X,c_gt_loc_8=X,c_gt_loc_9=X,c_lane_width=2,c_line_rate=31250,c_nfc=false,c_nfc_mode=IMM,c_refclk_frequency=125000,c_simplex=false,c_simplex_mode=TX,c_stream=false,c_ufc=false,flow_mode=None,interface_mode=Framing,dataflow_config=Duplex}" *)
module aurora_8b10b_0_LL_TO_AXI_EXDES #
(
parameter DATA_WIDTH = 16, // DATA bus width
parameter STRB_WIDTH = 2, // STROBE bus width
parameter USE_UFC_REM = 0, // UFC REM bus width identifier
parameter USE_4_NFC = 0, // 0 => PDU, 1 => NFC, 2 => UFC
parameter BC = DATA_WIDTH/8, //Byte count
parameter REM_WIDTH = 1 // REM bus width
)
(
// LocalLink input Interface
LL_IP_DATA,
LL_IP_SOF_N,
LL_IP_EOF_N,
LL_IP_REM,
LL_IP_SRC_RDY_N,
LL_OP_DST_RDY_N,
// AXI4-S output signals
AXI4_S_OP_TVALID,
AXI4_S_OP_TDATA,
AXI4_S_OP_TKEEP,
AXI4_S_OP_TLAST,
AXI4_S_IP_TREADY
);
`define DLY #1
//***********************************Port Declarations*******************************
// AXI4-Stream TX Interface
output [(DATA_WIDTH-1):0] AXI4_S_OP_TDATA;
output [(STRB_WIDTH-1):0] AXI4_S_OP_TKEEP;
output AXI4_S_OP_TVALID;
output AXI4_S_OP_TLAST;
input AXI4_S_IP_TREADY;
// LocalLink TX Interface
input [0:(DATA_WIDTH-1)] LL_IP_DATA;
input [0:(REM_WIDTH-1)] LL_IP_REM;
input LL_IP_SOF_N;
input LL_IP_EOF_N;
input LL_IP_SRC_RDY_N;
output LL_OP_DST_RDY_N;
wire [0:(STRB_WIDTH-1)] AXI4_S_OP_TKEEP_i;
//*********************************Main Body of Code**********************************
generate
if(USE_4_NFC==0)
begin
genvar i;
for (i=0; i<BC; i=i+1) begin: pdu
assign AXI4_S_OP_TDATA[((BC-1-i)*8)+7:((BC-1-i)*8)] = LL_IP_DATA[((BC-1-i)*8):((BC-1-i)*8)+7];
end
end
endgenerate
generate
genvar j;
for (j=0; j<STRB_WIDTH; j=j+1) begin: strb
assign AXI4_S_OP_TKEEP[j] = AXI4_S_OP_TKEEP_i[j];
end
endgenerate
assign AXI4_S_OP_TVALID = !LL_IP_SRC_RDY_N;
assign AXI4_S_OP_TLAST = !LL_IP_EOF_N;
assign AXI4_S_OP_TKEEP_i = (LL_IP_REM == 1'b1)? 2'b11:2'b10;
assign LL_OP_DST_RDY_N = !AXI4_S_IP_TREADY;
endmodule
可以看到:
AXI_DATA等于LL_DATA交換數(shù)據(jù)位值。
AXI_VALID等于LL_SRC_RDY的非。
AXI_LAST等于LL_EOF的非。
AXI_KEEP與LL_REM參數(shù)有關(guān)。
LL_DST_RDY等于AXI_READY有關(guān)。
從仿真圖中也可以看出來。

所以我們?cè)贔RAMEE_GEN模塊中修改數(shù)據(jù)發(fā)送代碼如下。
//______________________________ Transmit Data __________________________________
//Generate random data using XNOR feedback LFSR
always @(posedge USER_CLK)
if(reset_c)
begin
data_lfsr_r <= `DLY 16'hABCD; //random seed value
end
else if(!TX_DST_RDY_N && !idle_r)
begin
if(data_lfsr_r == 16'hABCD)
data_lfsr_r <= `DLY 16'h0000;
else
data_lfsr_r <= `DLY data_lfsr_r + 16'h1;
end
//Connect TX_D to the DATA LFSR
assign TX_D = {1{data_lfsr_r}};
//Tie DATA LFSR to REM to generate random words
// assign TX_REM = data_lfsr_r[0:0];
assign TX_REM = 1'b1;
發(fā)送從0遞增的有效數(shù)據(jù)。這里也可以設(shè)置為從FIFO中讀出數(shù)據(jù)(好應(yīng)用)。我們這里直接將發(fā)送的第一個(gè)數(shù)據(jù)設(shè)置為0,在后續(xù)的情況下,數(shù)據(jù)值累加。并設(shè)置TX_REM為一,保證最后一個(gè)傳輸?shù)臄?shù)據(jù)位全部有效。
同時(shí)在接收模塊,設(shè)置接收的驗(yàn)證數(shù)據(jù)也是從0遞增的。判斷是否出現(xiàn)錯(cuò)誤數(shù)據(jù)。
//generate expected RX_D using LFSR
always @(posedge USER_CLK)
if(reset_c)
begin
// data_lfsr_r <= `DLY 16'hD5E6; //random seed value
data_lfsr_r <= `DLY 16'h0000; //random seed value
end
else if(CHANNEL_UP)
begin
if(data_valid_c)
// data_lfsr_r <= `DLY {!{data_lfsr_r[3]^data_lfsr_r[12]^data_lfsr_r[14]^data_lfsr_r[15]},data_lfsr_r[0:14]};
begin
if(data_lfsr_r == 16'hABCD)
data_lfsr_r <= `DLY 16'h0000;
else
data_lfsr_r <= `DLY data_lfsr_r + 16'h1;
end
end
else
begin
// data_lfsr_r <= `DLY 16'hD5E6; //random seed value
data_lfsr_r <= `DLY 16'h0000; //random seed value
end
assign data_lfsr_concat_w = {1{data_lfsr_r}};
發(fā)送模塊的仿真??梢钥吹桨l(fā)送的數(shù)據(jù)為0,1,2,3,4。文章來源:http://www.zghlxwxcb.cn/news/detail-781660.html

接收模塊的仿真??梢钥吹浇邮盏臄?shù)據(jù)為0,1,2,3,4。文章來源地址http://www.zghlxwxcb.cn/news/detail-781660.html

到了這里,關(guān)于Xilinx關(guān)于Aurora IP核仿真和使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!