本项目基于 Lattice MachXO2 FPGA 实现差分输出功能,提供一个完整的参考设计。
近期有网友反馈,在使用 Lattice FPGA 进行差分信号输出时,对 IO 配置及相关实现方式存在疑问。因此制作了该示例工程,用于展示差分输出的基本实现方法,方便学习和调试。
由于本人水平有限,工程中如有理解不到位或设计不合理之处,欢迎大家提出宝贵意见,共同交流学习。
Lattice FPGA 差分输出(LVDS)实现介绍
LVDS(Low Voltage Differential Signaling,低电压差分信号)是一种高速差分传输技术,通过一对互为反相的信号线进行数据传输。相比单端信号,LVDS具有抗共模干扰能力强、传输速度高、功耗低等特点,广泛应用于高速数据接口、显示接口以及 FPGA 外部通信等场景。
在 FPGA 中实现 LVDS 输出时,需要将内部逻辑信号转换为一对差分输出信号,即正端(P)和负端(N)。Lattice FPGA 提供了多种实现方式,本工程基于 MachXO2 芯片,实现了以下三种差分输出方法。
方法一:逻辑取反模拟差分输出(IMPL_ASSIGN)
该方法通过普通 Verilog 逻辑实现差分信号:
assign out_n = ~sw;
assign out_p = sw;
本质上只是生成两个互补的普通 IO 信号,并没有调用 FPGA 内部差分输出资源。因此,该方法只能用于功能验证或观察差分波形,不具备真正 LVDS 电气特性。
方法二:调用 LVDS 输出原语(IMPL_OLVDS)
该方法使用 Lattice 提供的 OLVDS 原语:


OLVDS Inst_OLVDS0( .A(sw), .Z(out_p), .ZN(out_n) );
通过调用 FPGA 内部差分输出资源,将单端逻辑转换为差分输出信号,是推荐的实现方式之一。使用该方法时,只需要对差分输出的一端进行 LVDS 属性配置,另一端会根据芯片内部固定的差分 IO 对关系自动对应到相应的差分引脚。
方法三:通过 Attribute 配置 IO 类型(IMPL_ATTRIBUTE)
该方法使用 IO 属性约束:
`ifdef IMPL_ATTRIBUTE
OB Inst_OB0(.I(sw), .O(out_p))
/* synthesis IO_TYPE="LVDS25E" */;
通过 synthesis attribute 指定 IO 类型为 LVDS25,使 FPGA 综合和布局布线阶段自动配置对应的差分输出资源。该方式代码更加简洁,也是 Lattice FPGA 中常用的方法。需要注意的是,差分 IO 的两个引脚在 FPGA 内部已经固定绑定,因此只需要对其中一路输出设置 LVDS 属性,工具会自动将另一差分端对应到匹配的差分引脚。
工程完整代码
//M11 P12是一对差分,M11为True P12为Comp
//对应LED4和LED3
// `define IMPL_ASSIGN
// `define IMPL_OLVDS
`define IMPL_ATTRIBUTE
module diff_interface (
input sw ,
output out_p
`ifndef IMPL_ATTRIBUTE
,
output out_n
`endif
);
`ifdef IMPL_ASSIGN
assign out_n = ~sw;
assign out_p = sw;
`endif
`ifdef IMPL_OLVDS
OLVDS Inst_OLVDS0(.A(sw), .Z(out_p), .ZN(out_n));
`endif
`ifdef IMPL_ATTRIBUTE
OB Inst_OB0(.I(sw), .O(out_p))
/* synthesis IO_TYPE="LVDS25E" */;
`endif
endmodule
差分 IO 管脚绑定说明
需要注意的是,FPGA 的差分信号并不是任意两个 IO 都可以组成,而是由芯片内部硬件结构固定绑定。
MachXO2 FPGA 的 sysIO 资源支持多种差分信号输出方式。其中,Emulated Differential Output 通过两个相邻 PIO 输出互补信号,实现差分信号的模拟输出;而 True LVDS Output 则利用 FPGA 内部专用差分输出驱动器,实现符合 LVDS 电气规范的高速差分传输。
以本工程使用的 MachXO2 芯片为例,我们使用的M11 和 P12 是一组差分 IO,而且它们也是STEP MXO2板卡的LED3和LED4的驱动引脚,其中:
- M11:True 差分端(P)
- P12:Complement 差分端(N)
其它的差分IO可以在Lattice官网上下载MachXO2132-PincsBGAPackageMigrationFile文件查阅
在使用原语输出差分信号时(IMPL_OLVDS),只需要将差分信号中的一路out_p绑定到M11(True)引脚上,此时工具就会自动地将out_n绑定到与M11对应的P12(Complement)引脚上。红圈中的LVDS25E是模拟差分输出的意思,因为M11与P12这一对差分输出并没有真正支持LVDS IO标准。

使用Attribute输出差分信号时(IMPL_ATTRIBUTE),与使用原语时一样,将差分输出的正端out_p绑定到M11即可。

sys-IO使用指导:FPGA-TN-02158-2-3-MachXO2-sysIO-Usage-Guide
Lattice原语使用参考:FPGALibrariesReferenceGuide