Proyecto Interfaz SPI Master

Diseño Lógico II

Estudiantes:
Leonardo Vidal
Paolo Rotela
Docentes:
Julio Pérez
Javier Rodríguez

Objetivo

Un sistema SPI consiste en un "Maestro" y uno o más "Esclavos" (quienes intercambian información en forma serial con el Maestro) donde el Maestro es el dispositivo que provee el reloj del sistema y el Esclavo es cualquier circuito que recibe dicho reloj. Consta de cuatro señales básicas: MOSI (Master Output/Slave Input), MISO (Master Input/Slave Output), SCK (Serial Clock), SS (Slave Selector). Los datos transferidos (en forma serial) están sincronizados por la señal de reloj proporcionada por el Maestro. Siempre se transmite el bit más significativo primero.

El objetivo del proyecto fue implementar en VHDL y llevar a hardware sobre un EPF10K20RC240-4 de Altera, una interfaz maestro SPI, capaz de manejar una cantidad parametrizada de esclavos SPI y con un ancho de palabra máximo también parametrizado.

Diseño

El resultado del diseño fue el desarrollo de dos implementaciones distintas, pensadas para marcos de aplicación diferentes:

"Flexible:"
Implementación configurable dinámicamente. Está pensada para los casos en que los periféricos con los que se comunica el Maestro cambian, o cambian sus características, o por alguna razón no se puede incluir la configuración de los dispositivos en el momento de compilar y llevar a hardware el módulo. Este módulo internamente implementa registros que almacenan la configuración de cada dispositivo. De esta manera, cambiando el valor almacenado en el registro correspondiente, pueden cambiarse las características de la interfaz hacia cualquier periférico.
"Rígido:"
Implementación configurable estáticamente. Es el caso contrario al anterior, en donde la configuración de cada periférico se determina a través de constantes declaradas en el código. De esta manera, una vez compilado el código y llevado a hardware, no es posible modificar las características de los periféricos salvo reprogramando el dispositivo lógico con el resultado de una nueva compilación. Esta implementación ahorra todos los elementos de memoria (Ej. flip-flop) que la implementación flexible utiliza para almacenar la configuración de cada dispositivo, además de utilizar menos señales en su interfaz con el usuario del módulo.

Características

El número de periféricos esclavos que maneja la interfaz está dado por un parámetro (un GENERIC VHDL). La interfaz, en base a este número, posee un registro asociado a cada dispositivo, el cual almacena las características de operación deseadas para el mismo. En cada uno de ellos, se puede determinar:

Polaridad y Fase
Están relacionadas con la sincronización entre el reloj de transferencia y los datos.
Velocidad de transferencia
Se puede seleccionar entre un conjunto de velocidades de transferencia, las cuales son divisiones en potencias de 2 con respecto a la frecuencia de entrada.
Nivel activo de selección
El nivel activo de la señal de selección de dispositivo se puede determinar para cada periférico.
Ancho de palabra
Es posible seleccionar el ancho de palabra de cada dispositivo, es decir, la cantidad de bits en cada transferencia.

Mediante otros parámetros, se puede determinar cual es el rango de variación de algunos de estos campos o, esencialmente, los bits dedicados a cada campo en el mencionado registro. De esta manera, se afecta también el rango de acción de los mismos. Así, existe un parámetro que permite fijar la cantidad de bits asociados a la selección de velocidad de transferencia, y así se afecta también la cantidad de velocidades distintas así como el rango que abarcan. También existe un parámetro que determina el rango de posibles anchos de palabra.


Archivos

Los archivos de documentación y fuentes VHDL se pueden encontrar acá