[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA基础篇连载-37 LVDS信号环路测试

文档创建者:FPGA课程
浏览次数:336
最后更新:2024-09-07
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-FPGA部分 » 2_FPGA实验篇(仅旗舰) » 1-FPGA基础入门实验
本帖最后由 FPGA课程 于 2024-9-7 14:39 编辑

​ 软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
实验平台:米联客-MLK-H3-CZ08-7100开发板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!



1概述
LVDS(Low Voltage Differential Signalin)是一种低振幅差分信号技术。它使用幅度非常低的信号(约350mV)通过一对差分PCB走线或平衡电缆传输数据。大部分高速数据传输中,都会用到LVDS传输。
目前FPGA开发板资料中涉及LVDS通信的方案并不多,但是LVDS实际上有大量的应用,特别是在高速ADC,高分辨率摄像头,液晶屏显示技术等应用领域。所以掌握LVDS通信也是我们FPGA开发者的必备基本技能。本文首先简要介绍一些XILINX FPGA的LVDS解决方案,然后再通过一个简单的环路测试对LVDS通信做一个简单的验证测试。
2XILINX FPGA差分信号解决方案
2.1 IBUFDS差分输入
c3ace78c205943559f43ca9b6e831510.jpg
对应原语
  1.    IBUFDS #(
  2.       .DIFF_TERM("FALSE"),       // "FALSE"=不使用内部终端电阻,"TRUE"=使用内部终端电阻
  3.       .IBUF_LOW_PWR("TRUE"),     // "TRUE"=高性能,"FALSE" =低功耗
  4.       .IOSTANDARD("DEFAULT")     // 设置输入电平属性
  5.    ) IBUFDS_inst (
  6.       .O(O),  // IO buffer输出
  7.       .I(I),  // 差分输入P端
  8.       .IB(IB) // 差分输入N端
  9.    );
复制代码

2.2 OBUFDS差分输出
e7b2af1bbc1048de9402b94829eca0b5.jpg
对应原语
  1.    OBUFDS #(
  2.       .IOSTANDARD("DEFAULT"), // IO电平属性
  3.       .SLEW("SLOW")           // IO的压摆率,"SLOW"或者"FAST"
  4.                                 // FAST压摆率可以满足高性能需求,例如高速存储器接口,但是,如果不能恰当设计(端接匹配,传输线阻抗控制和串扰耦合),更高的压摆率输出会导致信号反射或者产生噪声问题。
  5.    ) OBUFDS_inst (
  6.       .O(O),     // 差分输出P端
  7.       .OB(OB),   // 差分输出N端
  8.       .I(I)      // 内部输入信号
  9.    );
复制代码

2.3 IOBUFDS双向差分IO
2ea34c7755b5411da2b09c1abe2ef87a.jpg
对应原语
  1. IOBUFDS #(
  2.       .DIFF_TERM("FALSE"),     // "FALSE"=不使用内部终端电阻,"TRUE"=使用内部终端电阻
  3.       .IBUF_LOW_PWR("TRUE"),   // "TRUE"=低功耗, "FALSE"=高性能
  4.       .IOSTANDARD("BLVDS_25"), // 设置IP电平属性
  5.       .SLEW("SLOW")            // IO的压摆率,"SLOW"或者"FAST",FAST压摆率可以满足高性能需求,例如高速存储器接口,但是,如果不能恰当设计(端接匹配,传输线阻抗控制和串扰耦合),更高的压摆率输出会导致信号反射或者产生噪声问题。
  6.    ) IOBUFDS_inst (
  7.       .O(O),     // 缓冲输出
  8.       .IO(IO),   // 差分IO P
  9.       .IOB(IOB), // 差分 IO N
  10.       .I(I),     // 缓冲输入
  11.       .T(T)      // 3态使能, high=输入, low=输出
  12.    );
复制代码

