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.mzph.cn/diannao/38057.shtml

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

相关文章

昇思MindSpore学习笔记4--数据集 Dataset

昇思MindSpore学习笔记4--数据集 Dataset 摘要&#xff1a; 昇思MindSpore数据集Dataset的加载、数据集常见操作和自定义数据集方法。 一、数据集 Dataset概念 MindSpore数据引擎基于Pipeline 数据预处理相关模块&#xff1a; 数据集Dataset加载原始数据&#xff0c;支持文本…

大创项目推荐 题目:基于机器视觉的图像矫正 (以车牌识别为例) - 图像畸变校正

文章目录 0 简介1 思路简介1.1 车牌定位1.2 畸变校正 2 代码实现2.1 车牌定位2.1.1 通过颜色特征选定可疑区域2.1.2 寻找车牌外围轮廓2.1.3 车牌区域定位 2.2 畸变校正2.2.1 畸变后车牌顶点定位2.2.2 校正 7 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享…

Leetcode3192. 使二进制数组全部等于 1 的最少操作次数 II

Every day a Leetcode 题目来源&#xff1a;3192. 使二进制数组全部等于 1 的最少操作次数 II 解法1&#xff1a;遍历 由于 nums[i] 会被其左侧元素的操作影响&#xff0c;所以我们先从最左边的 nums[0] 开始思考。 分类讨论&#xff1a; 如果 nums[0]1&#xff0c;无需反…

amis-editor 注册自定义组件

建议先将amis文档从头到尾&#xff0c;仔细看一遍。 参考&#xff1a;amis - 低代码前端框架 amis 的渲染过程是将 json 转成对应的 React 组件。先通过 json 的 type 找到对应的 Component&#xff0c;然后把其他属性作为 props 传递过去完成渲染。 import * as React from …

flex讲解

随着前端技术的不断发展和更新&#xff0c;flex布局成为前端布局的主流。但是仍然有很多前端新手搞不懂flex到底怎么用&#xff01;&#xff01;&#xff01;今天我们就来好好讲讲flex布局 老规矩先上定义 什么是flex布局 布局的传统解决方案&#xff0c;基于盒状模型&#x…

郑州高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

随着制造业的转型升级&#xff0c;智能化、信息化已成为制造业发展的必然趋势。数字孪生技术作为智能制造领域的关键技术之一&#xff0c;它通过构建与实体系统相对应的虚拟模型&#xff0c;实现对实体系统的实时监测、预测和优化&#xff0c;为制造业的智能化、信息化提供了强…

LitelDE安装---附带每一步截图以及测试

LiteIDE LiteIDE 是一款专为Go语言开发而设计的开源、跨平台、轻量级集成开发环境&#xff08;IDE&#xff09;&#xff0c;基于 Qt 开发&#xff08;一个跨平台的 C 框架&#xff09;&#xff0c;支持 Windows、Linux 和 Mac OS X 平台。LiteIDE 的第一个版本发布于 2011 年 …

PTA-线性表实验(JAVA)

题目1&#xff1a;Josephus环的问题及算法 【实验内容】 编程实现如下功能&#xff1a; 题意说明&#xff1a;古代某法官要判决n个犯人的死刑&#xff0c;他有一条荒唐的法律&#xff0c;将犯人站成一个圆圈&#xff0c;从第start个犯人开始数起&#xff0c;每数到第distance的…

使用Dockerfile构建镜像 使用docker-compose 一键部署IM项目

本文讲解&#xff1a;使用Dockerfile构建镜像 & 使用docker-compose 一键部署IM项目。 im项目地址&#xff1a;xzll-im &#xff0c;欢迎志同道合的开发者 一起 维护&#xff0c;学习&#xff0c;欢迎star &#x1f604; 1、Dockerfile编写与镜像构建&容器运行 Dockerf…

Nginx和CDN运用

一.Web缓存代理 1.工作机制 代替客户机向网站请求数据&#xff0c;从而可以隐藏用户的真实IP地址。将获得的网页数据&#xff08;静态Web元素&#xff09;保存到缓存中并发送给客户机&#xff0c;以便下次请求相同的数据时快速响应。 2.代理服务器的概念 代理服务器是一个位…

