> 技术文档 > Lattice FPGA ECP5中差分信号(如LVDS、LVCMOS等)与单端信号的转换常用原语_差分转单端原语

Lattice FPGA ECP5中差分信号(如LVDS、LVCMOS等)与单端信号的转换常用原语_差分转单端原语


1. 差分输入转单端(接收端)

用于将 差分对(P/N) 转换为 单端信号,适用于 LVDS、LVPECL 等输入。

(1) IBUFDS(通用差分输入缓冲器

  • 适用于 LVDS、LVPECL、BLVDS 等差分标准。

  • 语法(Verilog):

    IBUFDS #( .IOSTANDARD(\"LVDS\") // 电平标准:LVDS, LVPECL, etc.) ibufds_inst ( .I(diff_p), // 差分正端 .IB(diff_n), // 差分负端 .O(single_out) // 单端输出);
  • 约束文件(.lpf) 需指定差分对:

    NET \"diff_p\" LOC=\"A1\" | DIFF=TRUE | IOSTANDARD=LVDS25;NET \"diff_n\" LOC=\"A2\" | DIFF=TRUE | IOSTANDARD=LVDS25;

(2) ILVDS(专用 LVDS 输入缓冲器)

  • 专用于 LVDS 输入,比 IBUFDS 更优化。

  • 语法:

    verilog

    ILVDS lvds_in ( .A(diff_p), .AN(diff_n), .Z(single_out));
  • 内部终端电阻(可选):

    verilog

    ILVDS #(.TERMINATION(\"ON\")) lvds_in (...); // 启用内部100Ω终端

2. 单端转差分输出(发送端)

用于将 单端信号 转换为 差分对(P/N),适用于 LVDS 输出。

(1) OBUFDS(通用差分输出缓冲器)

  • 适用于 LVDS、LVPECL、MLVDS 等差分标准。

  • 语法:

    verilog

    OBUFDS #( .IOSTANDARD(\"LVDS25\") // 2.5V LVDS) obufds_inst ( .I(single_in), // 单端输入 .O(diff_p), // 差分正端输出 .OB(diff_n) // 差分负端输出);

(2) OLVDS(专用 LVDS 输出缓冲器)

  • 专用于 LVDS 输出,比 OBUFDS 更优化。

  • 语法:

    verilog

    OLVDS lvds_out ( .A(single_in), // 单端输入 .Z(diff_p), // 差分正端 .ZN(diff_n) // 差分负端);

3. 双向差分缓冲器(Bidirectional)

用于 双向差分信号(如 SDRAM 的 DQS 信号)。

(1) IOBUFDS(通用双向差分缓冲器)

  • 支持 输入/输出方向控制

  • 语法:

    verilog

    IOBUFDS #( .IOSTANDARD(\"LVDS25\")) iobufds_inst ( .IO(diff_p), // 差分正端(双向) .IOB(diff_n), // 差分负端(双向) .I(single_out), // 输出数据(当 T=0) .O(single_in), // 输入数据(当 T=1) .T(~oe) // 方向控制(T=1:输入,T=0:输出));

4. 高速差分接口(SerDes & DDR)

ECP5 支持 高速串行接口(如 MIPI、PCIe、7:1 LVDS 等),需使用 IP 核 或 专用原语

(1) IDDRX1F(差分 DDR 输入寄存器)

  • 用于 双倍数据速率(DDR) 差分输入。

  • 语法:

    verilog

    IDDRX1F iddr_inst ( .D(diff_p), // 差分正端 .SCLK(clk), // 高速时钟 .RST(reset), // 复位 .Q0(data_even), // 上升沿数据 .Q1(data_odd) // 下降沿数据);

(2) ODDRX1F(差分 DDR 输出寄存器)

  • 用于 DDR 差分输出

  • 语法:

    verilog

    ODDRX1F oddr_inst ( .D0(data_even), // 上升沿数据 .D1(data_odd), // 下降沿数据 .SCLK(clk), // 高速时钟 .RST(reset), // 复位 .Q(diff_p) // 差分输出);

5. 差分时钟处理

ECP5 支持 差分时钟输入(如 LVDS 时钟),通常用于 PLL 输入

(1) CLKDIVF(时钟分频器)

  • 用于 差分时钟分频(如 LVDS 时钟 ÷2)。

  • 语法:

    verilog

    CLKDIVF #( .DIV(\"2.0\") // 分频系数) clkdiv_inst ( .CLKI(diff_clk_p), // 差分时钟输入 .RST(reset), .CDIVX(clk_div2) // 分频后单端时钟);

(2) EHXPLLL(PLL 时钟管理)

  • 用于 差分时钟输入 → PLL → 单端时钟输出

  • 示例:

    verilog

    EHXPLLL #( .CLKI_DIV(1), .CLKOP_DIV(4), .CLKFB_DIV(1)) pll_inst ( .CLKI(diff_clk_p), // 差分时钟输入 .CLKFB(feedback_clk), .CLKOP(sys_clk) // 单端系统时钟);

6. 约束文件(.lpf)关键配置

在 Lattice Diamond/Radiant 中,必须正确约束差分信号:

tcl

# 差分对定义NET \"diff_p\" LOC=\"A1\" | DIFF=TRUE | IOSTANDARD=LVDS25;NET \"diff_n\" LOC=\"A2\" | DIFF=TRUE | IOSTANDARD=LVDS25;# 内部终端电阻(可选)NET \"diff_p\" TERMINATION=100; # 启用100Ω终端

总结:ECP5 差分信号处理原语

功能 原语 说明 差分输入 → 单端 IBUFDS 通用差分输入缓冲器 ILVDS 专用 LVDS 输入缓冲器(推荐) 单端 → 差分输出 OBUFDS 通用差分输出缓冲器 OLVDS 专用 LVDS 输出缓冲器(推荐) 双向差分缓冲器 IOBUFDS 支持方向控制(如 DQS) DDR 差分输入 IDDRX1F 双沿采样差分数据 DDR 差分输出 ODDRX1F 双沿驱动差分数据 差分时钟分频 CLKDIVF 差分时钟 ÷N PLL 时钟管理 EHXPLLL 差分时钟 → PLL → 单端时钟