Xilinx IOserdes 原语使用 ---- 回环实验

news/2024/12/12 13:40:06/

Xilinx IOserdes 原语使用 ---- 回环实验

下面RTL 代码,仅供参考,参考手册 :xilinx UG471
首先需要调节 bitslip 对齐,可以自己自定义序列接收检测,方可传输数据。

注意:
bitslip 必须在clkdiv 的一个周期下作用,等待两个周期后采样的Q4到Q1数据才有效,serdes 的复位至少需要两个时钟周期
在这里插入图片描述

在这里插入图片描述

`timescale 1ns / 1psmodule serdes(input	i_clk_p,input	i_clk_n// output	o_data,// input	i_data);wire		clk_50MHZx1;
wire		clk_400MHZx8;reg	[15:0]		r_rst_cnt;
reg				r_rst_d0;
reg				r_rst_d1;(*mark_debug = "true"*)  reg	[7:0]		r_tx_data;(*mark_debug = "true"*)  wire	[7:0]	r_rx_data;(*mark_debug = "true"*)  reg	[7:0]		r_send_data;(*mark_debug = "true"*)  reg				r_sync_done;(*mark_debug = "true"*)  reg				r_sync_done_d;(*mark_debug = "true"*)  reg	[15:0]		r_sync_cnt;(*mark_debug = "true"*)  reg	[4:0]		r_bitslip_gap;(*mark_debug = "true"*)  reg				BITSLIP;wire	RST;
wire	vio;
wire a_50M;
wire a_400M;clk_wiz_0 clk_wiz_0_inst0(// Clock out ports.clk_out1(clk_50MHZx1),     // output clk_out1.clk_out2(clk_400MHZx8),     // output clk_out2.clk_out3(a_50M),     // output clk_out3.clk_out4(a_400M),     // output clk_out4// Status and control signals.locked(locked),       // output locked// Clock in ports.clk_in1_p(i_clk_p),    // input clk_in1_p.clk_in1_n(i_clk_n));    // input clk_in1_n
// INST_TAG_END ------ End INSTANTIATION Template ---------vio_0 your_instance_name (.clk(clk_50MHZx1),                // input wire clk.probe_out0(vio)  // output wire [0 : 0] probe_out0
);assign RST = r_rst_d1 || vio;always @ (posedge clk_50MHZx1 or negedge locked)beginif (!locked) beginr_rst_cnt <= 0;r_rst_d0 <= 0;r_rst_d1 <= 0;end else beginr_rst_cnt <= (r_rst_cnt == 1024)?r_rst_cnt:r_rst_cnt + 1;r_rst_d0  <=  (r_rst_cnt < 1024)?1:0;r_rst_d1  <=  r_rst_d0;end
end /*------------------------------------------*\iodelay
\*------------------------------------------*/// (* IODELAY_GROUP = <iodelay_group_name> *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL// IDELAYCTRL IDELAYCTRL_inst (//    .RDY(RDY),       // 1-bit output: Ready output//    .REFCLK(REFCLK), // 1-bit input: Reference clock input//    .RST(RST)        // 1-bit input: Active high reset input// );//  (* IODELAY_GROUP = <iodelay_group_name> *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL// IDELAYE2 #(//    .CINVCTRL_SEL("FALSE"),          // Enable dynamic clock inversion (FALSE, TRUE)//    .DELAY_SRC("IDATAIN"),           // Delay input (IDATAIN, DATAIN)//    .HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")//    .IDELAY_TYPE("FIXED"),           // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE//    .IDELAY_VALUE(0),                // Input delay tap setting (0-31)//    .PIPE_SEL("FALSE"),              // Select pipelined mode, FALSE, TRUE//    .REFCLK_FREQUENCY(200.0),        // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0).//    .SIGNAL_PATTERN("DATA")          // DATA, CLOCK input signal// )// IDELAYE2_inst (//    .CNTVALUEOUT(CNTVALUEOUT), // 5-bit output: Counter value output//    .DATAOUT(DATAOUT),         // 1-bit output: Delayed data output//    .C(C),                     // 1-bit input: Clock input//    .CE(CE),                   // 1-bit input: Active high enable increment/decrement input//    .CINVCTRL(CINVCTRL),       // 1-bit input: Dynamic clock inversion input//    .CNTVALUEIN(CNTVALUEIN),   // 5-bit input: Counter value input//    .DATAIN(DATAIN),           // 1-bit input: Internal delay data input//    .IDATAIN(IDATAIN),         // 1-bit input: Data input from the I/O//    .INC(INC),                 // 1-bit input: Increment / Decrement tap delay input//    .LD(LD),                   // 1-bit input: Load IDELAY_VALUE input//    .LDPIPEEN(LDPIPEEN),       // 1-bit input: Enable PIPELINE register to load data input//    .REGRST(REGRST)            // 1-bit input: Active-high reset tap-delay input// );/*------------------------------------------*\serdes
\*------------------------------------------*/ISERDESE2 #(.DATA_RATE("SDR"),           // DDR, SDR.DATA_WIDTH(8),              // Parallel data width (2-8,10,14).DYN_CLKDIV_INV_EN("FALSE"), // Enable DYNCLKDIVINVSEL inversion (FALSE, TRUE).DYN_CLK_INV_EN("FALSE"),    // Enable DYNCLKINVSEL inversion (FALSE, TRUE)// INIT_Q1 - INIT_Q4: Initial value on the Q outputs (0/1).INIT_Q1(1'b0),.INIT_Q2(1'b0),.INIT_Q3(1'b0),.INIT_Q4(1'b0),.INTERFACE_TYPE("NETWORKING"),   // MEMORY, MEMORY_DDR3, MEMORY_QDR, NETWORKING, OVERSAMPLE.IOBDELAY("NONE"),           // NONE, BOTH, IBUF, IFD.NUM_CE(2),                  // Number of clock enables (1,2).OFB_USED("TRUE"),          // Select OFB path (FALSE, TRUE).SERDES_MODE("MASTER"),      // MASTER, SLAVE// SRVAL_Q1 - SRVAL_Q4: Q output values when SR is used (0/1).SRVAL_Q1(1'b0),.SRVAL_Q2(1'b0),.SRVAL_Q3(1'b0),.SRVAL_Q4(1'b0))ISERDESE2_inst (.O(),                       // 1-bit output: Combinatorial output// Q1 - Q8: 1-bit (each) output: Registered data outputs.Q1(r_rx_data[7]),.Q2(r_rx_data[6]),.Q3(r_rx_data[5]),.Q4(r_rx_data[4]),.Q5(r_rx_data[3]),.Q6(r_rx_data[2]),.Q7(r_rx_data[1]),.Q8(r_rx_data[0]),// SHIFTOUT1, SHIFTOUT2: 1-bit (each) output: Data width expansion output ports.SHIFTOUT1(),.SHIFTOUT2(),.BITSLIP(BITSLIP),  //右移,桶型移�         // 1-bit input: The BITSLIP pin performs a Bitslip operation synchronous to// CLKDIV when asserted (active High). Subsequently, the data seen on the Q1// to Q8 output ports will shift, as in a barrel-shifter operation, one// position every time Bitslip is invoked (DDR operation is different from// SDR).// CE1, CE2: 1-bit (each) input: Data register clock enable inputs.CE1(1),.CE2(1),.CLKDIVP(0),           // 1-bit input: TBD// Clocks: 1-bit (each) input: ISERDESE2 clock input ports.CLK(a_400M),                   // 1-bit input: High-speed clock.CLKB(~a_400M),                 // 1-bit input: High-speed secondary clock.CLKDIV(a_50M),             // 1-bit input: Divided clock.OCLK(0),                 // 1-bit input: High speed output clock used when INTERFACE_TYPE="MEMORY" // Dynamic Clock Inversions: 1-bit (each) input: Dynamic clock inversion pins to switch clock polarity.DYNCLKDIVSEL(0), // 1-bit input: Dynamic CLKDIV inversion.DYNCLKSEL(0),       // 1-bit input: Dynamic CLK/CLKB inversion// Input Data: 1-bit (each) input: ISERDESE2 data input ports.D(),                       // 1-bit input: Data input.DDLY(),                 // 1-bit input: Serial data from IDELAYE2.OFB(OFB),                   // 1-bit input: Data feedback from OSERDESE2.OCLKB(),               // 1-bit input: High speed negative edge output clock.RST(RST),                   // 1-bit input: Active high asynchronous reset// SHIFTIN1, SHIFTIN2: 1-bit (each) input: Data width expansion input ports.SHIFTIN1(),.SHIFTIN2());OSERDESE2 #(.DATA_RATE_OQ("SDR"),   // DDR, SDR.DATA_RATE_TQ("SDR"),   // DDR, BUF, SDR.DATA_WIDTH(8),         // Parallel data width (2-8,10,14).INIT_OQ(1'b0),         // Initial value of OQ output (1'b0,1'b1).INIT_TQ(1'b0),         // Initial value of TQ output (1'b0,1'b1).SERDES_MODE("MASTER"), // MASTER, SLAVE.SRVAL_OQ(1'b0),        // OQ output value when SR is used (1'b0,1'b1).SRVAL_TQ(1'b0),        // TQ output value when SR is used (1'b0,1'b1).TBYTE_CTL("FALSE"),    // Enable tristate byte operation (FALSE, TRUE).TBYTE_SRC("FALSE"),    // Tristate byte source (FALSE, TRUE).TRISTATE_WIDTH(1)      // 3-state converter width (1,4))OSERDESE2_inst (.OFB(OFB),             // 1-bit output: Feedback path for data.OQ(),               // 1-bit output: Data path output// SHIFTOUT1 / SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each).SHIFTOUT1(),.SHIFTOUT2(),.TBYTEOUT(),   // 1-bit output: Byte group tristate.TFB(),             // 1-bit output: 3-state control.TQ(),               // 1-bit output: 3-state control.CLK(a_400M),             // 1-bit input: High speed clock.CLKDIV(a_50M),       // 1-bit input: Divided clock// D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each).D1(r_tx_data[0]),.D2(r_tx_data[1]),.D3(r_tx_data[2]),.D4(r_tx_data[3]),.D5(r_tx_data[4]),.D6(r_tx_data[5]),.D7(r_tx_data[6]),.D8(r_tx_data[7]),.OCE(1),             // 1-bit input: Output data clock enable.RST(RST),             // 1-bit input: Reset// SHIFTIN1 / SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each).SHIFTIN1(),.SHIFTIN2(),// T1 - T4: 1-bit (each) input: Parallel 3-state inputs.T1(0),.T2(0),.T3(0),.T4(0),.TBYTEIN(0),     // 1-bit input: Byte group tristate.TCE(0)              // 1-bit input: 3-state clock enable);always @ (posedge clk_50MHZx1)beginif (RST) beginr_send_data <= 0;end else if (!r_sync_done) beginr_send_data <= 0;end else if (r_sync_done) beginr_send_data <= r_send_data + 1;  end else r_send_data <= r_send_data ;  
end always @ (posedge clk_50MHZx1 )beginif (RST) beginr_tx_data <= 0;end else if (!r_sync_done) beginr_tx_data <= 8'hBC;end else if (r_sync_done) beginr_tx_data <= r_send_data;    end else r_tx_data <= 0;	 
end always @ (posedge clk_50MHZx1) beginif (RST) beginr_sync_done_d <= 0;r_bitslip_gap <= 0;end else if ( !r_sync_done_d && r_rx_data == 8'hBC) beginr_sync_done_d <= 1;end else if (r_sync_cnt == 100) beginr_bitslip_gap <= 0;end else beginr_sync_done_d <= 0;	r_bitslip_gap <= r_bitslip_gap + 1;	
end 
endalways @ (posedge clk_50MHZx1) beginif (RST)r_sync_cnt <= 0;else if (r_sync_cnt == 100)r_sync_cnt <= r_sync_cnt;else if (r_sync_done_d)r_sync_cnt <= r_sync_cnt + 1;else r_sync_cnt <= r_sync_cnt;		
end always @ (posedge clk_50MHZx1) beginif (RST)r_sync_done <= 0;else if (r_sync_cnt == 100)r_sync_done <= 1;else r_sync_done <= r_sync_done;		
end always @ (posedge clk_50MHZx1) beginif (RST)BITSLIP <= 0;else if (!r_sync_done_d && r_bitslip_gap == 31 && r_rx_data!= 8'hBC)BITSLIP <= 1;else BITSLIP <= 0;		
end endmodule

http://www.ppmy.cn/news/1554507.html

相关文章

渗透测试学习笔记(二)kali相关

一.kali 基础工具 NetCat -网络工具中的瑞士军刀&#xff1a;允许用户通过 TCP 或 UDP 协议发送和接收数据。WireShark-开源抓包软件TCPdump-命令行抓包分析工具 二. 被动信息收集 2.1 被动信息收集指从公开渠道获取信息&#xff0c;主要是已经公开的信息。 要点&#xff1…

导入kotlin

android studio 导入kotlin项目 android studio kotlin教程 或者直接拿一个kt文件进来&#xff0c;在顶部会显示一个config&#xff0c;然后设置version&#xff0c;点击OK就可以了自动导了

FPGA工作原理、架构及底层资源

FPGA工作原理、架构及底层资源 文章目录 FPGA工作原理、架构及底层资源前言一、FPGA工作原理二、FPGA架构及底层资源 1.FPGA架构2.FPGA底层资源 2.1可编程输入/输出单元简称&#xff08;IOB&#xff09;2.2可配置逻辑块2.3丰富的布线资源2.4数字时钟管理模块(DCM)2.5嵌入式块 …

项目中如何选择JVM垃圾回收器?

大家好&#xff0c;我是锋哥。今天分享关于【项目中如何选择JVM垃圾回收器?】面试题。希望对大家有帮助&#xff1b; 项目中如何选择JVM垃圾回收器? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在一个项目中选择合适的 JVM 垃圾回收器 (Garbage Collector, GC…

力扣136. 只出现一次的数字

给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 示例 1 &#xff1a; 输入&#xff1a…

汽车升级到底应不应该设置“可取消“功能

最近&#xff0c;汽车OTA&#xff08;Over-the-Air&#xff09;升级频频成为车主讨论的热点。有些车主反映&#xff0c;一些升级增加了实用功能&#xff0c;而另一些却让体验变得复杂甚至带来不便。于是&#xff0c;大家不禁发问&#xff1a;汽车升级功能究竟应不应该允许“可取…

使用 electron 把 vue 项目打包成客户端

1. 新建一个Vue项目 新建一个vue项目&#xff0c;或者在已经写好的vue项目上操作 2. 安装依赖包 需要安装的包有2个 electron electron-builder 安装失败的&#xff0c;可看另外一篇解决方法https://blog.csdn.net/Anorry/article/details/144061069?spm1001.2014.3001.5501 3…

深度学习常用损失函数介绍

均方差损失&#xff08;Mean Square Error&#xff0c;MSE&#xff09; 均方误差损失又称为二次损失、L2损失&#xff0c;常用于回归预测任务中。均方误差函数通过计算预测值和实际值之间距离&#xff08;即误差&#xff09;的平方来衡量模型优劣。即预测值和真实值越接近&…