¿Cómo dar reloj en xilinx spartan 6?

Estoy tratando de ejecutar un contador en el kit de desarrollo Digilent Atlys Spartan 6 xc6slx45, que cambia las cuentas en el borde del reloj. Soy un nuevo usuario de Verilog, por lo que no sé cómo asignar el reloj a mi programa desde la placa Xilinx.

¡Gracias!

Respuestas (2)

El reloj proviene de un oscilador de reloj en el tablero. Estoy bastante familiarizado con la placa Atlys, usamos algunas de ellas para algunas investigaciones de redes. Tiene un oscilador de reloj de 100 MHz conectado a la FPGA. Todo lo que necesita hacer es agregar un pin al archivo de nivel superior de su diseño y asignarlo al pin correspondiente en el archivo ucf. También deberá especificar la velocidad del reloj en el archivo UCF. El archivo UCF que usamos para la placa Atlys tiene la siguiente información para el pin del reloj:

NET "clk" LOC = "L15" | IOSTANDARD=LVCMOS33; # IO_L42P_GCLK7_M1UDM (GCLK)
NET "clk" TNM_NET = "sys_clk_pin";
TIMESPEC "TS_sys_clk_pin" = PERIOD "sys_clk_pin" 100000 kHz;

Esto lo ubica en el pin L15, donde el oscilador está conectado al FPGA en la placa. Luego le dice a la cadena de herramientas la frecuencia de reloj de 100 MHz con una restricción de tiempo.

El pin también debe enviarse a través de un IBUFG y BUFG antes de poder usarlo, así:

module fpga_top (input wire clk, some_other_signals....)
    wire clk_ibufg;
    wire clk_int;
    IBUFG clk_ibufg_inst (.I(clk), .O(clk_ibufg));
    BUFG clk_bufg_inst (.I(clk_ibufg), .O(clk_int));

    your logic goes here...

endmodule

Luego, simplemente use clk_int para sincronizar su lógica. Los elementos IBUFG y BUFG son necesarios para obtener la señal del reloj en la red de reloj global para que pueda impulsar su diseño de manera efectiva.

Si desea utilizar una frecuencia distinta de 100 MHz, puede crear un módulo DCM con coregen e instanciarlo en lugar de los elementos IBUFG y BUFG (el archivo contenedor DCM contendrá los búferes necesarios). Los módulos DCM crearán instancias de módulos PLL en la FPGA para sintetizar una frecuencia de reloj que es una fracción racional del reloj de entrada (2, 1/2, 2/3, 3/4, etc.).

Aquí hay un diseño de ejemplo básico para la placa Atlys que usa un DCM para generar un reloj de 125 MHz: https://github.com/alexforencich/verilog-uart/tree/master/example/ATLYS/fpga .

Para casos simples, todo lo que se necesita es esto:

  1. En Verilog, agregue una entrada de reloj a su módulo de nivel superior.

  2. En su archivo de restricciones, defina que la señal se conectará a un pin donde una señal de reloj esté realmente conectada en el tablero.

  3. Todavía en el archivo de restricciones, asegúrese de que la señal esté definida para ser el mismo estándar de señalización (CMOS, LVDS, ...) que lo que realmente se proporciona en la placa.

Hay mucha más complejidad que puede agregar, por ejemplo,

  • Utilice un administrador de reloj digital (DCM) para hacer que la señal del reloj interno tenga una frecuencia diferente a la señal que proviene de la placa.

  • Utilice un estándar de lógica diferencial como LVDS o LVPECL.

Para usar estas capacidades, querrá leer profundamente las Guías de usuario correspondientes (Guía de usuario de recursos de relojería y Guía de usuario de recursos de SelectIO).