新闻中心

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

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

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

  输入 DDR 示例

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

  图 6 所示为接收 DDR 方案,其中每条输入线生成两条可能需要倒相的内部数据线。对于Spartan-3E的 DDR 输入,推荐使用新型的 IDDR2 输入触发器结构。这种结构去除了从下降沿到下一上升沿的所有通路,从而可以使内部逻辑更容易设计。要了解有关 IDDR2 的详情,请参阅 DS312 《Spartan-3E系列数据手册》。


  以下代码说明针对相同生成环示例的 DDR 寄存接收器情况。唯一的变化是增加了 Spartan-3E的 IDDR2 例示。原 Spartan-3 器件需要略微不同的代码,因为它不包含 IDDR2 结构。
所附 ZIP 文件包含完整细节(请参阅“设计文件”)。

  Verilog 语言代码:
.
parameter [2:0] SWAP_MASK = 3'b010;
.
.
genvar i;
generate
for (i = 0; i <= 2; i = i + 1)
begin: loop0
IBUFDS#(.IOSTANDARD("_25"), .IFD_DELAY_VALUE("0"), .DIFF_TERM("FALSE"))
ibuf_d (.I(datain_p[i]), .IB(datain_n[i]), .O(rx_input[i]));
IDDR2 #(.DDR_ALIGNMENT("C0")) fd_ioc(.C0(clkin), .C1(notclk), .D(rx_input[i]),
.CE(1'b1), .R(1'b0), .S(1'b0), .Q0(rx_input_reg[i+3]),
.Q1(rx_input_reg[i]));
assign rx_input_fix[i] = rx_input_reg[i] ^ SWAP_MASK[i];
assign rx_input_fix[i+3] = rx_input_reg[i+3] ^ 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 => "_25", IFD_DELAY_VALUE => "0", DIFF_TERM => FALSE)
port map (i => datain_p(i), iB => datain_n(i), o => rx_input(i));
fd_d : iddr2
generic map (DDR_ALIGNMENT => "C0")
port map (c0 => clkin, c1 => notclock, d => rx_input(i), ce => '1', r => '0',
s => '0', q0 => rx_input_reg(i+3), q1 => rx_input_reg(i));
rx_input_fix(i) <= rx_input_reg(i) xor SWAP_MASK(i);
rx_input_fix(i+3) <= rx_input_reg(i+3) xor SWAP_MASK(i);

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

  在使用 DDR 技术时,位操作可能很重要。DDR 生成环示例生成一条总线,总线的低阶位聚集在时钟的下降沿,而其高阶位则聚集在下一个上升沿。图7 是 DDR 设计模拟运行的屏幕截图,其中显示了这种位集中现象。此模拟运行假设所有迹线都是正确的(即没有进行引脚交换),以清楚地显示具体位的结束位置。

  输出 DDR 示例

  图8 所示为发射器的 DDR 方案,其中每对发送数据线由 Spartan-3E FPGA 中的 ODDR2(在Spartan-3 FPGA 中是 FDDRRSE)机制进行多路复用。这种情况下,在与极性需要倒相的输出相关联的每条线路中都增加了。因为这些在上述实现过程中被吸收到输出触发器中,所以它们不会改变电路的时序。

  以下代码说明生成环示例的发射器 DDR 寄存情形。原 Spartan-3 器件需要略微不同的代码,因为它不包含 ODDR2 结构。所附 ZIP 文件包含完整细节(请参阅“设计文件”)。

  Verilog 语言代码:

  parameter [2:0] SWAP_MASK = 3'b010 ;
genvar i ;
generate
for (i = 0 ; i <= 2 ; i = i + 1)
begin : loop0
OBUFDS #(.IOSTANDARD("LVDS_25"))
obuf_d (.I(tx_output_reg[i]), .O(dataout_p[i]), .OB(dataout_n[i]));
ODDR2 #(.DDR_ALIGNMENT("NONE")) fd_ioc (.C0(clkin), .C1(notclk),
.D0(tx_output_fix[i+3]), .D1(tx_output_fix[i]), .CE(1'b1), .R(1'b0),
.S(1'b0), .Q(tx_output_reg[i])) ;
assign tx_output_fix[i] = tx_output[i] ^ SWAP_MASK[i] ;
assign tx_output_fix[i+3] = tx_output[i+3] ^ 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 : obufds generic map (IOSTANDARD => "LVDS_25")
port map (i => tx_output_reg(i), o => dataout_p(i ), oB =>
dataout_n(i));
fd_d : oddr2 generic map (DDR_ALIGNMENT => "NONE")
port map (c0 => clkin, c1 => notclock, d0 => tx_output_fix(i),
d1 => tx_output_fix(i+3), ce => '1', r => '0', s => '0', q =>
tx_output_reg(i));
tx_output_fix(i) <= tx_output(i) xor SWAP_MASK(i) ;
tx_output_fix(i+3) <= tx_output(i+3) xor SWAP_MASK(i) ;
end generate ;


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

  如上所述,在使用 DDR 技术时,位操作可能很重要。DDR 生成环示例生成一条总线,总线的低阶位在时钟的下降沿上发送,而其高阶位则在下一个上升沿上发送。

  设计文件

  本应用指南介绍的各种接收器和发射器示例的设计文件是针对所有 Spartan-3 器件和
Spartan-3E 系列器件编写的。可从 Xilinx 网站 (xapp491.zip) 获得 Verilog 和 VHDL 两种语言的设计文件。所附 readme.txt 文件提供了最新详情。

  结论

  用 LVDS 进行设计时,有计划地谨慎使用 Spartan-3 FPGA 系列资源,可以大幅度降低布局的复杂性,同时可以提高整体电路板信号的完整性。对于器件中集成的 LVDS 接收器和LVDS 发射器来说也是如此,但输入时钟引脚除外;输入时钟引脚必须具有正确的极性。



上一页 1 2 下一页

评论


相关推荐

技术专区

关闭