当前位置:   article > 正文

Xilinx关于Aurora IP核仿真和使用_xilinx aurora

xilinx aurora

平台:vivado2017.4

芯片:xc7k325tfbg676-2 (active)

关于Aurora的开发学习。使用xilinx官方提供的IP核。

官方资料,pg046-aurora-8b10b.pdf和pg074-aurora-64b66b-en-us-12.0.pdf。

IP核的生成步骤

首先在IP Catalog中搜索Aurora IP核关于此IP有两种不同的IP,分别对应两种不同的编码方式和两份文档(PG046和PG074)。

这里先选择Aurora 8B/10B。

Component name

IP默认的名字

Lane width

选择在IP中使用的收发器字节宽度,以及TX和RX位宽。

Lane rate

范围0.5-6.6Gb/s。(64B/66B模式下支持10.3.125)。核心的总数据速率为(0.8*lane rate)

GT Refclk(MHZ)

参考时钟频率,取决于所选择的lane rate。

INIT clk(MHZ)

输入一个有效的INIT时钟速率。

DRP clk(MHZ)

输入一个有效的DRP时钟频率。(INIT clk和DRP clk相同)

Dataflow Mode

通信模式。仅TX和仅RX已经全双工。

Interface

接口模式,可以选择Framing和Streaming两种模式。

Flow Control

流控。

UFC允许用户应用程序发送一个简短的、高优先级的消息。

NFC允许全双工接收器调节发送给他们的数据速率。

Immediate允许在数据帧中插入空闲代码。

Completion 只在完整的数据帧之间插入空闲代码。

Back Channel

默认。

Use Scrambler/Descrambler

使用加扰器和解扰器,为了确保在长时间内不出现重复的数据。默认不使用。

Little Endian Support

小端模式,数据传输时先传输高位为大端模式,先传输低位为小端模式。

Vivado Lab Tools

此选项将为example project创建ila在线逻辑分析仪。

Use CRC

用以检测一个数据包是否在传输中发生错误。

第二页设置

GT选择

在学习GTX的时候知道,一个Quad里面有四组GTXE2_CHANNEL,一个QPLL和一对差分输入。每个GTXE2_CHANNEL包含一组TX和RX,以及一个CPLL。

这里lane可以选择为1到16个。默认选择一个。

第三页

共享逻辑选择

默认将共享逻辑放入example design

IP核的接口和含义

下面我们看一下IP核的整体接口。分别介绍IP的各个接口的意义。

用户测端口介绍。

名字

方向

时钟域

描述

USER_DATA_S_AXI_TX

s_axi_tx_tdata

输入

user_clk

正在输出的数据

s_axi_tx_tready

输出

user_clk

核已经准备好发送数据

s_axi_tx_tlast

输入

user_clk

当前发送的最后一个数据

s_axi_tx_tkeep

输入

user_clk

指定最后一个数据中的有效字节。

s_axi_tx_tvalid

输入

user_clk

用户发送数据有效。

USER_DATA_S_AXI_TX

m_axi_rx_tdata

输出

user_clk

接收的数据

m_axi_rx_tlast

输出

user_clk

最后一个数据

m_axi_rx_tkeep

输出

user_clk

最后一个数据中的有效字节。

m_axi_rx_tvalid

输出

user_clk

接收的数据有效

状态和控制端口

名字

方向

时钟域

描述

Channel up

输出

user_clk

当Aurora 8B/10B通道初始化完成且该通道已准备好进行数据传输时有效。

lane_up

输出

user_clk

在成功初始化时为每个lane断言,每个位代表一个lane。

frame_err

输出

user_clk

检测到信道帧/协议错误

hard_err

输出

user_clk

检测到硬错误(在Aurora 8B/10B核心复位之前确认)

soft_err

输出

user_clk

在传入的串行流中检测到软错误

reset

输入

async

重置Aurora 8B/10B核心(活动-高)。该信号必须断言至少6个user_clk周期。

gt_reset

输入

