• 原语:串并转换器


    串并转换器OSERDESE2

            可被Select IO IP核调用。 

    IP配置方法:(待续)

            OSERDESE2允许DDR功能

    参考:

    FPGA原语学习与整理第二弹,OSERDESE2串并转换器 - 知乎 (zhihu.com)

    正点原子。

            ISERDESE2原语和OSERDESE2原语是串并转换器,他的的功能都是实现串行数据和并行数据之间的转换。

            OSERDESE2原语将并行数据转换为串行数据,减少数据传输端口数量的同时也提高了频率,将低速数据转换为高速数据,方便传输。

            ISERDESE2原语是将串行数据转换为并行数据,将高速信号转换为低速数据,方便处理。和前面一样,赛灵思官方也给我们提供出来了相应的IP核SelectIO InterfaceWizard,对这些原语进行了封装,提供图形化界面方便使用,我们可以从这些IP来认识这些原语。

            OSERDESE2原语包含两个部分,一部分是数据3态控制器,一部分是串并数据转换控制器。

            因此我们可以把它们端口分成三大类,一部分是关于三态控制,一部分是关于时钟复位信号,一部分串并数据转换输入输出。在时钟复位信号中,CLK是串行数据时钟,是高速时钟,CLKDIV是并行数据时钟,是低速时钟。在串并数据转换输入输出部分中,D1~D8是并行数据输入,

            一个OSERDESE2最高支持8:1串并转换,想要达到更高速率转换,必须采用级联两个OSERDESE2的方式,这个后面重点讲述。OQ是串行数据输出端口。OFB也是输出端口,但是他有特殊的作用,一个是与ISERDESE2上的OFB引脚相连,作为反馈端口,一个是与ODELAYE2相连,作延迟输出使用,这个端口在正常使用过程一般悬空即可。OCE是高速时钟CLK的使能信号,可以一直置高电平,保证高速时钟一直使能。

    两个OSERDESE2的串联方法

             DDR模式下,两个OSERDESE2原语串联方式,其中并行输入数据高2位会传入OSERDESE2原语(slave)D3-D4引脚,而OSERDESE2原语(slave)的SHIFTOUT1和SHIFTOUT2会连到OSERDESE2原语(Master)的SHIFTIN1和SHIFTIN2。

    例程:代码来自正点原子 

     

            DATA_RATE_OQ是定义串行数据是以DDR的方式传输还是以SDR的方式传输,        

            DATA_WIDTH是定义并行数据的位宽,

            SERDES_MODE是在当需要两个OSERDESE2级联时,可以用于辨识那个是MASTER,那个是SLAVE。

            而DATA_RATE_TQ,TRISTATE_WIDTH是关于三态控制的,我们可以不用管。最后两个也是我们大多数情况下用不到的,默认FALSE就好。 

    1. //例化OSERDESE2原语,实现并串转换,Master模式
    2. OSERDESE2 #(
    3. .DATA_RATE_OQ ("DDR"), // 设置双倍数据速率
    4. .DATA_RATE_TQ ("SDR"), // DDR, BUF, SDR
    5. .DATA_WIDTH (10), // 输入的并行数据宽度为10bit
    6. .SERDES_MODE ("MASTER"), // 设置为Master,用于10bit宽度扩展
    7. .TBYTE_CTL ("FALSE"), // Enable tristate byte operation (FALSE, TRUE)
    8. .TBYTE_SRC ("FALSE"), // Tristate byte source (FALSE, TRUE)
    9. .TRISTATE_WIDTH (1) // 3-state converter width (1,4)
    10. )
    11. OSERDESE2_Master (
    12. .CLK (serial_clk_5x), // 串行数据时钟,5倍时钟频率
    13. .CLKDIV (paralell_clk), // 并行数据时钟
    14. .RST (reset), // 1-bit input: Reset
    15. .OCE (1'b1), // 1-bit input: Output data clock enable
    16. .OQ (serial_data_out), // 串行输出数据
    17. .D1 (paralell_data[0]), // D1 - D8: 并行数据输入
    18. .D2 (paralell_data[1]),
    19. .D3 (paralell_data[2]),
    20. .D4 (paralell_data[3]),
    21. .D5 (paralell_data[4]),
    22. .D6 (paralell_data[5]),
    23. .D7 (paralell_data[6]),
    24. .D8 (paralell_data[7]),
    25. .SHIFTIN1 (cascade1), // SHIFTIN1 用于位宽扩展
    26. .SHIFTIN2 (cascade2), // SHIFTIN2
    27. .SHIFTOUT1 (), // SHIFTOUT1: 用于位宽扩展
    28. .SHIFTOUT2 (), // SHIFTOUT2
    29. .OFB (), // 以下是未使用信号
    30. .T1 (1'b0),
    31. .T2 (1'b0),
    32. .T3 (1'b0),
    33. .T4 (1'b0),
    34. .TBYTEIN (1'b0),
    35. .TCE (1'b0),
    36. .TBYTEOUT (),
    37. .TFB (),
    38. .TQ ()
    39. );
    40. //例化OSERDESE2原语,实现并串转换,Slave模式
    41. OSERDESE2 #(
    42. .DATA_RATE_OQ ("DDR"), // 设置双倍数据速率
    43. .DATA_RATE_TQ ("SDR"), // DDR, BUF, SDR
    44. .DATA_WIDTH (10), // 输入的并行数据宽度为10bit
    45. .SERDES_MODE ("SLAVE"), // 设置为Slave,用于10bit宽度扩展
    46. .TBYTE_CTL ("FALSE"), // Enable tristate byte operation (FALSE, TRUE)
    47. .TBYTE_SRC ("FALSE"), // Tristate byte source (FALSE, TRUE)
    48. .TRISTATE_WIDTH (1) // 3-state converter width (1,4)
    49. )
    50. OSERDESE2_Slave (
    51. .CLK (serial_clk_5x), // 串行数据时钟,5倍时钟频率
    52. .CLKDIV (paralell_clk), // 并行数据时钟
    53. .RST (reset), // 1-bit input: Reset
    54. .OCE (1'b1), // 1-bit input: Output data clock enable
    55. .OQ (), // 串行输出数据
    56. .D1 (1'b0), // D1 - D8: 并行数据输入
    57. .D2 (1'b0),
    58. .D3 (paralell_data[8]),
    59. .D4 (paralell_data[9]),
    60. .D5 (1'b0),
    61. .D6 (1'b0),
    62. .D7 (1'b0),
    63. .D8 (1'b0),
    64. .SHIFTIN1 (), // SHIFTIN1 用于位宽扩展
    65. .SHIFTIN2 (), // SHIFTIN2
    66. .SHIFTOUT1 (cascade1), // SHIFTOUT1: 用于位宽扩展
    67. .SHIFTOUT2 (cascade2), // SHIFTOUT2
    68. .OFB (), // 以下是未使用信号
    69. .T1 (1'b0),
    70. .T2 (1'b0),
    71. .T3 (1'b0),
    72. .T4 (1'b0),
    73. .TBYTEIN (1'b0),
    74. .TCE (1'b0),
    75. .TBYTEOUT (),
    76. .TFB (),
    77. .TQ ()
    78. );

    并串转换器ISERDES

    例程来自Select IO ip内部 

    (LVDS差分信号简单处理)4. 使用ISERDES接收高速串行数据 - 知乎 (zhihu.com)

    1. ISERDESE2
    2. # (
    3. .DATA_RATE ("DDR"),
    4. .DATA_WIDTH (8),
    5. .INTERFACE_TYPE ("NETWORKING"),
    6. .DYN_CLKDIV_INV_EN ("FALSE"),
    7. .DYN_CLK_INV_EN ("FALSE"),
    8. .NUM_CE (2),
    9. .OFB_USED ("FALSE"),
    10. .IOBDELAY ("NONE"), // Use input at D to output the data on Q
    11. .SERDES_MODE ("MASTER"))
    12. iserdese2_master_lane0 (
    13. .Q1 ( iserdes_q [0][7] ),
    14. .Q2 ( iserdes_q [0][6] ),
    15. .Q3 ( iserdes_q [0][5] ),
    16. .Q4 ( iserdes_q [0][4] ),
    17. .Q5 ( iserdes_q [0][3] ),
    18. .Q6 ( iserdes_q [0][2] ),
    19. .Q7 ( iserdes_q [0][1] ),
    20. .Q8 ( iserdes_q [0][0] ),
    21. .SHIFTOUT1 ( ),
    22. .SHIFTOUT2 ( ),
    23. .BITSLIP ( Bitslip[0]), // 1-bit Invoke Bitslip. This can be used with any DATA_WIDTH, cascaded or not.
    24. // The amount of BITSLIP is fixed by the DATA_WIDTH selection.
    25. .CE1 ( clock_enable ), // 1-bit Clock enable input
    26. .CE2 ( clock_enable ), // 1-bit Clock enable input
    27. .CLK ( Buff_Clk ), // Fast source synchronous clock driven by BUFIO
    28. .CLKB ( Buff_Clk_inv ), // Locally inverted fast
    29. .CLKDIV ( Bufd_Slow_Clk ), // Slow clock from BUFR.
    30. .CLKDIVP ( 1'b0 ),
    31. .D ( Mipi_IBUFD_Data_delay[0]), // 1-bit Input signal from IOB
    32. .DDLY ( 1'b0 ), // 1-bit Input from Input Delay component
    33. .RST ( !Rst_n ), // 1-bit Asynchronous reset only.
    34. .SHIFTIN1 ( 1'b0 ),
    35. .SHIFTIN2 ( 1'b0 ),
    36. // unused connections
    37. .DYNCLKDIVSEL ( 1'b0 ),
    38. .DYNCLKSEL ( 1'b0 ),
    39. .OFB ( 1'b0 ),
    40. .OCLK ( 1'b0 ),
    41. .OCLKB ( 1'b0 ),
    42. .O ( )); // unregistered output of ISERDESE1

     IP配置方法:(待续)

  • 相关阅读:
    2023年【煤炭生产经营单位(安全生产管理人员)】证考试及煤炭生产经营单位(安全生产管理人员)模拟考试题库
    Go中为什么json.Unmarshal为什么需要指向map的指针?
    Python练习题:实现三数之和
    springboot下的mybatis打印sql语句
    基于微信小程序的新冠疫苗预约系统 uinapp
    Mybatis动态xml中sql语句拼接参数#和$使用
    Java开发:JVM篇-类加载内存分析
    录制完成的长视频如何快速分割为3个相同的视频片段
    i.MX 6ULL 驱动开发 二十三:UART
    Netty概述及Hello word入门
  • 原文地址:https://blog.csdn.net/NoNoUnknow/article/details/134140181