新闻中心

EEPW首页>EDA/PCB>设计应用> Spartan-3 FPGA系列中高效PCB布局的LVDS信号倒相

Spartan-3 FPGA系列中高效PCB布局的LVDS信号倒相

作者:Nick Sawyer等 时间:2008-07-24 来源:赛灵思公司 收藏

  提要

本文引用地址://m.amcfsurvey.com/article/86182.htm

  在比较简单的未大量使用过孔的四层或六层上,可能很难对或 LVPECL 这类差分信号布线。其原因是,驱动器上的正极引脚必须驱动接收器上的相应正极引脚,而负极引脚则必须驱动接收器的负极引脚。有时迹线以错误的方向结束,这实际上是向电路中添加了一个。本应用指南说明 Spartan?- 3系列如何仅通过在接收器数据通路中加入一个即可避免大量使用过孔,并且在不要求重新设计的情况下即可解决意外的迹线交换问题。这项技术同样适用于将用作驱动器的情况,而且交换迹线可使得在其他器件或连接器上的 PCB 布线更容易。

  简介

  图1 所示为一个 PCB 示例,其中正极引脚驱动接收器的正极引脚,负极引脚驱动接收器的负极引脚。如果引脚被意外交换,那么 PCB 迹线实际上就变成了一个,这就可能需要电路板重新设计。

  图2 说明 Spartan-3系列如何通过在接收器数据通路中加入必要的倒相器来解决这一问题。有此功能,设计人员便可以为简化布线而任意交换迹线。因此,PCB 设计人员可以为实现最大信号完整性而自由布置差分对;所发生的任何交换都可以在 FPGA 内部得到校正。如果使用 DCM (请参阅“异步输入”),则这一布线的自由仅适用于数据线,而“不”适用于时钟线。交换线路绝对不会损坏器件。

  吸收倒相器示例

  在两种情况下,可以向前吸收倒相器:

1. 当直接驱动触发器输入时
2. 当驱动到逻辑函数中时

  在第一种情况下,Spartan-3 FPGA 系列在 CLB 触发器的直接 (D) 输入路径上有一个多路复用器(如图3 所示)。此多路复用器在真实输入信号和补充输入信号之间进行选择。它通过一个配置单元进行配置,该单元由加载到此器件中的比特流进行初始化。用户在操作过程中不能访问多路复用器。

  在第二种情况下,倒相器直接就被吸收了。例如,如果一个执行“B = ~A”的倒相器后面紧跟着一个执行“D = B 与 C”的与门,那么一种简单的替代方式就是一个无倒相器的执行“D =~A 与 C”的与门;换句话说,就逻辑的利用和延迟而言,倒相器吸收永远是“自由”的。

  这种倒相器吸收的机制也适用于 IOB 输出触发器。同样,如果是为简化 PCB 布局所需,这种吸收可以“自由”地在 FPGA 的输出通路中加入倒相器。如果 FPGA 驱动某接插件,而此接插件带有与此 FPGA 的 N 和 P 两个输出直接匹配的预定义引脚,则此机制可以起到帮助作用。

  异步输入

  图2 是可以考虑的最简单的示例。接收到的经过交换的信号将用在 FPGA 内部的组合逻辑中。在此例中,只需将一个简单的倒相器添加到代码中。此倒相器的代码以 Verilog 和 VHDL语言表述如下:

  Verilog: assign rx_input_fix = ~rx_input;
VHDL: rx_input_fix <= not rx_input;

  可以将此倒相器吸收到由输入信号驱动的组合逻辑中,也可以将其吸收到 FPGA 内部的某个触发器的 D 输入中,但不能将其吸收到 FPGA 的 IOB 内的触发器、DCM 或 BUFGMUX 时钟缓冲器中。因此,引脚交换的灵活性无法用到将用于数据时钟的时钟信号上。如果上述时钟只是系统的振荡器,那么可以交换线路并且不需要再倒相,这样做不会产生任何负面效应。

  图4 所示示例中的输入实际上是一条由“n”个信号对组成的总线。其中某些信号对是正确的,而其他信号对则为了方便而进行了交换。此例中,在设计中最好定义一个对应这“n”个输入的掩码。该掩码用来有选择地反转(事实上不包括“与”)那些需要校正的位,但不反转接收无误的位。在图4 中,位 0 和 2 是正确的,而位 1 需要倒相。在代码中处理校正的最好方式是使用生成环,它们可以例化输入缓冲器并且有选择地逐位执行倒相。

  以下 Verilog 代码用生成环来执行接收倒相:
