0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Xilinx原语OSERDESE2的使用和仿真详解

C29F_xilinx_inc 来源:赛灵思 作者:赛灵思 2022-02-19 17:43 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1、介绍
随着电子行业技术的发展,特别是在传输接口的发展上,IEEE1284被 USB 接口取代,PATA被 SATA 取代,PCI被 PCI-Express 所取代,无一不证明了传统并行接口的速度已经达到一个瓶颈了,取而代之的是速度更快的串行接口,于是原本用于光纤通信的SerDes 技术成为了为高速串行接口的主流。串行接口主要应用了差分信号传输技术,具有功耗低、抗干扰强,速度快的特点,理论上串行接口的最高传输速率可达到10Gbps 以上。

2、理论
Xilinx的原语OSERDESE2是一种专用的并-串转换器,每个OSERDESE2模块都包括一个专用串行化程序用于数据和3状态控制。数据和3状态序列化程序都可以工作在SDR和DDR模式。数据串行化的位宽可以达到8:1(如果使用原语模块级联,则可以到10:1和14:1)。3状态序列化最高可达14:1,有一个专用的DDR3模式可用于支持高速内存应用程序。

OSERDESE2的框图如下:

Xilinx原语OSERDESE2的使用和仿真详解

OSERDESE2的端口说明如下:

Xilinx原语OSERDESE2的使用和仿真详解

需要例化的一些可用属性如下:

Xilinx原语OSERDESE2的使用和仿真详解

TRISTATE_WIDTH的选取见下表:

Xilinx原语OSERDESE2的使用和仿真详解

SDR、DDR输出模式下位宽的选取有如下限制:

Xilinx原语OSERDESE2的使用和仿真详解

输出数据会有一些时钟周期的延迟,具体见下表:

Xilinx原语OSERDESE2的使用和仿真详解

3、8位数据的并串转换
接下里例化一个原语来熟悉下用法,8位数据的并串转换,采用DDR输出。

官方手册的8位DDR转化时序图如下:

Xilinx原语OSERDESE2的使用和仿真详解

例化原语OSERDESE2(打开VIvado--Tools--Language Templates,搜索“OSERDESE2”,可以找到Xilinx提供的模板),与DDR、3态控制相关的端口,输入全设置为0,输出不关心,编写Verilog如下:

//------------------------------------------------------------------------
//--OSERDESE2测试模块
//------------------------------------------------------------------------

//--------------------------------------------------------
module serializer(
input clk_ser , //串行输出时钟,50M*4=200M
input clk_per , //并行输入时钟,50M
input rst_n , //复位信号,低电平有效
input [7:0] par_data , //并行输入数据

output ser_data //串行输出数据
);

