Librería en VHDL que genera el protocolo serial SPI con 4 pines de control: MISO, MOSI, SCLK, CS.
Los puertos del SPI de la librería son:
FGPA_CLK: Puerto genérico de tipo integer donde se especifica la frecuencia de reloj en Hertz.
FREC_SPI: Puerto genérico de tipo integer para especificar la frecuencia del SPI.
CPOL: Puerto genérico de un bit que selecciona la polaridad de reloj según las especificaciones del SPI.
CPHA: Puerto genérico de un bit que selecciona la fase de los bits.
SEL_ME: Selecciona si la librería operará como maestro o esclavo. ‘0’ para maestro, ‘1’ para esclavo.
CICLOS_CLK: Numero de ciclos de reloj de FPGA que habrá entre el CS en bajo y el primer flanco de CLK_SPI.
CLK: Reloj de FPGA.
INI_T: Inicia la transmisión en modo maestro, se encarga de hacer el envío de datos de manera ininterrumpida.
DATA_IN: Byte a enviar en modo maestro o modo esclavo.
DATA_OUT: Byte recibido en modo maestro o modo esclavo.
FIN_RT: Indica fin de recepción en modo esclavo y fin de transmisión en modo maestro.
CLK_SPI: Puerto bidireccional para la señal de reloj de SPI. De entrada en modo esclavo, de salida en modo maestro.
MISO: Puerto bidireccional de datos, opera como entrada en modo maestro y como salida en modo esclavo.
MOSI: Puerto bidireccional de datos, opera como salida en modo maestro y como entrada en modo esclavo.
CS: Puerto bidireccional para Chip Select, opera como entrada en modo esclavo y como salida en modo maestro.
Polaridad y Fase
La librería permite seleccionar la polaridad del reloj y la fase de los bits de tal forma que sea compatible con cualquier dispositivo que trabaje con el protocolo.
Funcionamiento
La librería deberá ser declarada como componente en el TOP del diseño, en la instancia se deberá especificar la frecuencia del FPGA, la frecuencia de operación del SPI, la polaridad y la fase, el modo de operación si será esclavo o maestro y los ciclos de reloj que habrá entre el CS y el primer flanco de reloj.
Ejemplo de instancia en modo maestro, frecuencia de reloj de FPGA a 50MHz, frecuencia de SPI a 1KHz, polaridad ‘0’ y fase ‘0’ con 10 ciclos de reloj de retardo.
MAESTRO: LIB_SPI_REVB GENERIC MAP( FPGA_CLK => 50_000_000, FREC_SPI => 1_000, CPOL => '0', CPHA => '0', SEL_ME => '0', CICLOS_CLK => 10 ) PORT MAP( CLK, INI_T_M, DATA_IN_M, CLK_SPI_M, -- Reloj de SPI se vuelve de salida. MISO_M, -- MISO se vuelve de entrada. MOSI_M, -- MOSI se vuelve de salida. CS_M, -- CS se vuelve de salida. DATA_OUT_M, FIN_RT_M );
Ejemplo de instancia en modo esclavo, frecuencia de reloj de FPGA a 50MHz, frecuencia de SPI a 1KHz, polaridad ‘1’ y fase ‘0’ con 8 ciclos de reloj de retardo.
ESCLAVO: LIB_SPI_REVB GENERIC MAP( FPGA_CLK => 50_000_000, FREC_SPI => 1_000, CPOL => '1', CPHA => '0', SEL_ME => '1', CICLOS_CLK => 8 ) PORT MAP( CLK, INI_T_E, DATA_IN_E, CLK_SPI_e, -- Reloj de SPI se vuelve de entrada. MISO_e, -- MISO se vuelve de salida. MOSI_e, -- MOSI se vuelve de entrada. CS_e, -- CS se vuelve de entrada. DATA_OUT_E, FIN_RT_E );
Para transmitir de manera continua se deberá mantener el bit INI_T activo hasta que se deseé terminar la transmisión. Los bytes a enviar (Dato A y Dato B) deberán ser cargados en el puerto DATA_IN cuando FIN_RT se ponga a ‘1’, a excepción del primer byte que deberá ser cargado antes de poner a INI_T a ‘1’, funciona de la misma manera para ambos modos. Los bytes recibidos se mostrarán en el puerto DATA_OUT cuando lo indique FIN_RT.