Proyecto Interfaz SPI Master
Diseño Lógico II
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á