//---------------------------------------------------------------
OSERDESE2 #(
.DATA_RATE_OQ ("DDR") , // 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 () , // 1-bit output: Feedback path for data
.OQ (ser_data) , // 1-bit output: Data path output
.SHIFTOUT1 () ,
.SHIFTOUT2 () ,
.TBYTEOUT () , // 1-bit output: Byte group tristate
.TFB () , // 1-bit output: 3-state control
.TQ () , // 1-bit output: 3-state control
.CLK (clk_ser) , // 1-bit input: High speed clock
.CLKDIV (clk_per) , // 1-bit input: Divided clock
.D1 (par_data[0]) ,
.D2 (par_data[1]) ,
.D3 (par_data[2]) ,
.D4 (par_data[3]) ,
.D5 (par_data[4]) ,
.D6 (par_data[5]) ,
.D7 (par_data[6]) ,
.D8 (par_data[7]) ,
.OCE (1'b1) , // 1-bit input: Output data clock enable
.RST (~rst_n) , // 1-bit input: Reset
.SHIFTIN1 () ,
.SHIFTIN2 () ,
.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

每隔20ns随机生成1个8位2进制数据作为并行输入,观察串行输出,Testbench如下:

//------------------------------------------------
//--OSERDESE2原语仿真
//------------------------------------------------

`timescale 1ns / 1ps //时间单位/精度

//----------------------------------------------------
module tb_serializer();

reg clk_per ;
reg clk_ser ;
reg rst_n ;
reg [7:0] par_data ;
wire ser_data ;

//----------------------------------------------------
initial begin
clk_per clk_ser rst_n par_data #180
rst_n end
//----------------------------------------------------------
always #10 clk_per = ~clk_per;
always #2.5 clk_ser = ~clk_ser;

always #20 par_data

//----------------------------------------------------
serializer serializer_inst(
.clk_per (clk_per) ,
.clk_ser (clk_ser) ,
.rst_n (rst_n) ,
.par_data (par_data) ,
.ser_data (ser_data)
);

endmodule

仿真结果如下:

Xilinx原语OSERDESE2的使用和仿真详解

可以看出:

在第1条蓝线处,是复位后并行时钟的第1个上升沿,此时采集到的数据为0000_0001
在第2条蓝线处,也就是4个串行时钟的延迟后,串行输出开始有数据,分别为1-0-0-0-0-0-0-0,可以看出是第1个上升沿采集到的数据输出(0000_0001从低位往高位输出)
在第2条蓝线处,是复位后并行时钟的第2个上升沿,此时采集到的数据为0000_1101
在第3条蓝线处,也就是4个串行时钟的延迟后,串行输出开始有数据,分别为1-0-1-1-0-0-0-0,可以看出是第2个上升沿采集到的数据输出(0000_1101从低位往高位输出)

其他与上述相同,符合官方给出的时序图

4、10位数据的并串转换(级联)
OSERDESE2原语还支持例化两次原语级联,以便实现10位、14位位宽的串行化转换。下图是10位位宽的级联框图,其中一个设置位MASTER,另一个设置为SLAVE,通过SHIFTIN与SHIFTOUT连接。

需要注意:数据的输出从MASTER输出,数据的高位输入到SLAVE模块时,需要从D3开始(只能使用D3~D8)

Xilinx原语OSERDESE2的使用和仿真详解

接下里例化一个原语来实现10位数据的并串转换,采用DDR输出。

例化2个原语OSERDESE2级联(打开VIvado--Tools--Language Templates,搜索“OSERDESE2”,可以找到Xilinx提供的模板),与DDR、3态控制相关的端口,输入全设置为0,输出不关心,编写Verilog如下:

//------------------------------------------------------------------------
//--OSERDESE2测试模块
//------------------------------------------------------------------------

//--------------------------------------------------------
module serializer(
input clk_ser , //串行输出时钟,50M*5=250M
input clk_per , //并行输入时钟,50M
input rst_n , //复位信号,低电平有效
input [9:0] par_data , //并行输入数据,位宽10

output ser_data //串行输出数据
);
//------------------------------------------------------------------
wire shift1; //级联线1
wire shift2; //级联线2

//------------------------------------------------------------------

//例化主模块MASTER
OSERDESE2 #(
.DATA_RATE_OQ ("DDR") , // DDR, SDR
.DATA_RATE_TQ ("SDR") , // 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_inst1 (
.OFB () , // 1-bit output: Feedback path for data
.OQ (ser_data) , // 1-bit output: Data path output
.SHIFTOUT1 () ,
.SHIFTOUT2 () ,
.TBYTEOUT () , // 1-bit output: Byte group tristate
.TFB () , // 1-bit output: 3-state control
.TQ () , // 1-bit output: 3-state control
.CLK (clk_ser) , // 1-bit input: High speed clock
.CLKDIV (clk_per) , // 1-bit input: Divided clock
.D1 (par_data[0]) ,
.D2 (par_data[1]) ,
.D3 (par_data[2]) ,
.D4 (par_data[3]) ,
.D5 (par_data[4]) ,
.D6 (par_data[5]) ,
.D7 (par_data[6]) ,
.D8 (par_data[7]) ,
.OCE (1'b1) , // 1-bit input: Output data clock enable
.RST (~rst_n) , // 1-bit input: Reset
.SHIFTIN1 (shift1) ,
.SHIFTIN2 (shift2) ,
.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
);

//例化从模块SLAVE
OSERDESE2 #(
.DATA_RATE_OQ ("DDR") , // DDR, SDR
.DATA_RATE_TQ ("SDR") , // 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_inst2 (
.OFB () , // 1-bit output: Feedback path for data
.OQ () , // 1-bit output: Data path output
.SHIFTOUT1 (shift1) ,
.SHIFTOUT2 (shift2) ,
.TBYTEOUT () , // 1-bit output: Byte group tristate
.TFB () , // 1-bit output: 3-state control
.TQ () , // 1-bit output: 3-state control
.CLK (clk_ser) , // 1-bit input: High speed clock
.CLKDIV (clk_per) , // 1-bit input: Divided clock
.D1 () ,
.D2 () ,
.D3 (par_data[8]) ,
.D4 (par_data[9]) ,
.D5 () ,
.D6 () ,
.D7 () ,
.D8 () ,
.OCE (1'b1) , // 1-bit input: Output data clock enable
.RST (~rst_n) , // 1-bit input: Reset
.SHIFTIN1 () ,
.SHIFTIN2 () ,
.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

每隔20ns随机生成1个10位2进制数据作为并行输入,观察串行输出,Testbench如下:

//------------------------------------------------
//--OSERDESE2原语仿真
//------------------------------------------------

`timescale 1ns / 1ps //时间单位/精度

//----------------------------------------------------
module tb_serializer();

reg clk_per ;
reg clk_ser ;
reg rst_n ;
reg [9:0] par_data ;
wire ser_data ;

//----------------------------------------------------
initial begin
clk_per clk_ser rst_n par_data #180
rst_n end
//----------------------------------------------------------
always #10 clk_per = ~clk_per;
always #2 clk_ser = ~clk_ser;

always #20 par_data

//----------------------------------------------------
serializer serializer_inst(
.clk_per (clk_per) ,
.clk_ser (clk_ser) ,
.rst_n (rst_n) ,
.par_data (par_data) ,
.ser_data (ser_data)
);

endmodule

仿真结果如下:

Xilinx原语OSERDESE2的使用和仿真详解

可以看出:

在第1条蓝线处,是复位后并行时钟的第1个上升沿,此时采集到的数据为11000_00001
在第2条蓝线处,也就是4个串行时钟的延迟后,串行输出开始有数据,分别为1-0-0-0-0-0-0-0-1-1,可以看出是第1个上升沿采集到的数据输出(11000_00001从低位往高位输出)
在第2条蓝线处,是复位后并行时钟的第2个上升沿,此时采集到的数据为01000_01101
在第3条蓝线处,也就是4个串行时钟的延迟后,串行输出开始有数据,分别为1-0-1-1-0-0-0-0-1-0,可以看出是第2个上升沿采集到的数据输出(01000_01101从低位往高位输出)
其他与上述相同。

这里官方手册没有给出10bitDDR输出的时序图,输出延迟给出的表如下图:

Xilinx原语OSERDESE2的使用和仿真详解

可以看到这里10:1的输出延迟应该是5个时钟周期,但是我上面仿真的却是4个时钟周期,一开始我还以为是哪里错了,搞得我重复仿真了好几遍,后面又看了一下手册,终于在延迟表的下面发现了这句话(上图标红):CLK、CLKDIV的时钟沿通常不是相位一致的。当这两个时钟的时钟沿相位一致时,延迟会存在一个周期的差异。

这样的话,仿真结果应该是没有问题。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 转换器
    +关注

    关注

    27

    文章

    9447

    浏览量

    156948
  • Xilinx
    +关注

    关注

    73

    文章

    2206

    浏览量

    131866
  • 仿真
    +关注

    关注

    55

    文章

    4535

    浏览量

    138659
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Xilinx FPGA中的混合模式时钟管理器MMCME2_ADV详解

    在 FPGA 的浩瀚宇宙中,时钟系统不仅是驱动逻辑运转的“心脏”,更是决定系统稳定性与性能上限的“指挥棒”。对于 Xilinx 7 系列 FPGA 开发者而言,如果仅满足于使用 Clocking Wizard IP 核点点鼠标,往往会在面对复杂的时序收敛、动态频点切换或低抖动需求时束手无策。
    的头像 发表于 04-10 11:20 182次阅读
    <b class='flag-5'>Xilinx</b> FPGA中的混合模式时钟管理器MMCME<b class='flag-5'>2</b>_ADV<b class='flag-5'>详解</b>

    Xilinx器件封装全方位指南:设计与应用要点解析

    Xilinx器件封装全方位指南:设计与应用要点解析 在电子设计领域,器件封装犹如电子设备的“外衣”,不仅影响着器件的性能,还对整个系统的稳定性和可靠性起着关键作用。Xilinx作为FPGA领域的领军
    的头像 发表于 03-27 11:00 169次阅读

    3DGS技术详解(二):视觉重建到物理仿真,3DGS如何走向工程应用?

    ▍文章来源于康谋自动驾驶 3DGS与4DGS的核心应用实践与技术突破!01引言在《3DGS技术详解(一):3DGS如何融合动态天气与光照等环境因素?》文章中,我们系统梳理了3D高斯泼溅(3DGS
    的头像 发表于 03-20 17:37 917次阅读
    3DGS技术<b class='flag-5'>详解</b>(二):视觉重建到物理<b class='flag-5'>仿真</b>,3DGS如何走向工程应用?

    Xilinx FPGA输入延迟原语介绍

    在高速接口设计中,时序收敛往往是工程师面临的最大“噩梦”。当数据传输速率突破 800Mbps 时,微小的 PCB 走线差异都足以让系统崩溃。本文将深度剖析 Xilinx 7 系列(IDELAYE2)与 UltraScale 系列(IDELAYE3)的底层原理,带你彻底攻克
    的头像 发表于 03-11 09:29 1620次阅读
    <b class='flag-5'>Xilinx</b> FPGA输入延迟<b class='flag-5'>原语</b>介绍

    RDMA设计46:RoCE v2原语功能:单边语义

    本博文主要交流设计思路,在本博客已给出相关博文约170篇,希望对初学者有用。注意这里只是抛砖引玉,切莫认为参考这就可以完成商用IP设计。 续上,为便于查看,给出表1部分表1 RoCE v2原语功能
    发表于 03-01 23:14

    Xilinx FPGA中IDELAYCTRL参考时钟控制模块的使用

    IDELAYCTRL 是 Xilinx FPGA(特别是支持高速 I/O 的系列,如 Virtex-5/6/7、Kintex-7、Artix-7、Spartan-6/7 等)中用于管理和校准输入延迟模块(IDELAYE2/IDELAYE3)的必须存在的参考时钟控制模块。
    的头像 发表于 02-26 14:41 4687次阅读

    RDMA设计45:RoCE v2 原语功能验证与分析2

    本博文主要交流设计思路,在本博客已给出相关博文约170篇,希望对初学者有用。注意这里只是抛砖引玉,切莫认为参考这就可以完成商用IP设计。续上,为便于查看,给出表1部分 表1 RoCE v2原语功能
    发表于 02-26 07:52

    RDMA设计44:RoCE v2原语功能验证与分析

    它是RoCE v2协议进行信息及数据交换的核心机制,也是DUT需要实现的核心机制之一,对该功能的仿真验证需要考虑指令的提交数据包的组装及发送、数据的DMA处理等。
    的头像 发表于 02-25 09:26 308次阅读
    RDMA设计44:RoCE v<b class='flag-5'>2</b><b class='flag-5'>原语</b>功能验证与分析

    一文详解SystemC仿真库的编译

    AMD Vivado 设计套件以文件和库的形式提供仿真模型。仿真库包含器件和 IP 的行为和时序模型。编译后的库可供多个设计项目使用。用户必须在设计仿真之前通过名为 compile_simlib 的实用程序编译这些文件,以便为目
    的头像 发表于 12-12 15:08 5037次阅读
    一文<b class='flag-5'>详解</b>SystemC<b class='flag-5'>仿真</b>库的编译

    Xilinx FPGA串行通信协议介绍

    Xilinx FPGA因其高性能和低延迟,常用于串行通信接口设计。本文深入分析了Aurora、PCI Express和Serial RapidIO这三种在Xilinx系统设计中关键的串行通信协议。介绍了它们的特性、优势和应用场景,以及如何在不同需求下选择合适的协议。
    的头像 发表于 11-14 15:02 2794次阅读
    <b class='flag-5'>Xilinx</b> FPGA串行通信协议介绍

    详解SOA的增益谱仿真

    本文利用简化的载流子速率方程,以及二分法迭代,仿真得到了外部注入(电流及输入光功率)与增益的关系。
    的头像 发表于 11-08 09:58 883次阅读
    <b class='flag-5'>详解</b>SOA的增益谱<b class='flag-5'>仿真</b>

    一文详解xilinx 7系列FPGA配置技巧

    本文旨在通过讲解不同模式的原理图连接方式,进而配置用到引脚的含义(手册上相关引脚含义有四、五页,通过本文理解基本上能够记住所有引脚含义以及使用场景),熟悉xilinx 7系列配置流程,以及设计原理图时需要注意的一些事项,比如flash与FPGA的上电时序。
    的头像 发表于 08-30 14:35 1.1w次阅读
    一文<b class='flag-5'>详解</b><b class='flag-5'>xilinx</b> 7系列FPGA配置技巧

    vivado仿真时GSR信号的影响

    利用vivado进行设计xilinx FPGA时,写完设计代码和仿真代码后,点击run simulation(启动modelsim进行仿真)。
    的头像 发表于 08-30 14:22 1558次阅读
    vivado<b class='flag-5'>仿真</b>时GSR信号的影响

    详解ADC电路的静态仿真和动态仿真

    ADC电路主要存在静态仿真和动态仿真两类仿真,针对两种不同的仿真,我们存在不同的输入信号和不同的数据采样,因此静态仿真和动态
    的头像 发表于 06-05 10:19 2284次阅读
    <b class='flag-5'>详解</b>ADC电路的静态<b class='flag-5'>仿真</b>和动态<b class='flag-5'>仿真</b>

    基于AD9613与Xilinx MPSoC平台的高速AD/DA案例分享

    本文主要介绍基于Xilinx UltraScale+MPSoC XCZU7EV的高速AD采集与高速DA输出案例
    的头像 发表于 06-03 14:22 1121次阅读
    基于AD9613与<b class='flag-5'>Xilinx</b> MPSoC平台的高速AD/DA案例分享