ZYNQ7000学习——OSERDESE2原语学习

ZYNQ学习——OSERDESE2原语

OSERDESE2原语端口

在这里插入图片描述

OSERDESE2 Attributes

在这里插入图片描述
在这里插入图片描述

时钟

CLK:高速串行时钟。
CLKDIV:并行时钟,用于并串转换;由CLK分频而来。
二者需相位相同。
唯一有效的时钟分配方式:
1、CLK driven by BUFIO, CLKDIV driven by BUFR;
2、CLK and CLKDIV driven by CLKOUT[0:6] of the same MMCM or PLL。

复位

OSERDESE2复位为高电平有效(若用PLL的locked信号作为复位时需加反相)。

数据线

输入

D1~D8:并行数据线,D1为发送的第一位。(可通过级联第二级slave模式的OSERDESE2原语来拓展输入数据宽度)

输出

OQ:串行数据输出端口,该端口无法驱动ODELAYE2。
OFB:串行数据输出端口,用于驱动ODELAYE2原语或发送反馈到ISERDESE2。
OP与OFB输出波形相同。

TQ:连接三态并串转换器的输出于IOB的三态输入。
TFB:

拓展输入数据位宽

  • 仅可在DDR模式下,可将输出数据位宽提升至10:1或14:1。
  • 需要将MASTER的 SHIFTOUT 端口连接至SLAVE的 SHIFTIN 端口。
  • 输出必须通过buffer转成差分输出,否则将不能拓展。
  • 不能用补充性的单端电平标准,eg: DIFF_HSTL and DIFF_SST
Data WidthSlave Inputs Used
10D3–D4
14D3–D8

三态

若工程无需使用到三态控制,则相关的控制信号(TCE、TBYTEIN、T1~T4)置0即可。

输入到输出延迟

延迟定义:
CLKDIV上升沿输入数据进入到OSERDESE2,到OQ输出串行数据流的第一位。
在这里插入图片描述
注:CLKDIV上沿采样数据,输出延迟单位为CLK周期。

OSERDESE2使用示例

代码

module OSERDESE2_test (
    // input;
    input           clk,

    input [7:0]     data,

    // output;
    output          data_out,
    output          data_out_test,
    output          data_out_tri_state
);
    // wire            TFB;
    // wire            TQ;

    // wire            clk_pll;
    wire            clk_50M;    //
    wire            rst_n;

    OSERDESE2 #(
    .DATA_RATE_OQ   ("DDR"),   // DDR, SDR
    .DATA_RATE_TQ   ("DDR"),   // DDR, BUF, SDR
    .DATA_WIDTH     (8),         // Parallel data width (2-8,10,14)
    .SERDES_MODE    ("MASTER"), // MASTER, SLAVE
    .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            (data_out_test),             // 1-bit output: Feedback path for data
    .OQ             (data_out),               // 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             (data_out_tri_state),               // 1-bit output: 3-state control
    .CLK            (clk_200M),             // 1-bit input: High speed clock
    .CLKDIV         (clk_50M),       // 1-bit input: Divided clock
    // D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each)
    .D1             (data[0]),
    .D2             (data[1]),
    .D3             (data[2]),
    .D4             (data[3]),
    .D5             (data[4]),
    .D6             (data[5]),
    .D7             (data[6]),
    .D8             (data[7]),
    .OCE            (1'b1),             // 1-bit input: Output data clock enable
    .RST            (~rst_n),             // 由于使用锁相环,因此需将复位信号反相
    // SHIFTIN1 / SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each)
    .SHIFTIN1       (1'b0),
    .SHIFTIN2       (1'b0),
    // 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
    );

// PLL;
    clk_wiz_0 instance_name
    (
    // Clock out ports
    .clk_50M        (clk_50M),     // output clk_50M
    .clk_200M       (clk_200M),     // output clk_200M
    // Status and control signals
    .locked         (rst_n),       // output locked
    // Clock in ports
    .clk_in         (clk)
    );      // input clk_in

endmodule

TB

`timescale 1ns/1ns

module tb_OSERDESE2_test ();
    reg           clk  =   1'b0;
    always #5     clk  =   ~clk;

    reg [7:0]     data =   8'b0;

    wire          data_out;
    wire          data_out_test;
    wire          data_out_tri_state;

    task delay_clks;
        input  [7:0]  number;
        begin 
            repeat(number) @(posedge clk);
            #1;
        end
    endtask

    initial begin
        delay_clks(100);
        data  =  8'b1010_1010;
        delay_clks(10);
        data  =  8'b1001_0011;
        delay_clks(10);
        data  =  8'b1111_1111;
        delay_clks(10);
        data  =  8'b0;
    end

    OSERDESE2_test U_OSERDESE2_TEST (
    .clk                (clk),
    .data               (data),
    .data_out           (data_out),
    .data_out_test      (data_out_test),
    .data_out_tri_state (data_out_tri_state)
    );

endmodule

仿真结果

在这里插入图片描述
1时刻:clk_50M即CLKDIV上升沿采样输入数据。
2时刻:由查表可知,DDR、8:1时输入到输出延迟为4个CLK周期,即4个clk_200M周期,因此在2时刻开始输出串行化的数据。而输出数据由D1即data[0]开始,因此数据实际输出为01010101,后续输出以此类推。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值