SerDes介绍以及原语使用介绍(4)ISERDESE2原语仿真

文章目录

  • 前言
  • 一、iserdese2_module模块
  • 二、oserdese2_module模块
  • 三、顶层模块
  • 四、仿真结果分析

前言

上文详细介绍了ISERDESE2原语的使用,本文根据仿真对ISERDESE2原语的使用进一步加深印象。在仿真时,与OSERDESE进行回环。

一、iserdese2_module模块

模块设计思路如下:

  1. 发送端在上电后会一直发送64个连续读8’bBC和8’b50,接受端需要一直检测接收到的并行数据是否为这俩个数据
  2. 发现数据错误则需要滑动串并转换窗口,在滑动窗口后,至少需要3个CLKDIV周期才可以检测到滑动后的数据,这里统一等待4个时钟周期进行检测,如果正确则关闭滑动窗口锁r_slip_lock,在下一个周期进行滑动,即拉高r_bitslip
  3. 如若接收到的数据正确,则不需要滑动,但是为了排除误判的可能,需要继续观察一段时间,当连续接收到正确的P_MAX_RIGHT_NUM个数据后,拉高信号r_byte_align信号表示对齐,此时即可一直打开滑动窗口锁r_slip_lock,不在进行窗口滑动。

代码如下:

module iserdese2_module(input          	i_clk       	,input          	i_div_clk   	,input          	i_rst       	,input          	i_OFB     		,output [7 :0]	o_par_data		,output  		o_data_valid 	
);localparam P_MAX_RIGHT_NUM = 10;reg   		r_bitslip		;
reg  [2 :0]	r_gap_cnt		;
reg   		r_byte_align	;
reg   		r_slip_lock		;
reg  [5 :0]	r_right_cnt 	;wire [7 :0] w_par_data		;assign o_par_data = w_par_data	;
assign o_data_valid = r_byte_align	;always @(posedge i_div_clk or posedge i_rst) beginif(i_rst)r_gap_cnt <= 'd0;else if(r_byte_align || r_bitslip)r_gap_cnt <= 'd0;else if(r_slip_lock)r_gap_cnt <= r_gap_cnt + 'd1;elser_gap_cnt <= 'd0;
endalways @(posedge i_div_clk or posedge i_rst) beginif(i_rst)r_slip_lock <= 'd1;else if(r_byte_align || (r_gap_cnt == 5 && !r_slip_lock))r_slip_lock <= 'd1;else if(w_par_data != 8'hBC && w_par_data != 8'h50 && (r_gap_cnt == 4))r_slip_lock <= 'd0;elser_slip_lock <= 'd1;
endalways @(posedge i_div_clk or posedge i_rst) beginif(i_rst)r_bitslip <= 'd0;else if((r_gap_cnt == 5) && !r_slip_lock)r_bitslip <= 'd1;elser_bitslip <= 'd0;
endalways @(posedge i_div_clk or posedge i_rst) beginif(i_rst)r_right_cnt <= 'd0;else if(r_bitslip)r_right_cnt <= 'd0;else if(r_right_cnt == P_MAX_RIGHT_NUM)r_right_cnt <= r_right_cnt;else if(r_slip_lock && (w_par_data == 8'hBC || w_par_data == 8'h50))r_right_cnt <= r_right_cnt + 1;elser_right_cnt <= r_right_cnt;
endalways @(posedge i_div_clk or posedge i_rst) beginif(i_rst)r_byte_align <= 'd0;else if(r_right_cnt == P_MAX_RIGHT_NUM)r_byte_align <= 'd1;elser_byte_align <= 'd0;
endISERDESE2 #(.DATA_RATE		("DDR"),           // 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(w_par_data[7]	),.Q2(w_par_data[6]	),.Q3(w_par_data[5]	),.Q4(w_par_data[4]	),.Q5(w_par_data[3]	),.Q6(w_par_data[2]	),.Q7(w_par_data[1]	),.Q8(w_par_data[0]	),// SHIFTOUT1, SHIFTOUT2: 1-bit (each) output: Data width expansion output ports.SHIFTOUT1(),.SHIFTOUT2(),.BITSLIP(r_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'b1),.CE2(1'b1),.CLKDIVP(1'b0),           // 1-bit input: TBD// Clocks: 1-bit (each) input: ISERDESE2 clock input ports.CLK(i_clk),                   // 1-bit input: High-speed clock.CLKB(~i_clk),                 // 1-bit input: High-speed secondary clock.CLKDIV(i_div_clk),             // 1-bit input: Divided clock.OCLK(1'b0),                 // 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(1'b0), // 1-bit input: Dynamic CLKDIV inversion.DYNCLKSEL(1'b0),       // 1-bit input: Dynamic CLK/CLKB inversion// Input Data: 1-bit (each) input: ISERDESE2 data input ports.D(1'b0),                       // 1-bit input: Data input.DDLY(1'b0),                 // 1-bit input: Serial data from IDELAYE2.OFB(i_OFB),                   // 1-bit input: Data feedback from OSERDESE2.OCLKB(),               // 1-bit input: High speed negative edge output clock.RST(i_rst),                   // 1-bit input: Active high asynchronous reset// SHIFTIN1, SHIFTIN2: 1-bit (each) input: Data width expansion input ports.SHIFTIN1(),.SHIFTIN2());endmodule