3LVDS中的终端电阻
bfa25eb612de4dcebdfffcb85f3f1eb7.jpg
4d149af2b2fd44378d3818e6ea4ade01.jpg
如果要使用内部的终端电阻,对于HP的LVDS信号BANK电压必须是1.8V,而对于HR的LVDS25 BANK信号必须是2.5V,否则可以使用外部终端电阻。
4LVDS电气特性
4.1LVDS25
c25af8815a5247b5829ecf3aed983946.jpg
VCCO是2.5V
VOH是高电平最大1.675V
VOL 低电平最小0.7V
VODIFF差模电压最大600mv ,最小247mv,典型值350mv
VOCM 输出共模电压,最小1V最大1.425V,典型值1.25V
VIDIFF输入差模电压,最大600mv,最小100mv,典型350mv
VICM输入共模电压,最大1.5V,最小0.3V,典型1.2V
4.2LVDS
03cc90f316fb414587c08a229e98d410.jpg
VCCO是1.8V
VOH是高电平最大1.675V
VOL 低电平最小0.825V
VODIFF差模电压最大600mv ,最小247mv,典型值350mv
VOCM 输出共模电压,最小1V最大1.425V,典型值1.25V
VIDIFF输入差模电压,最大600mv,最小100mv,典型350mv
VICM输入共模电压,最大1.5V,最小0.3V,典型1.2V
LVDS器件电气特性是否兼容主要看,VODIF,VOCM,VIDIFF,VICM,可以看到,LVDS25 和LVDS的差分电气特性是兼容的。
5LVDS电平兼容
对于HP BANK 即便是BANK电压VCCO不是1.8V,也可以使用LVDS输入,但是LVDS输出或者双向LVDS通信,BANK电压必须是1.8V
对于HR或者HD BANK即便是BANK电压VCCO不是2.5V也可以使用LVDS_25输入,但是LVDS_25输出或者双向LVDS_25通信,BANK电压必须是2.5V
如果电平标准无法满足要求,可以采用外部电路实现差分信号的电平转换,下图就是典型的方案,该电路使用交流耦合,并且对输入信号直流偏置,通过RBIAS的电阻产生VCCO/2的VICM电平。电容的典型值时100nF,电阻的范围为10K~100K
ad5036a65d554e3c85659469f5260ae9.jpg
以下两张图来自于XILINX官网,用户在硬件设计的时候可以用于评估LVDS的兼容特性
66cae7bcf27f4581bbffca057d484b81.jpg
521f1e0b0c864c8ead0420eb86526c5e.jpg
当和其他LVDS外设通信时,可以通过以上两张表以及本文28.4LVDS电气特性小节,判断电气特性是否兼容。
6硬件电路分析
硬件接口和子卡模块请阅读“附录 1”
配套工程的 FPGA PIN 脚定义路径为 soc_prj/uisrc/04_pin/ fpga_pin.xdc。
7测试代码
0a11fe3caae646108b00b7cadc9ab614.jpg
测试采用PC上通过串口发送数据到开发板,然后经过外部的LVDS环路后把串口数据传回电脑。例子虽然简单,但是可以展示LVDS接口的基本用法。
  1. `timescale 1ns / 1ns

  2. module lvds_loop
  3. (
  4. input I_sysclk_p,
  5. input I_sysclk_n,//系统时钟信号输入
  6. input I_uart_rx,//UART数据信号接收
  7. output O_uart_tx,//UART数据信号发送

  8. //lvds 差分输入
  9. input I_dclk_p,//差分输入时钟信号p端
  10. input I_dclk_n,//差分输入时钟信号n端
  11. input I_din_p,//差分数据输入信号p端
  12. input I_din_n,//差分数据输入信号n端
  13. //lvds 差分输出
  14. output O_dclk_p,//差分时钟输出信号p端
  15. output O_dclk_n,//差分时钟输出信号n端
  16. output O_dout_p,//差分数据输出信号p端
  17. output O_dout_n,//差分数据输出信号n端
  18. output O_card_power_en
  19. );

  20. assign O_card_power_en = 1'b1; //子卡上电

  21. wire I_clk;
  22. IBUFGDS CLK_U(
  23. .I(I_sysclk_p),
  24. .IB(I_sysclk_n),
  25. .O(I_clk)
  26. );
  27. wire clk50m,clk5m,dclki,din;
  28. reg uart_rx_r=1'b0;

  29. //使用pll产生50mhz时钟和5mhz时钟
  30. clk_wiz_0 uclk(.clk_out1(clk50m),.clk_out2(clk5m), .clk_in1(I_clk));

  31. //单端转差分输出部分
  32. //内部单端时钟转为差分信号输出
  33. OBUFDS #(
  34. .IOSTANDARD("DEFAULT"), // IO电平属性
  35. .SLEW("SLOW")           // IO的压摆率,"SLOW"或者"FAST"
  36.                          // FAST压摆率可以满足高性能需求,例如高速存储器接口,但是,如果不能恰当设计(端接匹配,传输线阻抗控制和串扰耦合),更高的压摆率输出会导致信号反射或者产生噪声问题。
  37. )
  38. OBUFDS_DCLK_O_inst (
  39. .O(O_dclk_p),     // 差分输出P端
  40. .OB(O_dclk_n),   // 差分输出N端
  41. .I(clk50m)      // 内部输入信号
  42. );

  43. //接收的uart_rx信号转为差分输出
  44. OBUFDS #(
  45. .IOSTANDARD("DEFAULT"), // IO电平属性
  46. .SLEW("SLOW")           // IO的压摆率,"SLOW"或者"FAST"
  47.                          // FAST压摆率可以满足高性能需求,例如高速存储器接口,但是,如果不能恰当设计(端接匹配,传输线阻抗控制和串扰耦合),更高的压摆率输出会导致信号反射或者产生噪声问题。
  48. )
  49. OBUFDS_DOUT_inst (
  50. .O(O_dout_p),     // 差分输出P端
  51. .OB(O_dout_n),    // 差分输出N端
  52. .I(I_uart_rx)   // 内部输入信号
  53. );

  54. //单端转差分输入部分
  55. //差分时钟转为单端内部时钟信号
  56. IBUFDS #(
  57. .DIFF_TERM("FALSE"),       // "FALSE"=不使用内部终端电阻,"TRUE"=使用内部终端电阻
  58. .IBUF_LOW_PWR("TRUE"),     // "TRUE"=低功耗,"FALSE" =高性能
  59. .IOSTANDARD("DEFAULT")    // 设置输入电平属性
  60. )
  61. IBUFDS_DCLK_I_inst (
  62. .O(dclki),   // IO buffer输出到内部信号
  63. .I(I_dclk_p), // 差分输入P端
  64. .IB(I_dclk_n) // 差分输入N端
  65. );

  66. //接收的差分数据转为内部单端数据信号
  67. IBUFDS #(
  68. .DIFF_TERM("FALSE"),       // "FALSE"=不使用内部终端电阻,"TRUE"=使用内部终端电阻
  69. .IBUF_LOW_PWR("TRUE"),     // "TRUE"=低功耗,"FALSE" =高性能
  70. .IOSTANDARD("DEFAULT")    // 设置输入电平属性
  71. )
  72. IBUFDS_DIN_inst (
  73. .O(din),   // IO buffer输出到内部信号
  74. .I(I_din_p), // 差分输入P端
  75. .IB(I_din_n) // 差分输入N端
  76. );

  77. //在FPGA内部,把接收的din寄存到uart_rx_r
  78. always @(posedge dclki)begin
  79.     uart_rx_r <= din;
  80. end

  81. assign O_uart_tx = uart_rx_r;//通过assign 把接收的环路数据,直接给O_uart_tx

  82. //通过ila在线逻辑分析仪,下载bit后,在线调试观察内部的数据信号
  83. ila_0 ila_dg (
  84.     .clk(clk50m),
  85.     .probe0({clk5m,I_uart_rx,din,O_uart_tx})
  86. );   

  87. endmodule
复制代码

8仿真结果
仿真中修改前面文章中使用的tb_uart_top.v文件,模拟串口的发送,并且观察经过LVDS之后的环路输出结果是否正确,通过这种简单的办法验证代码功能,对于硬件板卡不支持LVDS的开发板可以如此验证。
345fc2ec4dbd4e7fb74d0adb8f40445f.jpg
9硬件接线
(该教程为通用型教程,教程中仅展示一款示例开发板的连接方式,具体连接方式以所购买的开发板型号以及结合配套代码管脚约束为准。)
本实验注意采我们的cep跳线帽跳线1.8V,子卡采用1.8V的FEP-BASE-CARD。请确保下载器和开发板已经正确连接,另外需要把核心板上的2P模式开关设置到JTAG模式,即ON ON,并且开发板已经上电。(注意JTAG端子不支持热插拔,而USB接口支持,所以在不通电的情况下接通好JTAG后,再插入USB到电脑,之后再上电,以免造成JTAG IO损坏)
外部环路需要实用跳线帽,CEP-GPIO接口中的IO可以用于完成本实验

2a0f3a11c2434a66a5d9369d9384d6e7.jpg

10测试结果
由于串口速度很慢,我们使用lia的capture模式才能抓到更多数据,以下是IP CORE的设置
51027a89d32e499d96eb49b0df1f78e2.jpg
以下是下载Bit后设置Capture模式的采样信号,这里用了5MHZ的时钟信号 上升沿作为采样信号
18f6132db7f84a73ada84e931c250f96.jpg
Uart_rx_i为低电平触发
c3df74c3b02c49d2a16e3c47899da21e.jpg
在线仿真抓取的波形
9e2abd6290d84662a4bd07c8b309b262.jpg
串口助手接收收发测试
2a06a5aebda54dd1be28ffb6f89d747e.jpg




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则