ISERDESE2 级联

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/06/25 11:01:58
// Design Name: 
// Module Name: iserdes2_test
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module iserdes2_test(
    input wire clk,
    input wire rst_n
    );
    
    wire clk_200M;
    wire clk_100M;
    wire clk_20M;

  clk_wiz_0 clk_wiz_0_u
       (
        // Clock out ports
        .clk_200M(clk_200M),     // output clk_200M
        .clk_100M(clk_100M),     // output clk_100M
        .clk_20M(clk_20M),     // output clk_20M
        // Status and control signals
        .resetn(rst_n), // input resetn
        .locked( ),       // output locked
       // Clock in ports
        .clk_in1(clk));      // input clk_in1
// *************************************************************************** //
    parameter data_in = 10'h06E;
    
    wire O;
    wire SHIFTOUT1;
    wire SHIFTOUT2;
    wire [9:0] Q;
    wire Q8,Q7,Q6,Q5,Q4,Q3,Q2,Q1;
    wire Q16,Q15,Q14,Q13,Q12,Q11,Q10,Q9;
    reg D;
    reg BITSLIP;
    
    assign Q = {Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8,Q11,Q12};
    
    reg [4:0] i;
    always @(posedge clk_200M)begin
        if(~rst_n)
            i <= 0;
        else if(i == 'd9)
            i <= 0;
        else
            i <= i + 1;
    end
    
    always @(posedge clk_200M)begin
        if(~rst_n)
            D <= 0;
        else
            D <= data_in[i];
    end
// *************************************************************************** //
      
         ISERDESE2 #(
            .DATA_RATE("DDR"),           // DDR, SDR
            .DATA_WIDTH(10),              // 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("FALSE"),          // 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_master (
            .O(O),                       // 1-bit output: Combinatorial output
            // Q1 - Q8: 1-bit (each) output: Registered data outputs
            .Q1(Q1),
            .Q2(Q2),
            .Q3(Q3),
            .Q4(Q4),
            .Q5(Q5),
            .Q6(Q6),
            .Q7(Q7),
            .Q8(Q8),
            // SHIFTOUT1, SHIFTOUT2: 1-bit (each) output: Data width expansion output ports
            .SHIFTOUT1(SHIFTOUT1),
            .SHIFTOUT2(SHIFTOUT2),
            .BITSLIP(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(clk_100M),                   // 1-bit input: High-speed clock
            .CLKB(~clk_100M),                 // 1-bit input: High-speed secondary clock
            .CLKDIV(clk_20M),             // 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(D),                       // 1-bit input: Data input
            .DDLY(1'b0),                 // 1-bit input: Serial data from IDELAYE2
            .OFB(1'b0),                   // 1-bit input: Data feedback from OSERDESE2
            .OCLKB(1'b0),               // 1-bit input: High speed negative edge output clock
            .RST(~rst_n),                   // 1-bit input: Active high asynchronous reset
            // SHIFTIN1, SHIFTIN2: 1-bit (each) input: Data width expansion input ports
            .SHIFTIN1(),
            .SHIFTIN2()
         );
// *********************************************************************************************************** //
    ISERDESE2 #(
       .DATA_RATE("DDR"),           // DDR, SDR
       .DATA_WIDTH(10),              // 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("FALSE"),          // Select OFB path (FALSE, TRUE)
       .SERDES_MODE("SLAVE"),      // 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_slave (
       .O(),                       // 1-bit output: Combinatorial output
       // Q1 - Q8: 1-bit (each) output: Registered data outputs
       .Q1(Q9),
       .Q2(Q10),
       .Q3(Q11),
       .Q4(Q12),
       .Q5(Q13),
       .Q6(Q14),
       .Q7(Q15),
       .Q8(Q16),
       // SHIFTOUT1, SHIFTOUT2: 1-bit (each) output: Data width expansion output ports
       .SHIFTOUT1( ),
       .SHIFTOUT2( ),
       .BITSLIP(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(clk_100M),                   // 1-bit input: High-speed clock
       .CLKB(~clk_100M),                 // 1-bit input: High-speed secondary clock
       .CLKDIV(clk_20M),             // 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(1'b0),                   // 1-bit input: Data feedback from OSERDESE2
       .OCLKB(1'b0),               // 1-bit input: High speed negative edge output clock
       .RST(~rst_n),                   // 1-bit input: Active high asynchronous reset
       // SHIFTIN1, SHIFTIN2: 1-bit (each) input: Data width expansion input ports
       .SHIFTIN1(SHIFTOUT1),
       .SHIFTIN2(SHIFTOUT2)
    );

    reg [3:0] bitslip_cnt;
    reg [3:0] delay_cnt;
    parameter   IDLE_BITSLIP = 'd0,
                  PULL_BITSLIP = 'd1,
                  DELAY_0       = 'd2;
                 
    reg [3:0] state_bitslip;
    always @(posedge clk_20M)begin
        if(~rst_n)begin
            state_bitslip <= IDLE_BITSLIP;
            BITSLIP <= 1'b0;
            bitslip_cnt <= 'd0;
            delay_cnt <= 'd0;
        end
        else begin
            case(state_bitslip)
                IDLE_BITSLIP : begin
                    delay_cnt <= 'd0;
                    if(bitslip_cnt < 'd9)
                        state_bitslip <= PULL_BITSLIP;
                    else
                        state_bitslip <= IDLE_BITSLIP;
                end
                PULL_BITSLIP : begin
                    BITSLIP <= 1'b1;
                    bitslip_cnt <= bitslip_cnt + 1'b1;
                    state_bitslip <= DELAY_0;
                end
                DELAY_0 : begin
                    BITSLIP <= 1'b0;
                    delay_cnt <= delay_cnt + 1'b1;
                    if(delay_cnt == 'd1)
                        state_bitslip <= IDLE_BITSLIP;
                    else
                        state_bitslip <= DELAY_0;
                end
                default : ;
            endcase
        end
    end
          
    
    
endmodule

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/06/25 11:04:31
// Design Name: 
// Module Name: tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//



module tb();
    reg clk,rst_n;
    
    initial begin
        clk = 0;
        rst_n = 0;
        #200
        rst_n = 1;
    end
    
    always #(10) clk = ~clk;
    
    iserdes2_test iserdes2_test_u(
        .clk(clk),
        .rst_n(rst_n)
    );

endmodule

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值