二、oserdese2_module模块

  1. 模块上电后连续发送P_INIT_CNT个连续的8’bBC和8’b50
  2. 随后开始产生自增数据,观察接收端情况

代码如下:

module oserdese2_module(input          i_clk       ,input          i_div_clk   ,input          i_rst       ,output         o_OFB         
);localparam  P_INIT_CNT = 64;reg  [7 :0] r_par_data  ;
reg  [15:0] r_init_cnt  ;
reg         r_init_flag ;always @(posedge i_div_clk or posedge i_rst)beginif(i_rst)r_init_cnt <= 'd0;else if(r_init_cnt == P_INIT_CNT)r_init_cnt <= P_INIT_CNT + 1;elser_init_cnt <= r_init_cnt + 1;
endalways @(posedge i_div_clk or posedge i_rst)beginif(i_rst)r_init_flag <= 'd0;else if(r_init_cnt < P_INIT_CNT)r_init_flag <= ~r_init_flag;elser_init_flag <= r_init_flag;
endalways @(posedge i_div_clk or posedge i_rst)beginif(i_rst)r_par_data <= 'd0;else if(r_init_cnt < P_INIT_CNT)r_par_data <= r_init_flag ? 8'hBC : 8'h50;else if(r_init_cnt == P_INIT_CNT)r_par_data <= 'd0;elser_par_data <= r_par_data + 'd1;
endOSERDESE2 #(.DATA_RATE_OQ     ("DDR"         ), // DDR, SDR.DATA_RATE_TQ     ("DDR"         ), // 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              (o_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              (i_clk         ), // 1-bit input: High speed clock.CLKDIV           (i_div_clk     ), // 1-bit input: Divided clock// D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each).D1               (r_par_data[0] ),.D2               (r_par_data[1] ),.D3               (r_par_data[2] ),.D4               (r_par_data[3] ),.D5               (r_par_data[4] ),.D6               (r_par_data[5] ),.D7               (r_par_data[6] ),.D8               (r_par_data[7] ),.OCE              (1'b1          ), // 1-bit input: Output data clock enable.RST              (i_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               (1'b0          ),.T2               (1'b0          ),.T3               (1'b0          ),.T4               (1'b0          ),.TBYTEIN          (1'b0          ), // 1-bit input: Byte group tristate.TCE              (1'b0          )  // 1-bit input: 3-state clock enable
);endmodule

三、顶层模块

例化clk_wiz_100M_400M模块,产生100Mhz时钟和400Mhz时钟信号,分别对应CLKDIV和CLK,这也是最常用的方法。

module serdes_top(input          i_clk_p       ,input          i_clk_n       
);wire 		w_clk_100mhz	;
wire 		w_clk_400mhz	;
wire   		w_locked		;wire   		w_OFB			;
wire [7 :0]	w_par_data		;
wire  		w_data_valid	;clk_wiz_100M_400M clk_wiz_100M_400M_u0
(.clk_out1		(w_clk_100mhz	),  .clk_out2		(w_clk_400mhz	),  .locked			(w_locked		),    .clk_in1_p		(i_clk_p		), .clk_in1_n		(i_clk_n		)  
);oserdese2_module oserdese2_module_u0(.i_clk       	(w_clk_400mhz	),.i_div_clk   	(w_clk_100mhz	),.i_rst       	(!w_locked		),.o_OFB       	(w_OFB			)  
);iserdese2_module iserdese2_module_u0(.i_clk       	(w_clk_400mhz	),.i_div_clk   	(w_clk_100mhz	),.i_rst       	(!w_locked		),.i_OFB     		(w_OFB			),.o_par_data		(w_par_data		),.o_data_valid	(w_data_valid	)
);endmodule