.
parameter [2:0] SWAP_MASK = 3'b010;
.
.
genvar i;
generate
for (i = 0; i <= 2; i = i + 1)
begin: loop0
IBUFDS
#(.IOSTANDARD("LVDS_25"), .IBUF_DELAY_VALUE("0"), .DIFF_TERM("FALSE"))
ibuf_d (.I(datain_p[i]), .IB(datain_n[i]), .O(rx_input[i]));
assign rx_input_fix[i] = rx_input[i] ^ SWAP_MASK[i];
end
endgenerate

  以下 VHDL 代码用生成环来执行接收倒相:
.
constant SWAP_MASK : std_logic_vector(2 downto 0):= "010";
.
.
loop0: for i in 0 to 2 generate
ibuf_d: ibufds generic map
(IOSTANDARD => "LVDS_25", IBUF_DELAY_VALUE => "0", DIFF_TERM => FALSE)
port map
(i => datain_p(i), iB => datain_n(i), o => ; rx_input(i));
rx_input_fix(i) <= rx_input(i) xor SWAP_MASK(i);
end generate;


  通过修改红色的粗体字符,可以方便地将此机制扩展到不同的位宽。

  IOB 输入触发器的同步使用

  通常,输入信号寄存在 IOB 触发器中,因为高速数据传输是使用 LVDS 的最常见的原因。可使用下列技术之一来寄存数据:

单数据速率 () 技术,这种技术在 IOB 中只使用一个(通常是正沿触发的)触发器或者
双数据速率 (DDR) 技术,这种技术使用正沿和负沿都触发的触发器对输入数据线进行采样

  在两种情况下都不可能在输入放大器和触发器之间反转输入信号,因为 IOB 模块中的触发器没有可倒相的输入。倒相器需要添加到 IOB 输入触发器后,它们可以被吸收到其后的寄存逻辑或组合逻辑中。

示例

  图5 所示为 IOB 中带有一个触发器的方案。

  以下代码说明针对相同生成环示例的 SDR 寄存情况。唯一的变化是增加了触发器例示。
Verilog 语言代码:
.
parameter [2:0] SWAP_MASK = 3'b010;
.
.
genvar i;
generate
for (i = 0; i <= 2; i = i + 1)
begin: loop0
IBUFDS#(.IOSTANDARD("LVDS_25"), .IFD_DELAY_VALUE("0"), .DIFF_TERM("FALSE"))
ibuf_d (.I(datain_p[i]), .IB(datain_n[i]), .O(rx_input[i]));
FD fd_d (.C(clkin), .D(rx_input[i]), .Q(rx_input_reg[i]));
assign rx_input_fix[i] = rx_input_reg[i] ^ SWAP_MASK[i];
end
endgenerate

  VHDL 语言代码:
.
constant SWAP_MASK : std_logic_vector(2 downto 0):= "010";
.
.
loop0: for i in 0 to 2 generate
ibuf_d: ibufds
generic map (IOSTANDARD => "LVDS_25", IFD_DELAY_VALUE => "0", DIFF_TERM => FALSE)
port map (i => datain_p(i), iB => datain_n(i), o => rx_input(i));
fd_d: fd port map (c => clkin, d => rx_input(i), q => rx_input_reg(i));
rx_input_fix(i) <= rx_input_reg(i) xor SWAP_MASK(i);
end generate;

  通过修改红色的粗体字符,可以方便地将此机制扩展到不同的位宽。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