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 → 单端时钟
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值