k8s token加新节点

在 master 节点执行 kubeadm token create --print-join-command得到token和cert&#xff0c;这两个参数在2个小时内可以重复使用&#xff0c;超过以后就得再次生成 kubeadm join apiserver.k8s.com --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha…

【入门】5分钟了解卷积神经网络CNN是什么

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、卷积神经网络的结构1.1.卷积与池化的作用2.2.全连接层的作用 二、卷积神经网络的运算2.1.卷积层的运算2.2.池化的运算2.3.全连接层运算 三、pytorch实现一个CNN例子3.1.模型的搭建3.2.CNN完整训练代码 CNN神…

【Dison夏令营 Day 04】如何用 Python 编写简单的数字猜谜游戏代码

上个周末&#xff0c;我整理了一份可以用 Python 编写的游戏列表。但为什么呢&#xff1f; 如果您是 Python 程序员初学者&#xff0c;编写有趣的游戏可以帮助您更快更好地学习 Python 语言&#xff0c;而不会被语法之类的东西所困扰。我在学习 Python 的时候曾制作过一些这样…

Hadoop-03-Hadoop集群 免密登录 超详细 3节点公网云 分发脚本 踩坑笔记 SSH免密 服务互通 集群搭建 开启ROOT

章节内容 上一节完成&#xff1a; HDFS集群XML的配置MapReduce集群XML的配置Yarn集群XML的配置统一权限DNS统一配置 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&…

短视频矩阵系统搭建APP源码开发

前言 短视频矩阵系统不仅有助于提升品牌影响力和营销效率&#xff0c;还能帮助企业更精准地触达目标受众&#xff0c;增强用户互动&#xff0c;并利用数据分析来持续优化营销策略。 一、短视频矩阵系统是什么&#xff1f; 短视频矩阵系统是一种通过多个短视频平台进行内容创作…

多多代播24小时值守:电商直播时代是带货爆单的关键

在电商直播盛行的今天&#xff0c;直播带货已成为品牌与消费者沟通的关键。然而&#xff0c;流量波动大&#xff0c;竞争激烈&#xff0c;使品牌面临诸多挑战。因此&#xff0c;许多品牌寻求专业代播服务&#xff0c;并特别强调24小时值守的重要性。 流量来源的不稳定性是一个显…

Linux下安装RocketMQ:从零开始的消息中间件之旅

感谢您阅读本文&#xff0c;欢迎“一键三连”。作者定会不负众望&#xff0c;按时按量创作出更优质的内容。 ❤️ 1. 毕业设计专栏&#xff0c;毕业季咱们不慌&#xff0c;上千款毕业设计等你来选。 RocketMQ是一款分布式消息中间件&#xff0c;具有高吞吐量、低延迟、高可用性…

本末倒置!做660+880一定要避免出现这3种情况!

每年都有不少人做过660题&#xff0c;但是做过之后&#xff0c;并没有真正理解其中的题目&#xff0c;所以做过之后效果也不好&#xff01;再去做880题&#xff0c;做的也会比较吃力。 那该怎么办呢&#xff0c;不建议你继续做880题&#xff0c;先把660给吃透再说。 接下来给…

PostgreSQL使用教程

安装 PostgreSQL 您可以从 PostgreSQL 官方网站下载适合您操作系统的安装程序&#xff0c;并按照安装向导进行安装。 启动数据库服务器 安装完成后&#xff0c;根据您的操作系统&#xff0c;通过相应的方式启动数据库服务器。 连接到数据库 可以使用命令行工具&#xff08;如 p…

Objective-C使用块枚举的细节

对元素类型的要求 在 Objective-C 中&#xff0c;NSArray 只能存储对象类型&#xff0c;而不能直接存储基本类型&#xff08;例如 int&#xff09;。但是&#xff0c;可以将基本类型封装在 NSNumber 等对象中&#xff0c;然后将这些对象存储在 NSArray 中。这样&#xff0c;en…