四、仿真结果分析

如下图所示,黄色刻度线和蓝色刻度线之间的过程是在进行不断对齐,蓝色刻度线之后串并转换对齐,开始正常接收数据。
在这里插入图片描述
正常数据如下,结果比对,仿真结果正确:成功将自增数据进行恢复。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/364645.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法金 | 协方差、方差、标准差、协方差矩阵

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 抱个拳&#xff0c;送个礼 1. 方差 方差是统计学中用来度量一组数据分散程度的重要指标。它反映了数据点与其均值之间的偏离程度。在…

fastzdp_login的第一次构建

概述 为了方便能够快捷的实现fastapi实现登录相关功能代码开发&#xff0c;决定开发一个开源的fastapi组件库&#xff0c;想了很多个名字&#xff0c;在检查pypi的时候发现都被占用了&#xff0c;所以最终决定使用fastzdp_login这个名字。 fast代表的时fastapi。zdp代表的是张…

“ONLYOFFICE 8.1:提升用户体验和编辑功能的全面升级”

引言 官网链接 在当今快节奏的工作环境中&#xff0c;高效地处理文档是每个职场人士必备的技能。ONLYOFFICE 桌面编辑器凭借其强大的功能和用户友好的界面&#xff0c;成为了提升文档处理效率的得力助手。本文将介绍 ONLYOFFICE 桌面编辑器的核心特性&#xff0c;并展示如何通…

Zynq7000系列FPGA中的DMA控制器简介(二)

AXI互连上的DMA传输 所有DMA事务都使用AXI接口在PL中的片上存储器、DDR存储器和从外设之间传递数据。PL中的从设备通过DMAC的外部请求接口与DMAC通信&#xff0c;以控制数据流。这意味着从设备可以请求DMA交易&#xff0c;以便将数据从源地址传输到目标地址。 虽然DMAC在技术…

pdf合并,pdf合并成一个pdf,pdf合并在线网页版

在处理pdf文件的过程中&#xff0c;有时我们需要将多个pdf文件合并成一个pdf文件。作为一名有着丰富计算机应用经验的技术博主&#xff0c;我将为您详细介绍如何将多个pdf文件合并成一个pdf文件。 pdf合并方法&#xff1a;使用&#xff0c; “轻云处理pdf官网” 打开 “轻云处…

ChatGPT智能对话绘画系统 带完整的安装源代码包以及搭建教程

系统概述 ChatGPT 智能对话绘画系统是一款集智能语言处理和绘画创作于一体的综合性系统。它利用了深度学习和自然语言处理技术&#xff0c;能够理解用户的意图和需求&#xff0c;并通过与用户的交互&#xff0c;生成富有创意的绘画作品。该系统的核心是一个强大的人工智能模型…

C#基于SkiaSharp实现印章管理(3)

本系列第一篇文章中创建的基本框架限定了印章形状为矩形&#xff0c;但常用的印章有方形、圆形等多种形状&#xff0c;本文调整程序以支持定义并显示矩形、圆角矩形、圆形、椭圆等4种形式的印章背景形状。   定义印章背景形状枚举类型&#xff0c;矩形、圆形、椭圆相关的尺寸…

QT事件处理及实例(鼠标事件、键盘事件、事件过滤)

这篇文章通过鼠标事件、键盘事件和事件过滤的三个实例介绍事件处理的实现。 鼠标事件及实例 鼠标事件包括鼠标的移动、按下、松开、单击和双击等。 创建一个MouseEvent项目&#xff0c;通过项目介绍如何获得和处理鼠标事件。程序效果如下图所示。 界面布局代码如下&#xff…

Python数据分析-风湿关节炎生存分析

