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 → 单端时钟 |
2814

被折叠的 条评论
为什么被折叠?



