FPGA_LVDS差分信号简单处理

最近调试芯片遇到一个选择题,需要决定数据接口的接口标准,是选用LVDS差分接口还是CMOS单端接口。说实话,之前接触多的还是CMOS单端接口,只是看到过很多资料介绍过LVDS差分接口。

官方说法里,它的主要优点有:

  1. 抗干扰能力强,具有更高的数据传输速率
  2. 更好的信号完整性
  3. 降低了电平幅度和电路功耗

既然有这么多优点,这次我们就选用LVDS差分接口,看看我们能不能感受到LVDS的优势。

每对LVDS信号是一个差分信号对,一个信号用两个相反的p,n信号线表示,通过差值 [Vp - Vn] 传输数据,这样可以有效减小共模噪声的干扰,信号线传输如下图:
在这里插入图片描述
而FPGA内部处理信号肯定还是需要使用单端信号,这时就需要经过一个差分转单端的“工具”,将差分信号转换为FPGA更方便处理的单端信号。

在Xilinx中,我们可以用IBUFDS原语,可以在Language Template中找到这个原语的示例,经过修改一番后,可以将差分的data_clk转换为单端的data_clk, 原语如下:

IBUFDS #(
      .DIFF_TERM("FALSE"),       // Differential Termination
      .IBUF_LOW_PWR("TRUE"),     // Low power="TRUE", Highest performance="FALSE" 
      .IOSTANDARD("DEFAULT")     // Specify the input I/O standard
   ) IBUFDS_inst (
      .O(data_clk_tmp),  // Buffer output
      .I(data_clk_p),  // Diff_p buffer input (connect directly to top-level port)
      .IB(data_clk_n) // Diff_n buffer input (connect directly to top-level port)
   );

将需要转换的data_clk P端和N端接入IBUFDS的I和IB端口,就可以在O端口得到转换的单端信号。

除了CLK时钟信号,其他信号的输入转换基本结束了;而CLK时钟信号还需要接入BUFG,因为CLK时钟只有接入BUFG才能接入全局时钟网络,这对于减小时序问题有帮助。

同样在Language Template中找到这个原语的示例,修改后如下:

BUFG BUFG_i0 (
      .O(data_clk), 		// 1-bit output: Clock output, 36MHz.
      .I(data_clk_tmp)	  		// 1-bit input: Clock input, 36MHz.
    );

一个输入一个输出,非常简单的原语调用!

另一边,有输入就会有输出,输出的问题也好解决,同样使用一个OBUFDS原语实现单端转差分,在Language Template中找到原语,修改后如下:

OBUFDS #(
      .IOSTANDARD("LVDS18"), // Specify the output I/O standard
      .SLEW("SLOW")           // Specify the output slew rate
   ) OBUFDS_inst (
      .O(tx_frame_p),     // Diff_p output (connect directly to top-level port)
      .OB(tx_frame_n),   // Diff_n output (connect directly to top-level port)
      .I(tx_frame)      // Buffer input 
   );

设置好相应的参数之后,将单端信号接入OBUFDS的I端口,O端口输出差分信号的P端,OB端口输出差分信号的N端。

最后一个小问题就是在XDC设置中,因为一个信号对有两个管脚,比单端信号多了一倍的管脚绑定工作量;但其实我们可以只需要绑定P端的管脚,软件会自动帮我们绑定N端的管脚。

在设置输入输出端口的“IOSTANDARD”中,遇到了些许问题,这里写出来记录一下,也让后面遇到这个问题的人有个参考;最初设置差分信号的“IOSTANDARD”时,我想当然的使用了“LVDS”,“LVDS18”等参数,但是这些参数都不能最终生成比特流;

在查了一些资料以及Vivado本身的I/O Port界面里参数后发现,差分信号的IOSTANDARD需要这样设置:

set_property IOSTANDARD DIFF_HSTL_II_18 [get_ports tx_frame_p]

因为我的IO电压是1.8V,所以最终使用了“DIFF_HSTL_II_18”,如果有更好的方案,可以一起探讨探讨。

总结:

- 输入信号需要用到IBUFDS实现差分转单端,输入时钟还需要加BUFG
- 输出信号使用OBUFDS实现单端转差分
- 差分信号只需要绑P端管脚,“IOSTANDARD”设置需要注意

  • 11
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LVDS (Low Voltage Differential Signaling) 是一种常用的差分信号传输标准,常见于高速串行通信和高精度数据传输领域。FPGA (Field-Programmable Gate Array) 是一种可编程逻辑器件,可以通过编程来实现各种数字逻辑功能。 在使用LVDS差分信号FPGA进行通信时,一般需要满足以下几个步骤: 1. 确定电气特性:LVDS信号有特定的电气特性,如电压幅度、时钟频率等。需要确保FPGA的输入/输出引脚能够支持这些电气特性,并且能够正确地解析差分信号。 2. 连接布线:将LVDS信号与FPGA的输入/输出引脚相连接,一般使用差分对方式进行布线。差分对包括正向信号和反向信号,它们之间相互补偿,可以提高抗干扰能力和传输质量。 3. 配置FPGA引脚:根据LVDS信号的具体要求,需要在FPGA开发工具中配置引脚为LVDS输入或输出模式,并设置相应的电气参数和约束。 4. 信号处理FPGA可以通过内部逻辑电路对LVDS信号进行处理,如解码、编码、时钟提取等。根据具体应用需求,可以设计相应的逻辑电路来处理LVDS信号。 需要注意的是,LVDS差分信号在传输过程中需要保持信号的差分特性,以确保传输的稳定性和抗干扰能力。因此,正确地布线和配置FPGA引脚非常重要。另外,对于高速传输的LVDS信号,还需要考虑时序和时钟同步等问题,以保证数据的可靠性和精确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值