常州 / Kintex-7修炼秘籍2018版GTX通信
Step7:本步骤会提示选择路径,读者可以自己定义自己的路径
Step8:一切生成完成后的文件
1.5 代码分析
1.5.1 代码功能概述
1)Aurora_8b10b_exdes.v 此代码是顶层文件调用了各个子模块。 2)Aurora_8b10b.xci此代码就是我们刚才创建的IPCORE.
篇
第 49 页 共 75 页
常州 / Kintex-7修炼秘籍2018版GTX通信篇
3)Aurora_8b10b_ll_to_axi_exdes.v实现了旧代码(虽然现在AXI总线大行其道,但是我们会发现很多DEMO中是旧代码转AXI协议,估计XILINX公司为了省事,毕竟写好的模块没必要重新写一次)到AXI4总线接口的转换。 4)Aurora_8b10b_frame_gen.v产生测试数据并且通过TX接口发送出去 5)Aurora_8b10b_axi_to_ll_exdes.v把AXI接口转换成旧接口
6)Aurora_8b10b_frame_check.v是接收端口,接收到数据并且进行检测 7) vio_7seriers.xci 是虚拟IO 一种调试用的IP可以实时修改一些变量的参数 8) Ila_7series.xci 是debug IP 功能就是内嵌的逻辑分析仪
9) aurora_8b10b_cdc_sync_exdes.v 文件是VIO 虚拟IO和via debug 内嵌逻辑分析仪的同步程序 下面仅就关键的代码做分析
1.5.2 Aurora_8b10b_frame_gen.v
FRAME_GEN模块为遵循AXI4-Stream协议的PDU,UFC和NFC接口中的每一个生成用户流量。 该
模块包含使用具有特定初始值的线性反馈移位寄存器(LFSR)的伪随机数生成器来生成可预测的数据序列。 FRAME_CHECK模块使用此数据序列来验证Aurora数据通道的完整性。 模块输入为user_clk,reset和channel_up。
这里的设计从IPCORE设置向导可以看到我们没有配置UFC或者NFC流控制接口。
第 50 页 共 75 页
常州 / Kintex-7修炼秘籍2018版GTX通信篇
module aurora_8b10b_FRAME_GEN (
// User Interface TX_D,
TX_REM, TX_SOF_N, TX_EOF_N, TX_SRC_RDY_N, TX_DST_RDY_N,
// System Interface USER_CLK, RESET, CHANNEL_UP );
//*****************************Parameter Declarations****************************
//***********************************Port Declarations*******************************
// User Interface output [0:15] TX_D; output TX_REM; output TX_SOF_N; output TX_EOF_N; output TX_SRC_RDY_N; input TX_DST_RDY_N;
// System Interface input USER_CLK; input RESET; input CHANNEL_UP;
//***************************External Register Declarations***************************
reg TX_SRC_RDY_N; reg TX_SOF_N; reg TX_EOF_N;
//***************************Internal Register Declarations***************************
reg [0:15] data_lfsr_r; reg [0:7] frame_size_r; reg [0:7] bytes_sent_r; reg [0:3] ifg_size_r;
//State registers for one-hot state machine reg idle_r;
reg single_cycle_frame_r;
第 51 页 共 75 页
常州 / Kintex-7修炼秘籍2018版GTX通信篇
reg sof_r;
reg data_cycle_r; reg eof_r;
wire reset_c;
//*********************************Wire Declarations**********************************
wire ifg_done_c;
//Next state signals for one-hot state machine wire next_idle_c;
wire next_single_cycle_frame_c; wire next_sof_c;
wire next_data_cycle_c; wire next_eof_c;
wire dly_data_xfer; reg [4:0] channel_up_cnt;
//*********************************Main Body of Code**********************************
always @ (posedge USER_CLK) begin
if(RESET)
channel_up_cnt <= `DLY 5'd0; else if(CHANNEL_UP) if(&channel_up_cnt)
channel_up_cnt <= `DLY channel_up_cnt; else
channel_up_cnt <= `DLY channel_up_cnt + 1'b1; else
channel_up_cnt <= `DLY 5'd0; end
assign dly_data_xfer = (&channel_up_cnt);
//Generate RESET signal when Aurora channel is not ready assign reset_c = RESET || !dly_data_xfer;
//______________________________ 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
第 52 页 共 75 页
常州 / Kintex-7修炼秘籍2018版GTX通信篇
end
else if(!TX_DST_RDY_N && !idle_r) begin
data_lfsr_r <= {!{data_lfsr_r[3]^data_lfsr_r[12]^data_lfsr_r[14]^data_lfsr_r[15]}, data_lfsr_r[0:14]}; 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];
//Use a counter to determine the size of the next frame to send //frame_size_r 帧计数同时也是每一次帧发送的最大数据个数 always @(posedge USER_CLK) if(reset_c)
frame_size_r <= `DLY 8'h00;
else if(single_cycle_frame_r || eof_r)// 一个循环的开始或者一帧结束计数 frame_size_r <= `DLY frame_size_r + 1;
//Use a second counter to determine how many bytes of the frame have already been sent //bytes_sent_r计数器计数一次帧传输发送的最大数据个数 always @(posedge USER_CLK) if(reset_c)
bytes_sent_r <= `DLY 8'h00; else if(sof_r)
bytes_sent_r <= `DLY 8'h01; else if(!TX_DST_RDY_N && !idle_r)
bytes_sent_r <= `DLY bytes_sent_r + 1;
//Use a freerunning counter to determine the IFG //这个就是一个计数器用来控制ifg_done_c这个变量 always @(posedge USER_CLK) if(reset_c)
ifg_size_r <= `DLY 4'h0; else
ifg_size_r <= `DLY ifg_size_r + 1;
//IFG is done when ifg_size register is 0
assign ifg_done_c = (ifg_size_r == 4'h0);
//_____________________________ Framing State machine______________________________ //Use a state machine to determine whether to start a frame, end a frame, send //data or send nothing
`DLY 第 53 页 共 75 页
相关推荐: