SerDes介绍以及原语使用介绍(2)OSERDESE2原语仿真

文章目录

  • 前言
  • 一、SDR模式
    • 1.1、设计代码
    • 1.2、testbench代码
    • 1.3、仿真分析
  • 二、DDR模式下
    • 2.1、设计代码
    • 2.2、testbench代码
    • 2.3、仿真分析
  • 三、OSERDES2级联
    • 3.1、设计代码
    • 3.2、testbench代码
    • 3.3、代码分析

前言

上文通过xilinx ug471手册对OSERDESE有了简单的了解,接下来通过仿真进一步深化印象。

一、SDR模式

1.1、设计代码

以下代码表示在SDR模式下对输入的4位宽并行数据进行并串转换。

module serdes_top(input          i_clk       ,input          i_div_clk   ,input          i_rst       ,input  [3 :0]  i_par_data  ,output         o_ser_data  
);wire OFB;OSERDESE2 #(.DATA_RATE_OQ     ("SDR"         ), // DDR, SDR.DATA_RATE_TQ     ("DDR"         ), // DDR, BUF, SDR.DATA_WIDTH       (4             ), // 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               (o_ser_data    ), // 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               (i_par_data[0] ),.D2               (i_par_data[1] ),.D3               (i_par_data[2] ),.D4               (i_par_data[3] ),.D5               (),.D6               (),.D7               (),.D8               (),// .D5               (i_par_data[4] ),// .D6               (i_par_data[5] ),// .D7               (i_par_data[6] ),// .D8               (i_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);

1.2、testbench代码

以下为TB文件:

module serdes_sim();localparam P_CLK_PERIOD = 40;reg clk, div_clk , rst;
reg [3 :0] r_din;wire w_ser_dout;always begindiv_clk = 0;#(P_CLK_PERIOD); div_clk = 1;#(P_CLK_PERIOD); 
endalways beginclk = 1;#(P_CLK_PERIOD/4); clk = 0;#(P_CLK_PERIOD/4); 
endinitial beginrst = 1;#100;@(posedge clk);rst = 0;repeat(200) @(posedge clk);$stop;
endinitial beginr_din = 'd0;data_gen();
endserdes_top serdes_top_u0(.i_clk           (clk        ),.i_div_clk       (div_clk    ),.i_rst           (rst        ),.i_par_data      (r_din      ),.o_ser_data      (w_ser_dout ) 
);task data_gen();
beginr_din <= 'd0;wait(!rst);repeat(10) @(posedge div_clk);r_din <= ({$random} % 16);forever begin@(posedge div_clk);r_din <= ({$random} % 16);end
end
endtaskendmodule

1.3、仿真分析

在这里插入图片描述
第一个并行数据为4’b0100,在蓝色刻度线处被采样,黄色刻度线开始输出,但是按照表中输出时延应该是3个CLK后开始输出,这是因为CLK和CLKDIV相位对齐,输出时延可以变化一个CLK,仿真结果显示是4个CLK,相比于表中描述多了一个CLK.

二、DDR模式下

2.1、设计代码

只需要修改位宽,输入D5-D8、以及并串转换模式即可。

module serdes_top(input          i_clk       ,input          i_div_clk   ,input          i_rst       ,input  [7 :0]  i_par_data  ,output         o_ser_data  
);wire OFB;OSERDESE2 #(.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              (OFB           ), // 1-bit output: Feedback path for data.OQ               (o_ser_data    ), // 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               (i_par_data[0] ),.D2               (i_par_data[1] ),.D3               (i_par_data[2] ),.D4               (i_par_data[3] ),// .D5               (),// .D6               (),// .D7               (),// .D8               (),.D5               (i_par_data[4] ),.D6               (i_par_data[5] ),.D7               (i_par_data[6] ),.D8               (i_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

2.2、testbench代码

修改位宽以及产生随机数的大小即可。

module serdes_sim();localparam P_CLK_PERIOD = 40;reg clk, div_clk , rst;
reg [7 :0] r_din;wire w_ser_dout;always begindiv_clk = 0;#(P_CLK_PERIOD); div_clk = 1;#(P_CLK_PERIOD); 
endalways beginclk = 1;#(P_CLK_PERIOD/4); clk = 0;#(P_CLK_PERIOD/4); 
endinitial beginrst = 1;#100;@(posedge clk);rst = 0;repeat(200) @(posedge clk);$stop;
endinitial beginr_din = 'd0;data_gen();
endserdes_top serdes_top_u0(.i_clk           (clk        ),.i_div_clk       (div_clk    ),.i_rst           (rst        ),.i_par_data      (r_din      ),.o_ser_data      (w_ser_dout ) 
);task data_gen();
beginr_din <= 'd0;wait(!rst);repeat(10) @(posedge div_clk);r_din <= ({$random} % 256);forever begin@(posedge div_clk);r_din <= ({$random} % 256);end
end
endtaskendmodule

2.3、仿真分析

在这里插入图片描述
蓝色刻度线处采样到并行输入数据,黄色刻度线开始输出,延时为4个CLK,与表中描述是一致的。

三、OSERDES2级联

当我们需要对10位或14位并行数据进行并串转换时,需要对OSERDSES2进行级联。本实验以10位输入数据并串转换为例进行说明。

3.1、设计代码

俩个OSERDESE2级联,修改位宽,添加从OSERDESE2,连接SHIFT引脚,修改位宽即可。

module serdes_top(input          i_clk       ,input          i_div_clk   ,input          i_rst       ,input  [9 :0]  i_par_data  ,output         o_ser_data  
);wire OFB          ;
wire w_shiftout1  ;
wire w_shiftout2  ;OSERDESE2 #(.DATA_RATE_OQ     ("DDR"         ), // DDR, SDR.DATA_RATE_TQ     ("DDR"         ), // DDR, BUF, SDR.DATA_WIDTH       (10            ), // 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               (o_ser_data    ), // 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               (i_par_data[0] ),.D2               (i_par_data[1] ),.D3               (i_par_data[2] ),.D4               (i_par_data[3] ),.D5               (i_par_data[4] ),.D6               (i_par_data[5] ),.D7               (i_par_data[6] ),.D8               (i_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         (w_shiftout1   ),.SHIFTIN2         (w_shiftout2   ),// 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);OSERDESE2 #(.DATA_RATE_OQ     ("DDR"         ), // DDR, SDR.DATA_RATE_TQ     ("DDR"         ), // DDR, BUF, SDR.DATA_WIDTH       (10            ), // 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      ("SLAVE"      ), // 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_inst1 (.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        (w_shiftout1   ),.SHIFTOUT2        (w_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               (),.D2               (),.D3               (i_par_data[8] ),.D4               (i_par_data[9] ),// .D5               (),// .D6               (),// .D7               (),// .D8               (),.D5               (),.D6               (),.D7               (),.D8               (),.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

3.2、testbench代码

首先需要修改时钟信号,因为输入输出位宽10:1,在DDR模式下,时钟比为5:1,其次修改位宽以及随机数产生即可。

3.3、代码分析

在这里插入图片描述
蓝色刻度线处采样到并行输入数据,黄色刻度线开始输出,延时为4个CLK,表中描述延时应当为5个CLK,但此处CLK和DIVCLK是对齐的,所有导致了一个CLK的变化。

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

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

相关文章

[物联网专题] - 螺钉式接线端子的选择和辨识

工业设备上大量使用各式各样的端子来连接外部设备和电缆电线&#xff0c;其中用得最多的就是标准的螺钉式端子&#xff0c;其外形如下&#xff1a; 标准端子一般是2位&#xff08;2个接线端子&#xff09;&#xff0c;端子与端子之间可以级联&#xff0c;组成任意数量的位数。…

【前端】简易化看板

【前端】简易化看板 项目简介 看板分为三个模块&#xff0c;分别是待办&#xff0c;正在做&#xff0c;已做完三个部分。每个事件采取"卡片"式设计&#xff0c;支持任务间拖拽&#xff0c;删除等操作。 代码 import React, { useState } from react; import { Car…

【图论 树 深度优先搜索】2246. 相邻字符不同的最长路径

本文涉及知识点 图论 树 图论知识汇总 深度优先搜索汇总 LeetCode 2246. 相邻字符不同的最长路径 给你一棵 树&#xff08;即一个连通、无向、无环图&#xff09;&#xff0c;根节点是节点 0 &#xff0c;这棵树由编号从 0 到 n - 1 的 n 个节点组成。用下标从 0 开始、长度…

【漏洞复现】SolarWinds——任意文件读取

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 SolarWinds其Serv-UFTP服务存在目录遍历导致任意文件读取漏洞&a…

自然语言处理(NLP)—— 深度学习

1. 词嵌入&#xff08;Embeddings&#xff09; 1.1 词嵌入的基本概念 词嵌入&#xff08;Embeddings&#xff09;是一种将词语映射到高维空间&#xff08;比如N300维&#xff09;的技术&#xff0c;使得词语之间的欧几里得距离与它们的语义距离相关联。这意味着在这个向量空间…

Golang | Leetcode Golang题解之第203题移除链表元素

题目&#xff1a; 题解&#xff1a; func removeElements(head *ListNode, val int) *ListNode {dummyHead : &ListNode{Next: head}for tmp : dummyHead; tmp.Next ! nil; {if tmp.Next.Val val {tmp.Next tmp.Next.Next} else {tmp tmp.Next}}return dummyHead.Next …

