Utilizando VHDL, ¿cómo es posible recibir un par de señales LVDS (por ejemplo, un reloj externo) en el FPGA y enrutarlas a otros pares de pines para que salgan, sin ninguna modificación?
He intentado IBUFDS y OBUFDS con una señal intermedia de terminación única, pero todo lo que obtengo en la salida es un flanco ascendente, no un reloj. También intenté poner ODDR en el medio pero obtuve lo mismo.
Estoy usando FPGA de la serie 7 de Xilinx (en Zynq) y tiene pines LVDS. El código VHDL y el archivo de restricción son así:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library UNISIM;
use UNISIM.VComponents.all;
entity fanout is
Port ( CLK_IN_P : in STD_LOGIC;
CLK_IN_N : in STD_LOGIC;
CLK_OUT_P : out STD_LOGIC;
CLK_OUT_N : out STD_LOGIC;
LD0 : out STD_LOGIC);
end Fanout;
architecture data_flow of fanout is
signal clk_lvcmos : STD_LOGIC;
begin
-- LVDS input to internal single
CLK_IBUFDS : IBUFDS
generic map(
IOSTANDARD => "DEFAULT"
)
port map(
I => CLK_IN_P,
IB => CLK_IN_N,
O => clk_lvcmos
);
-- Internal single to LVDS output
CLK_OBUFDS : OBUFDS
generic map(
IOSTANDARD => "DEFAULT"
)
port map(
O => CLK_OUT_P,
OB => CLK_OUT_N,
I => clk_lvcmos
);
end data_flow;
y el archivo UCF es:
# Input clock differential pair
NET CLK_IN_N LOC = C20 | IOSTANDARD=LVDS_25 | DIFF_TERM = TRUE; # "FMC-LA18_CC_N"
NET CLK_IN_P LOC = D20 | IOSTANDARD=LVDS_25 | DIFF_TERM = TRUE; # "FMC-LA18_CC_P"
# Output clock differential pair
NET CLK_OUT_N LOC = G21 | IOSTANDARD=LVDS_25; # "FMC-LA20_N"
NET CLK_OUT_P LOC = G20 | IOSTANDARD=LVDS_25; # "FMC-LA20_P"