async

收发器的复位信号通过解冻器连接到顶层。在硬件中首次启动模块时,应断言gt_reset端口。这将系统地重置收发器的所有物理编码子层(PCS)和物理介质附件(PMA)子组件。信号使用init_clk_in,必须断言6个init_clk_in周期。

link_reset_out

输出

init_clk

热插拔计数过期驱动高

init_clk_in

输入

NA

init_clk_in端口是必需的,因为user_clk会在断言gt_reset时停止。建议为init_clk_in选择的频率应低于GT参考时钟输入频率。

时钟接口

名字

方向

描述

pll_not_locked

输入

如果使用PLL作为Aurora核心生成时钟,则pll_not_locked信号应该连接到PLL锁定信号的倒数。如果PLL不用于Aurora8B/10B核心生成时钟信号。则将pll_not_locked接地。

user_clk

输入

核和用户应用程序共享的并行时钟。

sync_clk

输入

由收发器内部同步逻辑所使用的并行时钟。

用户侧数据接口时序。

Framing Interface

Streaming Interface

接口的数据传输都是在AXI总线下完成的,

Framing模式下:发送tvalid和tready同时有效时数据有效,同时需要tlast指示当前最后一个数据。接收时tvalid有效时数据有效,tlast指示最后一个数据。

Streaming模式下:发送tvalid和tready同时有效时数据有效。接收时tvalid有效时数据有效。感兴趣可以去看一下AXI总线协议。在来理解这个就很简单了。

(161条消息) AXI总线,AXI_BRAM读写仿真测试_爱漂流的易子的博客-CSDN博客

Aurora 8B/10B模式下的工程仿真

现在打开example project

打开设计示例,可以看到该示例

示例的工程结构和GTX的例子工程结构一致的。

模块

作用

aurora_8b10b_0_support

例化Aurora,例化时钟,复位,原语等。

aurora_8b10b_0_CLOCK_MODULE

产生user_clk和sync_clk等时钟

aurora_8b10b_0_SUPPORT_RESET_LOGIC

产生系统复位和GT复位

aurora_8b10b_0_gt_common_wrapper

例化GTX原语

aurora_8b10b_0_LL_TO_AXI_EXDES

将FRAME_GEN产生的数据信号转化为AXI信号。

aurora_8b10b_0_FRAME_GEN

重要模块,TX数据产生模块。

aurora_8b10b_0_AXI_TO_LL_EXDES

将核接收到的数据转换为RX数据

aurora_8b10b_0_FRAME_CHECK

检查接收到的数据,是否正常。

为了方便测试,我们先看一下xilinx提供的TB的结构。

模块之间RX和TX互连。