Python测试框架 pytest : 从零开始的完全指南

pytest : 从零开始的完全指南 一、pytest 简介1.1 pytest 的背景和发展历史1.2 pytest 的概念1.3 pytest 的特点1.4 测试阶段分类1.5 单元测试框架的主要功能 二、pytest 的基本使用2.1 pytest 默认测试用例2.2 全局配置文件 pytest.ini2.3 执行 pytest2.4 跳过方法2.5 pytest …

1.SQL注入-数字型

SQL注入-数字型(post) 查询1的时候发现url后面的链接没有传入1的参数。验证为post请求方式&#xff0c;仅显示用户和邮箱 通过图中的显示的字段&#xff0c;我们可以猜测传入数据库里面的语句&#xff0c;例如&#xff1a; select 字段1,字段2 from 表名 where id1; 编辑一个…

SOAP vs REST介绍

SOAP&#xff08;简单对象访问协议&#xff09; 定义&#xff1a;SOAP是一种基于XML的通信协议&#xff0c;用于在网络中交换结构化信息&#xff0c;特别是在分布式环境和需要中介&#xff08;如网关或防火墙&#xff09;的环境中。它通过HTTP、SMTP等多种传输协议传输信息&…

示例:WPF中推荐一个Diagram开源流程图控件

一、目的&#xff1a;分享一个自研的开源流程图控件 二、使用方法 1、引用Nuget包&#xff1a; 2、添加节点列表和绘图控件 <DockPanel><ItemsControl DockPanel.Dock"Left"><h:GeometryNodeData Text"节点"/></ItemsControl><…

mysql8.0其他数据库日志

概述 我们在讲解数据库事务时&#xff0c;讲过两种日志:重做日志、回滚日志。 对于线上数据库应用系统&#xff0c;突然遭遇数据库宕机怎么办?在这种情况下&#xff0c;定位宕机的原因就非常关键。可以查看数据库的错误日志。因为日志中记录了数据库运行中的诊断信息&#xff…

基于STM32的智能家用电力管理系统

目录 引言环境准备智能家用电力管理系统基础代码实现&#xff1a;实现智能家用电力管理系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;电力管理与优化问题解决方案与优化收尾与总结 1. 引言 智能家用电力管理系统通…

【漏洞复现】I doc view——任意文件读取

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 I doc view 在线文档预览是一个用于查看、编辑、管理文档的工具…

JS(JavaScript)事件处理(事件绑定)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

心理辅导平台系统

摘 要 中文本论文基于Java Web技术设计与实现了一个心理辅导平台。通过对国内外心理辅导平台发展现状的调研&#xff0c;本文分析了心理辅导平台的背景与意义&#xff0c;并提出了论文研究内容与创新点。在相关技术介绍部分&#xff0c;对Java Web、SpringBoot、B/S架构、MVC模…

云顶之弈数据网站

摘要&#xff1a;随着云顶之弈游戏的广泛流行&#xff0c;玩家对于游戏数据的查询和最新资讯的获取需求呈现出显著增长的趋势。设计一款云顶之弈数据网站&#xff0c;为玩家提供便捷、高效的数据查询和资讯浏览服务&#xff0c;能满足玩家对于游戏数据的快速查询和实时资讯获取…

已解决java.security.acl.LastOwnerException:无法移除最后一个所有者的正确解决方法,亲测有效!!!

已解决java.security.acl.LastOwnerException&#xff1a;无法移除最后一个所有者的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 1. 检查当前所有者数量 2. 添加新的所有者 3. 维…

【C语言】--数据类型和变量

&#x1f617;个人主页: 起名字真南 &#x1f619;个人专栏:【数据结构初阶】 【C语言】 目录 1 数据类型介绍1.1 字符型1.2 整形1.3 浮点型1.4 布尔型1.5 各种数据类型的长度1.5.1 sizeof 操作符1.5.2 数据类型长度1.5.3 sizeof 中表达式不计算 2 signed 和 unsigned3 数据类型…

1978Springboot在线维修预约服务应用系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot在线维修预约服务应用系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发 &#xff09;&#xff0c;系统具有完整的源代码和…

“Hello, World!“ 历史由来

布莱恩W.克尼汉&#xff08;Brian W. Kernighan&#xff09;—— Unix 和 C 语言背后的巨人 布莱恩W.克尼汉在 1942 年出生在加拿大多伦多&#xff0c;他在普林斯顿大学取得了电气工程的博士学位&#xff0c;2000 年之后取得普林斯顿大学计算机科学的教授教职。 1973 年&#…