SIMULACIONES DE LOS BLOQUES DE MEMORIA
Esta semana hemos incluido una pequeña memoria sobre las simulaciones de los bloques correspondientes a las memorias usadas en el proyecto
BLOQUES USADOS EN LAS MEMORIAS
En nuestro sistema usamos dos bloques de memoria: un bloque está destinado al almacenamiento de las muestras adquiridas por parte de la unidad de adquisición, y un segundo bloque se dedica a almacenar el mapa de la pantalla en formato pixel después de procesar adecuadamente las muestras adquiridas.
El primer bloque ha sido implementado en la propia FPGA usando una memoria Block RAM de 1 K x 16 bits, instanciada según las plantillas de Xilinx. Disponemos de un bus de direcciones de 10 bits, y un bus de datos de 16 bits, con dos bits de paridad.
Esta memoria consume todos los recursos disponibles en la FPGA para este tipo de circuito. En conjunto con el bloque BRAM disponemos de un multiplexor conectado a las unidades de adquisición y procesado. Este multiplexor permite que ambas unidades accedan de manera independiente a la BRAM. La unidad de adquisición solamente efectuará operaciones de escritura en la memoria, mientras que la unidad de procesado efectuará operaciones de lectura. El multiplexor permite seleccionar la dirección de escritura/lectura en la memoria BRAM, mediante una variable de selección de la salida del multiplexor (conteniendo la dirección efectiva a la cual se quiere acceder en la memoria BRAM) que será operada desde la unidad de control principal del sistema.
El segundo bloque se basa en una memoria SRAM externa presente en la placa Digilent S3 Starter Board. La memoria SRAM dispone de dos módulos de 512 Kbytes.
Para está implementación usamos solamente uno de los módulos disponibles. Disponemos de un bus de direcciones de 18 bits y un bus de datos de 18 bits con 2 bits de paridad.
Para el control de esta memoria externa disponemos de dos circuitos: un multiplexor y un buffer intermedio. El multiplexor cumple las mismas funciones que el usado en el bloque destinado a la memoria BRAM. En este caso se permiten operaciones de escritura en la memoria por parte de la unidad de procesado, y operaciones de lectura por parte de la unidad de visualización. El buffer intermedio dispone de tercer estado y permite el envío de datos a la memoria SRAM por parte de la unidad de procesado, y su puesta en tercer estado cuando se realicen operaciones de lectura por parte de la unidad de visualización. Se ha implementado este sistema para evitar que ambas unidades puedan interferirse en su acceso a la memoria SRAM, ya que el puerto de datos de la memoria es de entrada/salida.
A continuación podemos observar la jerarquía de los ficheros vhd que contienen los circuitos diseñados para ambos bloques de memoria.

Veremos ahora la simulación del bloque correspondiente a la memoria BRAM (memoria_adq_pro).
En esta simulación escribimos dos datos consecutivos en la memoria BRAM por parte de la unidad de adquisición (cuando la variable sel_mux es igual a cero y write_enable está habilitado) en la dirección d”0″ y en la dirección d”2″. Después leemos de la posición d”0″ cuando sel_mux es igual a uno (simulando la lectura por parte de la unidad de visualización), para volver a escribir en la posición d”3″, y nuevamente leer de la posición d”2″. La salida en esos instantes de lectura son los datos que habíamos escrito anteriormente con la unidad de procesado. En el momento que cambiamos la dirección de escritura/lectura, la salida es cero hasta una nueva orden de escritura o lectura (ya que la memoria esta inicialmente a cero en todas sus posiciones). Nótese que la señal de reset en este caso se denomina ssr (sinchronous set and reset). Los cursores señalan el comienzo de la primera operación de lectura/escritura.

Ahora veremos la simulación del bloque correspondiente a la memoria SRAM
(memoria_pro_VGA) .
En esta simulación escribimos datos desde la unidad de procesado (con sel igual a cero escribimos al estar we_in activo a nivel bajo) y leemos datos consecutivamente desde la unidad de visualización (con sel igual a uno). Cuando efectuamos la operación de lectura el buffer intermedio se pone en tercer estado para evitar que los datos provenientes de la unidad de procesado se escriban mientras estamos leyendo. Puede observarse que el tercer estado se activa cuando la señal sel es igual a uno (operación de lectura). Durante esos instantes la salida dato_VGA_out está en tercer estado. Esto es así debido a que la memoria SRAM nos está incluida en la FPGA, por lo que al hacer una operación de lectura el bus de datos está “al aire”, prevaleciendo la señal de tercer estado proveniente del buffer intermedio, conectada al puerto de entrada/salida de datos de la memoria SRAM. Cuando el circuito se encuentre implementado en la placa, la salida en tercer estado para una operación de lectura será obviamente el dato contenido en la posición de memoria desde la cual se quiere leer (dirección dada por dir_out, que es modificada por las direcciones desde la unidad de procesado para escrituras con sel igual a cero o desde la unidad de visualización con sel igual a uno).
Nótese que al no tener disponible la memoria SRAM real, también se ha obviado la señal de reloj necesaria para esta, pero que estará implementada en el sistema final.
No se ha creído necesario crear un modelo de la memoria SRAM para su simulación, entre otros motivos por la falta de recursos de la FPGA utilizada. No obstante si el tiempo lo permite podría hacerse un modelo usando toda la capacidad disponible de la FPGA en una memoria BRAM interna, para la prueba del presente bloque.

El presente articulo también se ha incluido en la carpeta Skydrive en formato pdf para facilitar su consulta offline.
Lo siento, el formulario de comentarios está cerrado en este momento.