一、研究背景和意义 类风湿关节炎&#xff08;RA&#xff09;是一种慢性炎症性疾病&#xff0c;主要影响关节&#xff0c;但也可能影响身体的其他部分。RA的病因尚不完全清楚&#xff0c;但已知其涉及免疫系统的异常反应。患者的免疫系统错误地攻击自身的关节组织&#xff0c;…

STM32音频应用开发:DMA与定时器的高效协作

摘要: 本文章将深入浅出地介绍如何使用STM32单片机实现音频播放功能。文章将从音频基础知识入手&#xff0c;逐步讲解音频解码、DAC转换、音频放大等关键环节&#xff0c;并结合STM32 HAL库给出具体的代码实现和电路设计方案。最后&#xff0c;我们将通过一个实例演示如何播放W…

Maven的依赖传递、依赖管理、依赖作用域

在Maven项目中通常会引入大量依赖&#xff0c;但依赖管理不当&#xff0c;会造成版本混乱冲突或者目标包臃肿。因此&#xff0c;我们以SpringBoot为例&#xff0c;从三方面探索依赖的使用规则。 1、 依赖传递 依赖是会传递的&#xff0c;依赖的依赖也会连带引入。例如在项目中…

云计算【第一阶段(21)】Linux引导过程与服务控制

目录 一、linux操作系统引导过程 1.1、开机自检 1.2、MBR引导 1.3、GRUB菜单 1.4、加载 Linux 内核 1.5、init进程初始化 1.6、简述总结 1.7、初始化进程centos 6和7的区别 二、排除启动类故障 2.1、修复MBR扇区故障 2.1.1、 实验 2.2、修复grub引导故障 2.2.1、实…

红队内网攻防渗透:内网渗透之内网对抗:横向移动篇Kerberos委派安全RBCD资源Operators组成员HTLMRelay结合

红队内网攻防渗透 1. 内网横向移动1.1 横向移动-资源约束委派-利用域用户主机加入1.1.1 利用思路1.1.2 利用条件1.1.3 利用过程1.2 横向移动-资源约束委派-Acount Operators组1.2.1 利用思路:1.2.2 利用条件:1.2.3 利用过程:1.3 横向移动-资源约束委派-CVE结合HTLMRelay1.3.…

哥斯拉短视频:成都柏煜文化传媒有限公司

哥斯拉短视频&#xff1a;巨兽传奇的视听盛宴 在短视频的海洋中&#xff0c;成都柏煜文化传媒有限公司 有一种特殊的存在总能吸引人们的目光&#xff0c;那就是以哥斯拉为主题的短视频。这些视频以震撼的视觉效果、扣人 ​心弦的剧情和独特的怪兽文化&#xff0c;为我们呈现了…

SHELL脚本学习(十二)sed进阶

一、多行命令 概述 sed 编辑器的基础命令都是对一行文本进行操作。如果要处理的数据分布在多行中&#xff0c;sed基础命令是没办法处理的。 幸运的是&#xff0c;sed编辑器的设计人员已经考虑了这个问题的解决方案。sed编辑器提供了3个处理多行文本的特殊命令。 命令描述N加…

NPOI入门指南:轻松操作Excel文件的.NET库

目录 引言 一、NPOI概述 二、NPOI的主要用途 三、安装NPOI库 四、NPOI基本使用 六、性能优化和内存管理 七、常见问题与解决方案 八、结论 附录 引言 Excel文件作为数据处理的重要工具&#xff0c;广泛应用于各种场景。然而&#xff0c;在没有安装Microsoft Office的…

PySide(PyQt)在图像上画线

1、按鼠标左键任意画线 import sys from PySide6.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget from PySide6.QtGui import QPainter, QPixmap, QMouseEvent, QColor, QPen from PySide6.QtCore import Qt, QPointclass PaintLabel(QLabel):def __init__(self…

本教程将指导如何通过 Vue 组件和后端 API 交互

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

Redis 集群模式

一、集群模式概述 Redis 中哨兵模式虽然提高了系统的可用性&#xff0c;但是真正存储数据的还是主节点和从节点&#xff0c;并且每个节点都存储了全量的数据&#xff0c;此时&#xff0c;如果数据量过大&#xff0c;接近或超出了 主节点 / 从节点机器的物理内存&#xff0c;就…

【Python系列】列表推导式:简洁而强大的数据操作工具

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…