0:05
Hola de nuevo.
En las últimas completamos la implementación de nuestro procesador
a nivel de puertas y bloques lógicos y también generamos sus correspondientes
modelos VHDL.
En esta sesión verificaremos vía simulación
el correcto funcionamiento de dicho procesador modelado en VHDL.
Para ello deberemos definir bancos de
pruebas o test benches que se encargaran de
ejecutar los distintos programas en nuestro procesador,
por ejemplo los de control de temperaturas, cronómetro o cualquier otro
que podamos ejecutar en dicho procesador.
En primer lugar desarrollaremos un package donde
definiremos el conjunto de instrucciones primero y el programa
correspondiente al programa que deseemos ejecutar,
por ejemplo en este caso empezaremos por el control de temperatura.
Para definir el conjunto de instrucciones incluiremos en el paquete
o package la declaración del conjunto de nombres constantes como vemos aquí,
son nombres de constantes
de un determinado número de bits, en concreto cuatro bits,
a los que asociamos un valor binario constante de cuatro bits.
Así por ejemplo el assign value, el data input,
el output value y así sucesivamente hasta llegar al salto si negativo.
Luego y dentro del mismo paquete definimos el programa
a ejecutar por parte del procesador.
Para ello en primer lugar definimos un nuevo tipo de datos
program memory que es un vector de 256
elementos y cada uno de esos 256 elementos
es un vector de 16 bits.
A continuación definimos una constante a la que llamamos temperatura control
de este tipo de datos que acabamos de definir, es decir una constante de tipo
program memory y el contenido de esta constate será de hecho
el programa de control de temperaturas que you hemos estado trabajando.
Este programa lo obtendremos a partir de el programa
en nemónico que habíamos desarrollado el cual a su vez lo habíamos obtenido
partiendo de la descripción funcional o de la funcionalidad de nuestro algoritmo.
Esta funcionalidad la habíamos obtenido a partir del diagrama de flujo,
del diagrama de flujo habíamos codificado las distintas instrucciones en nemónico,
y ahora estas instrucciones en nemónico las codificaremos en binario
para guardarlas en la memoria del programa.
Por ejemplo, poner el valor constante 10 en
un elemento de memoria en el elemento x5 lo habíamos
escrito en nemónico de esta forma assign value 5,10.
Y esta instrucción la colocamos en la posición 0.
Luego la primera posición de nuestra constante temperature control
tenemos que codificar toda esta instrucción.
Al ser la primera instrucción you será la correspondiente a la posición 0
y sabemos que la tenemos que codificar en 16 bits dentro de la memoria
de programa y lo haremos concatenando con el operador ampersand de VHDL,
este operador, concatenando distintas cadenas de bits
como son la cadena que habíamos definido como constante en la transparencia
anterior assign value concatenada con el valor
hexadecimal 0A, la x indica el
valor hexadecimal y entre comillas el valor correspondiente en hexadecimal.
0a en hexadecimal que es un vector de ocho bits y que contiene
el valor binario correspondiente a la constante 10
que queremos cargar en nuestro registro de memoria.
Y todo ello lo concatenamos con un nuevo valor hexadecimal que es el 5,
son cuatro bits que codifican el valor 5 y que sirven
para identificar el x5, el elemento de memoria x5 sobre el que
queremos cagar nuestro valor constante 10.
Aquí teníamos cuatro bits,
el valor contenido en la constante assign value son cuatro bits,
el hexadecimal 0A son ocho bits y el hexadecimal 5 son de nuevo cuatro bits.
Cuatro, ocho más cuatro son en total 16 bits
que son los que utilizamos para codificar esta instrucción.
Y esto es lo que iríamos haciendo para todas las otras instrucciones
hasta completar nuestro programa de control de temperatura.
Ahora vamos a definir el modelo VHDL del banco de pruebas
o test bench que estará formado por dos bloques como vemos en la figura,
el procesador y el programa de memoria que almacena el
algoritmo de temperaturas que acabamos de ver.
En primer lugar definimos las librerías, el paquete,
el package main parameters que es donde definíamos parámetros
generales como por ejemplo el número de bits m igual a ocho,
y el paquete program que acabamos de ver
hace un instante donde se define el contenido de la memoria de programa,
es decir el programa que queremos ejecutar en nuestro procesador.
A continuación declaramos la entidad del test bench,
del banco de pruebas de este procesador que le damos el nombre
test processor y que es muy simple, puesto que la
entidad no va a tener ni entradas ni salidas como veremos más adelante.
En la arquitectura de este módulo,
la arquitectura correspondiente a esta entidad tan simple que acabamos de ver,
deberemos declarar el componente procesador como un
componente que es el que en realidad queremos verificar, validar, testear.
Una vez declarado dicho componente, también tenemos que declarar
todas las señales propias internas de esta arquitectura como son los puertos entrada
salida, señales de instruction, clock o reset,
puertos ahora de entrada, perdón de salida o las señales number,
temp pos o digital clock, así como la señal on off.
En relación con el bloque temperature control, control de temperaturas
este you se ha definido en el packete program como una
constante que modela memoria de programa y donde you hemos cargado
en binario el programa correspondiente al control de temperatura.
Por lo tanto solo tendremos que ir obteniendo
de esa constante el contenido de la posición de memoria
correspondiente a la instrucción a ejecutar en cada momento.
Ahora y dentro de la descripción propiamente dicha de esta arquitectura,
faltaría en primer lugar instanciar el componente procesador
que es el que queremos verificar y validar con su correspondiente,
sus correspondiente conexiones en los puertos entradas salidas,
su port map, el mapeo de sus puertos.
Definir el reloj digital,
digital clock con un periodo de 100 nano segundos,
esto es que cada 100 nano segundos el valor de la señal
digital clock se incrementará en uno.
Debemos conectar aquí vemos
que debemos conectar la señal instruction que viene de la
memoria donde está el programa de temperature control
y también debemos conectar la señal number hacia la memoria para indicar
cuál es la siguiente instrucción a ejecutar.
Teniendo en cuenta que nuestro programa de memoria
está descrito mediante una constante que hemos llamado temperature control,
todas estas conexiones que acabamos de mencionar,
es decir toda esta parte es una constante,
todas estas conexiones se pueden hacer con esta simple
instrucción que tenemos aquí o esta simple sentencia.
Cogemos el valor de number convertido
a entero y lo utilizamos como índice de la constante temperature control para
obtener o leer sobre la señal instruction el contenido
de esa posición de memoria, de la posición indicada por number.
De forma que en instruction una vez ejecutada esta sentencia habrá
la codificación de la siguiente instrucción a ejecutar.
También definimos un reloj clk con un,
con un valor que cambia cada 10 nano segundos.
Luego tiene un periodo de 20 nano segundos.
A continuación conectamos pmp, post y el
digital clock a las entradas IN0,
IN1 y IN2 de nuestro procesador.
Y por último conectamos la salida OUT0 de
nuestro procesador a la señal on off
utilizada para el control de temperatura.
Y finalmente debemos definir el conjunto de valores sucesivos
que impondremos sobre las señales reset, pos y temp.
temp, pos y reset.
Recordemos que clk digital clock you los habíamos fijado en la transparencia
anterior, digo fijaremos los valores de estas tres señales para
poder comprobar el funcionamiento de nuestro circuito de control de temperatura
materializado en forma de programa sobre nuestro procesador genérico.
Esto lo hacemos en este proceso que tenemos aquí,
donde inicialmente fijamos las señales de reset igual a uno,
la temperatura solicitada la fijamos sobre la señal pos a un valor
hexadecimal 14 que equivale a decimal 20,
luego estamos hablando de 20 grados.
La temperatura actual al valor hexadecimal 10
que en decimal serian 16
grados y después de ello esperamos un cierto tiempo.
Durante este tiempo 110 nano segundos, será el tiempo durante el cual
el valor de reset está activo porque justo a continuación lo que hacemos
es desactivar el reset y esperar ahora 2000 nano segundos.
¿Qué pasará durante estos 2000 nano segundos?
Pues durante estos 2000 nano segundos el procesador irá ejecutando el programa
de control de temperaturas que tenemos en la parte de memoria de programa.
Y irá actuando en función de los valores que hemos
fijado aquí arriba de temperatura y de cómo ese programa vaya evolucionando.
Transcurridos estos 2000 nano segundos,
volvemos a modificar el valor de temp.
Lo ponemos al valor hexadecimal 15 que equivale al decimal 21,
de 21 grados de temperatura,
de nuevo esperamos 2000 nano segundos para que se evalúe esta
nueva situación por parte del programa de control de temperaturas que tenemos aquí,
y a continuación de nuevo volvemos a modificar la,
el valor de temp a 14 en hexadecimal que es 20 en decimal,
volvemos a dar tiempo para que el procesador ejecute el programa
de control de temperaturas en función de estas nuevas condiciones
y por último volvemos a cambiar el valor de temp, lo ponemos ahora al hexadecimal
13 que son 19 en decimal, y que por lo tanto equivale a 19 grados.
Y a continuación you damos una orden de wait sin
ninguna posibilidad de reactivación de este proceso.
Por lo tanto, este proceso acaba.
Esto equivale a detener definitivamente este proceso que da
que iba proporcionando estímulos cambiantes a nuestro sistema
procesador a través de las señales temp, pos y reset.
Nuestro sistema procesador seguirá ejecutando nuestro programa
de control hasta que acabe el tiempo de simulación.
Este banco de pruebas o test bench se ha simulado y aquí tenemos el resultado.
En estos resultados de simulación podemos ver que si la temperatura
actual temp es igual a 10 en hexadecimal y este
valor es menor o igual que la temperatura solicitada en pos,
aquí tenemos temp y aquí tenemos pos, la temperatura solicitada
en pos durante toda la asignación son 14 grados en hexadecimal,
en ese caso la salida on off que tenemos aquí está habilitada a uno, está activada.
Mientras que si la temperatura aumenta y temp se hace
15 grados en hexadecimal
y este 15 es mayor que la temperatura solicitada que era 14,
entonces la señal on off se desactiva durante todo este tramo de aquí,
se cumple la condición de que la temperatura solicitada es
mayor o igual que la temperatura actual y por
lo tanto se desactiva el on off.
Y aquí de nuevo tenemos que si la temperatura
sigue descendiendo llegará a 13 grados y 13 grados es menor que
la temperatura solicitada que era de 14 y por lo tanto
en este tramo final la señal on off vuelve a activarse.
De esta forma hemos utilizado un banco de pruebas o test bench descrito en VHDL para
comprobar mediante simulación conjunta del banco de pruebas más el procesador
más el programa de control de temperatura almacenado en la memoria de programa,
que el algoritmo de temperaturas materializado a través de un programa
ejecutado por nuestro procesador genérico funciona correctamente para los
casos abordados, verificados por el citado banco de pruebas.
Ahora y a modo de ejercicio os proponemos desarrollar un banco de pruebas
o test bench para simular el programa correspondiente
al cronómetro que era el otro ejemplo que habíamos
utilizado a lo largo de la presentación de este procesador.
Al igual que en el caso anterior podemos definir la memoria de programa
como un array de palabras o vectores de 16 bits,
una constante del tipo program memory
que habíamos definido anteriormente y en
él almacenamos en binario todas las instrucciones equivalente a la
funcionalidad del cronómetro que you habíamos definido previamente.
En este caso también tenemos que definir además de las
distintas librerías una entidad vacía correspondiente
al test de este procesador, test processor.
Y a esta entidad le asignaremos una arquitectura,
architecture test del test processor donde
declaramos en primer lugar el componente procesador, processor,
a continuación todas las señales internas de este banco de pruebas,
todas las señales internas, todas las señales de nuestro
sistema y a continuación en la descripción propiamente dicha de esta arquitectura
que empieza en este begin, pues en primer lugar instanciamos
al procesador y le mapeamos los distintos puertos de entrada salida,
entre ellos vemos por ejemplo de instruction, esta conexión de aquí,
y a continuación leemos precisamente sobre esa señal instruction
desde la constante en la que habíamos almacenado el
programa correspondiente al cronómetro que habiamos llamado chronometer,
vamos leyendo sobre instruction la instrucción o
sentencia a ejecutar según el valor de number,
number viene dado por el propio procesador.
Después de esto solo faltaría fijar los estímulos o los valores
de las distintas señales de entrada a nuestro procesador
para que se pueda ejecutar una simulación.
Y este es un ejemplo de estímulos o valores de entrada para
simular el cronómetro.
Definimos un reloj, un clk con un periodo de 20 nano segundos,
cambia cada 10 nano segundos, luego periodos de 20 nano segundos,
la señal de referencia que cambia cada 100 nano segundos luego tendrá un
periodo de 200 nano segundos y a continuación conectamos las distintas
señales a los puertos de entrada de nuestro procesador o el puerto de salida
de nuestro procesador a una señal del cronómetro.
A continuación hay un proceso llamado stimuli
chrono donde vamos a ir definiendo valores para algunas
señales de entrada de nuestro sistema cronómetro y daremos
tiempo al procesador para que ejecute el programa correspondiente.
Vemos que inicialmente definimos reset a uno, time reset a cero,
start a cero, stop a cero y esperamos 100 nano segundos.
Durante esos 100 nano segundos se estará produciendo un pulso de reset activo.
Después de esos 100 nano segundos desactivamos el reset,
mantenemos a cero los otros valores y esperamos
100 nano segundos más durante los cuales se irá ejecutando
el programa que tenemos almacenado en memoria y modelado
en forma de esa constante a la que hemos llamado chronometer.
Transcurridos esos 100 nano segundos hacemos un cambio en time reset,
mantenemos start a cero, stop a cero y volvemos a esperar que se simule bajo
estas nuevas condiciones durante 200 nano segundos.
Y así sucesivamente hasta que al final detenemos este proceso con
una sentencia wait sin condición de reactivación.
Bien, pues toda esta secuencia de estímulos
se irán aplicando y ejecutando a nuestro
sistema procesador cuando dicho sistema lo simulemos.
Y estos serían los resultados correspondientes a la simulación
de este banco de prueba.
Y con esto hemos finalizado una sesión que podríamos resumir diciendo que hemos
definido un banco de pruebas o test bench del procesador que ejecuta el programa,
el controlador de temperaturas para comprobar que el procesador
con ese programa realiza las tareas correspondientes.
Dicho banco de pruebas se ha simulado para comprobar una serie de casos,
para esos casos se ha comprobado el buen funcionamiento del algoritmo de
control de temperaturas materializado a través de un programa que a su vez se
ejecuta por nuestro procesador genérico.
Y ese mismo ejercicio se ha repetido para el algoritmo
del cronómetro demostrando así que nuestro procesador genérico
modelado en VHDL es capaz de ejecutar este tipo de programas.
Muchas gracias y hasta la próxima.