下面分析一下aurora_8b10b_0_FRAME_GEN模块。让数据动起来。从模块的代码中可以看到,FRAMEE_GEN模块发送提供的代码为生成Generate random data using XNOR feedback LFSR。

  1. //______________________________ Transmit Data __________________________________
  2. //Generate random data using XNOR feedback LFSR
  3. always @(posedge USER_CLK)
  4. if(reset_c)
  5. begin
  6. data_lfsr_r <= `DLY 16'hABCD; //random seed value
  7. end
  8. else if(!TX_DST_RDY_N && !idle_r)
  9. begin
  10. 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]};
  11. end

产生随机数。在这之前需要了解一下LocalLink和AXI4-Stream总线之间的转换,xilinx提供的example模板是使用的LocalLink总线数据收发,后来改成了AXI4-Stream,我们需要先了解一下各个信号的对应关系。当然也可以不使用xilinx提供的example project工程思路,直接使用AXI总线向Aurora IP核内发数据,结果也是一致的。

先看一下两者的转换代码。

  1. ///
  2. // (c) Copyright 2010 Xilinx, Inc. All rights reserved.
  3. //
  4. // This file contains confidential and proprietary information
  5. // of Xilinx, Inc. and is protected under U.S. and
  6. // international copyright and other intellectual property
  7. // laws.
  8. //
  9. // DISCLAIMER
  10. // This disclaimer is not a license and does not grant any
  11. // rights to the materials distributed herewith. Except as
  12. // otherwise provided in a valid license issued to you by
  13. // Xilinx, and to the maximum extent permitted by applicable
  14. // law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
  15. // WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
  16. // AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
  17. // BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
  18. // INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
  19. // (2) Xilinx shall not be liable (whether in contract or tort,
  20. // including negligence, or under any other theory of
  21. // liability) for any loss or damage of any kind or nature
  22. // related to, arising under or in connection with these
  23. // materials, including for any direct, or any indirect,
  24. // special, incidental, or consequential loss or damage
  25. // (including loss of data, profits, goodwill, or any type of
  26. // loss or damage suffered as a result of any action brought
  27. // by a third party) even if such damage or loss was
  28. // reasonably foreseeable or Xilinx had been advised of the
  29. // possibility of the same.
  30. //
  31. // CRITICAL APPLICATIONS
  32. // Xilinx products are not designed or intended to be fail-
  33. // safe, or for use in any application requiring fail-safe
  34. // performance, such as life-support or safety devices or
  35. // systems, Class III medical devices, nuclear facilities,
  36. // applications related to the deployment of airbags, or any
  37. // other applications that could lead to death, personal
  38. // injury, or severe property or environmental damage
  39. // (individually and collectively, "Critical
  40. // Applications"). Customer assumes the sole risk and
  41. // liability of any use of Xilinx products in Critical
  42. // Applications, subject only to applicable laws and
  43. // regulations governing limitations on product liability.
  44. //
  45. // THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
  46. // PART OF THIS FILE AT ALL TIMES.
  47. //
  48. //
  49. ///
  50. //
  51. // LL_TO_AXI
  52. //
  53. //
  54. // Description: This light wrapper/shim convertes Legacy LocalLink interface
  55. // signals to AXI-4 Stream protocol signals
  56. //
  57. //
  58. ///
  59. `timescale 1 ns/1 ps
  60. (* 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}" *)
  61. module aurora_8b10b_0_LL_TO_AXI_EXDES #
  62. (
  63. parameter DATA_WIDTH = 16, // DATA bus width
  64. parameter STRB_WIDTH = 2, // STROBE bus width
  65. parameter USE_UFC_REM = 0, // UFC REM bus width identifier
  66. parameter USE_4_NFC = 0, // 0 => PDU, 1 => NFC, 2 => UFC
  67. parameter BC = DATA_WIDTH/8, //Byte count
  68. parameter REM_WIDTH = 1 // REM bus width
  69. )
  70. (
  71. // LocalLink input Interface
  72. LL_IP_DATA,
  73. LL_IP_SOF_N,
  74. LL_IP_EOF_N,
  75. LL_IP_REM,
  76. LL_IP_SRC_RDY_N,
  77. LL_OP_DST_RDY_N,
  78. // AXI4-S output signals
  79. AXI4_S_OP_TVALID,
  80. AXI4_S_OP_TDATA,
  81. AXI4_S_OP_TKEEP,
  82. AXI4_S_OP_TLAST,
  83. AXI4_S_IP_TREADY
  84. );
  85. `define DLY #1
  86. //***********************************Port Declarations*******************************
  87. // AXI4-Stream TX Interface
  88. output [(DATA_WIDTH-1):0] AXI4_S_OP_TDATA;
  89. output [(STRB_WIDTH-1):0] AXI4_S_OP_TKEEP;
  90. output AXI4_S_OP_TVALID;
  91. output AXI4_S_OP_TLAST;
  92. input AXI4_S_IP_TREADY;
  93. // LocalLink TX Interface
  94. input [0:(DATA_WIDTH-1)] LL_IP_DATA;
  95. input [0:(REM_WIDTH-1)] LL_IP_REM;
  96. input LL_IP_SOF_N;
  97. input LL_IP_EOF_N;
  98. input LL_IP_SRC_RDY_N;
  99. output LL_OP_DST_RDY_N;
  100. wire [0:(STRB_WIDTH-1)] AXI4_S_OP_TKEEP_i;
  101. //*********************************Main Body of Code**********************************
  102. generate
  103. if(USE_4_NFC==0)
  104. begin
  105. genvar i;
  106. for (i=0; i<BC; i=i+1) begin: pdu
  107. 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];
  108. end
  109. end
  110. endgenerate
  111. generate
  112. genvar j;
  113. for (j=0; j<STRB_WIDTH; j=j+1) begin: strb
  114. assign AXI4_S_OP_TKEEP[j] = AXI4_S_OP_TKEEP_i[j];
  115. end
  116. endgenerate
  117. assign AXI4_S_OP_TVALID = !LL_IP_SRC_RDY_N;
  118. assign AXI4_S_OP_TLAST = !LL_IP_EOF_N;
  119. assign AXI4_S_OP_TKEEP_i = (LL_IP_REM == 1'b1)? 2'b11:2'b10;
  120. assign LL_OP_DST_RDY_N = !AXI4_S_IP_TREADY;
  121. endmodule

可以看到:

AXI_DATA等于LL_DATA交换数据位值。

AXI_VALID等于LL_SRC_RDY的非。

AXI_LAST等于LL_EOF的非。

AXI_KEEP与LL_REM参数有关。

LL_DST_RDY等于AXI_READY有关。

从仿真图中也可以看出来。

所以我们在FRAMEE_GEN模块中修改数据发送代码如下。

  1. //______________________________ Transmit Data __________________________________
  2. //Generate random data using XNOR feedback LFSR
  3. always @(posedge USER_CLK)
  4. if(reset_c)
  5. begin
  6. data_lfsr_r <= `DLY 16'hABCD; //random seed value
  7. end
  8. else if(!TX_DST_RDY_N && !idle_r)
  9. begin
  10. if(data_lfsr_r == 16'hABCD)
  11. data_lfsr_r <= `DLY 16'h0000;
  12. else
  13. data_lfsr_r <= `DLY data_lfsr_r + 16'h1;
  14. end
  15. //Connect TX_D to the DATA LFSR
  16. assign TX_D = {1{data_lfsr_r}};
  17. //Tie DATA LFSR to REM to generate random words
  18. // assign TX_REM = data_lfsr_r[0:0];
  19. assign TX_REM = 1'b1;

发送从0递增的有效数据。这里也可以设置为从FIFO中读出数据(好应用)。我们这里直接将发送的第一个数据设置为0,在后续的情况下,数据值累加。并设置TX_REM为一,保证最后一个传输的数据位全部有效。

同时在接收模块,设置接收的验证数据也是从0递增的。判断是否出现错误数据。

  1. //generate expected RX_D using LFSR
  2. always @(posedge USER_CLK)
  3. if(reset_c)
  4. begin
  5. // data_lfsr_r <= `DLY 16'hD5E6; //random seed value
  6. data_lfsr_r <= `DLY 16'h0000; //random seed value
  7. end
  8. else if(CHANNEL_UP)
  9. begin
  10. if(data_valid_c)
  11. // 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]};
  12. begin
  13. if(data_lfsr_r == 16'hABCD)
  14. data_lfsr_r <= `DLY 16'h0000;
  15. else
  16. data_lfsr_r <= `DLY data_lfsr_r + 16'h1;
  17. end
  18. end
  19. else
  20. begin
  21. // data_lfsr_r <= `DLY 16'hD5E6; //random seed value
  22. data_lfsr_r <= `DLY 16'h0000; //random seed value
  23. end
  24. assign data_lfsr_concat_w = {1{data_lfsr_r}};

发送模块的仿真。可以看到发送的数据为0,1,2,3,4。

接收模块的仿真。可以看到接收的数据为0,1,2,3,4。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/482162
推荐阅读
相关标签
  

闽ICP备14008679号