1. Instructores: M.C. Heraclio Heredia Ureta Dr. Modesto G. Medina Melendrez Instituto Tecnológico de Culiacán Departamento de Ingeniería Eléctrica-Electrónica Agosto de 2011 Curso: Programación en VHDL
2. 1. Instalación de software MAXPLUS II. 2 . Estado actual de la lógica programable. 3. VHDL: su organización y arquitectura. 4. Diseño lógico combinacional mediante VHDL. 5. Diseño lógico secuencial con VHDL. 6. Integración de entidades en VHDL. 7. Programación de PLDs CONTENIDO:
3.
4. Pasos para instalar el software MAX+PLUS II Student Edition Version 10.2 de Altera siga los siguientes pasos: 1. Presione la tecla bandera de Windows junto con la tecla R. 2. Aparecerá la ventana de ejecutar, ahí escribes cmd y luego presionas aceptar. 3. Posteriormente, aparecerá la ventana de comandos de ms-dos, ahí presionas dir/p y enter. 4. Luego copias el número de serie del volumen del disco duro que aparecerá en la parte superior derecha de la ventana de comandos de ms-dos, estos son 8 caracteres hexadecimales como por ejemplo BE1B-8965. 5. Este número de serie del volumen del disco duro lo necesitas para que te envíen la licencia del software MAX+PLUS II de Altera que lo tienes que solicitar de la página: http://www.altera.com/support/licensing/lic-university.html 6. Seleccione la Versión 10.2 del Software MAX+PLUS II Edición Estudiantil y presione continuar.
5. Pasos para instalar el software MAX+PLUS II Student Edition Version 10.2 de Altera siga los siguientes pasos (continuación): 7. Luego aparecerá una ventana donde se solicite el número de serie del volumen del disco duro, ingrésalo y presiona continuar. 8. Luego tienes que llenar algunos datos personales como son: Nombre, Apellido, Dirección, Ciudad, Estado, País, Código postal, Teléfono, y Correo Electrónico. Una vez llenado los datos presiona continuar. 9. Luego llena un formulario con las respuestas que tú consideres correctas y presiona finalizar. 10. A tu correo te llegará un archivo con el nombre license.dat, Lo descargas y lo guardas en el disco duro. 11. Luego instalas el software MAX+PLUS II de Altera ejecutando el archivo start.htm del libro Sistemas Digitales Principios y Aplicaciones versión 10 de Ronald J. Tocci, que les pase en una memoria.
6. 12. Una vez abierta la página web, Presiona el botón Max+Plus II y luego instala la opción MAXplus_student102. 13. Se empezará a instalar el Max+Plus II 10.2. Una vez que lo instales el software, ejecútalo para que le des la ruta donde se encuentra el serial de la licencia. 14. Se recomienda que este archivo license.dat que te envían por correo lo guardes en el mismo directorio donde se encuentra el Max+Plus II. 15. Para darle la ruta de la licencia sigue estos pasos: a. Abre el Max+Plus II. b. Seleccione options de la barra de menus y luego license setup... c. Luego le das la ruta donde guardaste el archivo license.dat con la tecla browse..., y luego la tecla ok. 16. Con este último paso finalizaste la instalación del Max+Plus II. Pasos para instalar el software MAX+PLUS II Student Edition Version 10.2 de Altera siga los siguientes pasos (continuación):
8. 2.1. Dispositivos lógicos programables (PLD). La integración de sistemas se ha ido superando con las nuevas tecnologías de fabricación. Se han podido obtener componentes de mayor complejidad. El diseño ASIC (Circuitos Integrados de Aplicación Específica) domina la tendencia en aplicaciones a nivel microelectrónica, pero solo es conveniente con altos volúmenes de producción. El desarrollo de sistemas complejos requiere bastante tiempo de desarrollo. Una forma más rápida y directa es utilizar lógica programable. La lógica programable independiza el proceso de diseño del proceso de fabricación.
9. Existe una gran variedad de dispositivos lógicos programables (PLDs). PROM Programmable Read-Only Memory. PLA Programmable Logic Array. PAL Programmable Array Logic. GAL Generic Logic Array. CPLD Complex PLD. FPGA Field Programmable Gate Array. Los FPGAs y los CPLDs presentan las mismas ventajas que los ASIC pero con un menor costo. El diseño se basa en bibliotecas y mecanismos de mapeo de funciones. La implementación requiere una fase de programación, generalmente rápida.
10. 2.2. Dispositivos lógicos programables de alto nivel de integración. Se crearon para integrar con mayor rapidez una mayor cantidad de dispositivos en un circuito (SOC-System on Chip). Permiten cambios en el diseño digital. Un CPLD consiste de un arreglo de múltiples PLDs agrupados como bloques en un chip. La unidad PI (interconexión programable) se encarga de interconectar los bloques lógicos y los bloques de entrada/salida.
11. El FPGA se basa en arreglos de compuertas. Esta formado por arreglos de bloques lógicos configurables (CLBs), que se comunican entre sí y con las terminales de entrada/salida. Los CLB están ordenados en arreglos de matrices programables. La comunicación se lleva a cabo por alambrados llamados canales de comunicación.
12. Un CLB es funcionalmente completo, ya que puede Implementar cualquier función booleana representada en forma de suma de productos. El diseño lógico dentro de un CLB se implementa con bloques generadores de funciones o LUTs (Look Up Table). La diferencia entre FPGAs y CPLDs radica en el número de flip-flops contenidos. Características CPLD FPGA Arquitectura -Similar a un PLD. -Similar a los arreglos de compuertas. -Más combinacional -Más registros + RAM. Densidad -Baja a media -Media alta. Aplicaciones -Contadores rápidos. -Aplicaciones de -Máquinas de estado. Arquitecturas de computadora -Lógica Combinacional. -DSP. -Diseños con registros.
13. 2.3. Campos de aplicación de la lógica programable. Los PLD sencillos se utilizan como remplazo de circuitos LSI y MSI. Los CPLD y FPGA se aplican en áreas como: telecomunicaciones, computación, redes, medicina, procesamiento digital de señales, multiprocesamiento de datos, microondas, telefonía celular, filtros digitales programables, entre otros. Los CPLD se utilizan especialmente a nivel industrial. Los FPGA son recomendables en aplicaciones secuenciales complejas.
14. 2.4. La lógica programable y los lenguajes de descripción en hardware (HDL). En los 60s se desarrollaron: IDL de IBM, TI-HDL de Texas Instruments, ZEUS de General Electric, entre otros, orientados al área industrial; éstos no estaban disponibles; AHPL, DDL, CDL, ISPS, entre otros, orientados al área académica; éstos carecían de soporte y mantenimiento adecuado. En los 80s surgieron VHDL, Verilog, ABEL 5.0, AHDL, entre otros. En los 50s aparecieron los HDL como una opción para el desarrollo de sistemas complejos.
15. El departamento de defensa de Estados Unidos creó el lenguaje VHDL, como parte del programa “Very High Speed Integrated Circuits” (VHSIC). En 1985 surgió la versión 7.2 definida entre el gobierno, industrias y universidades. En 1987 la IEEE publicó el estándar IEEEstd 1076-1987. En 1988, VHDL fue reconocido como un estándar ANSI (American National Standards Institute). En 1993 se adoptó el estándar adicional VHDL IEEE1164. Hoy en día VHDL se considera como el lenguaje estándar para la descripción, modelado y síntesis de circuitos digitales y sistemas complejos. 2.5. Historia del Desarrollo de la programación en VHDL
16. 2.5. Historia del Desarrollo de la programación en VHDL Desarrollo de Lenguajes para Descripción de Hardware 1970’s IDL/IBM, HDL/TI, ZEUS/GE Desarrollo en Área Industrial AHPL, DDL, CDL, ISPS Desarrollo en Área Académica 1980’s AHDL, ABEL, CUPL VHDL y Verilog Departamento de la Defensa de los E.U.A. Programa: Very High Speed Integrated Circuits (VHSIC) 1983 VHDL Desarrollo: IBM, Texas Instruments e Intermetrics 1987 VHDL’87 Estándar IEEE -1076 1993 VHDL’93 Estándar IEEE - 1164
17. 2.6. Ventajas de utilizar VHDL Adición de la extensión analógica (IEEE1076.1) que permite la especificación, simulación y síntesis de sistemas digitales, analógicos y mixtos Facilitar la Verificación/Prueba y puesta a punto del sistema a diseñar. Capacidad descriptiva del comportamiento del sistema en distintos niveles de abstracción: Algorítmico , RTL ( Register Transfer Logic) o concurrente , estructural (Lógico) , Netlist. Reutilización de Código Independencia de la Tecnología y Proceso de Fabricación (CMOS, Bipolar, BiCMOS) Independencia de la Metodología de Diseño (PLD’s, ASIC’s, FPGA’s) Independencia del Sistema de Desarrollo Disponibilidad al Público Notación Estandarizada Ventajas del VHDL
20. 3.1. Unidades básicas de diseño. La estructura general de un programa está formada por módulos o unidades. Existen cinco tipos: Declaración de entidad ( entity declaration ); Arquitectura ( architecture ); Configuración ( configuration ); Declaración del paquete ( package declaration ); Cuerpo del paquete ( package body ). La entidad, el paquete y la configuración son unidades de diseño primarias. La arquitectura y el cuerpo del paquete son unidades de diseño secundarias. La entidad y arquitectura son indispensables en la estructura de un programa.
21. 3.2. Entidad. Una entidad ( entity ) es el bloque elemental de diseño en VHDL. Las entidades son los elementos electrónicos que forman un sistema digital. Descripción a Símbolo funcional Diagrama a bloques Nivel de compuertas de la entidad representativo de la entidad.
22. Puertos de entrada-salida Un puerto es cada señal de entrada y/o salida en una entidad. La declaración de los puertos debe tener un nombre, un modo y un tipo. El modo permite definir la dirección que tomará la información y el tipo define qué clase de información se transmitirá por el puerto.
23.
24. 3.3. Declaración de entidades. Consiste en la descripción de las entradas y las salidas de un circuito de diseño identificado como entity. Ejemplo 1: (-- ) indica que el texto a la derecha es un comentario. ( ; ) se utiliza al finalizar una declaración. ( : ) se utiliza al asignar nombres a las entradas y salidas.
25. Identificadores son nombres o etiquetas utilizados para referir variables, constantes, señales, procesos, etc. Pueden contener números, letras del alfabeto y guiones bajos que separen caracteres y no tienen restricción por longitud. Especificación para la escritura de identificadores
26.
27.
28.
29.
30. Se encuentran definidas dos librerías llamadas ieee y work. En la librería ieee se encuentra el paquete std_logic_1164. En la librería work se encuentran numeric_std, std_arithm y gatespkg. La librería work es donde se almacenan los programas que se van generando. Un paquete es una unidad de diseño que contiene sistemas preestablecidos con comportamientos optimizados. 3.5. Declaración de entidades mediante librerías y paquetes.
31. Las librerías se llaman como: library ieee; La librería work no requiere declaración. El paquete std_logic_1164 en la librería ieee contiene todos los tipos de datos que suelen emplearse en VHDL (std_logic_vector, std_logic, entre otros). Para obtener la información de un paquete se tiene que accesar como: use nombre_libreria.nombre_paquete.all; Por ejemplo: use ieee.std_logic_1164.all;
32.
33.
34. 3.6. Arquitecturas. Una arquitectura se define como la estructura que describe el funcionamiento de una entidad. Los estilos de programación que pueden utilizarse en VHDL son: Estilo funcional Estilo por flujo de datos Estilo estructural
35. Arquitectura - ¿Qué es? arquitectura ( architecture) Unidad de Diseño Secundaria que describe el comportamiento interno de una entidad. ¿Cómo? - A través de la programación de varios procedimientos que permitan que la entidad ( entity ) cumpla con las condiciones de operación o comportamiento deseadas. Nivel Algoritmo Nivel Lógico Nivel Compuerta Niveles de Descripción utilizados Nivel Transistor (Topología / Layout) Nivel de Transferencia entre Registros ( RTL ) Estilo de descripción o Modelización Funcional Flujo de Datos Estructural
36.
37.
38.
39.
40. Estructural - En este caso, el comportamiento de un sistema o circuito es descrito mediante modelos lógicos establecidos de los componentes que conforman al sistema o circuito, como son: Compuertas, Sumadores, Contadores, etc. Modelos lógicos pueden ser: Almacenados en Paquetes contenidos en las bibliotecas de la Herramienta de Desarrollo Estilo de Modelización – Estructural Diseñados por el Usuario Predefinidos por el Fabricante
41.
42. 3.7. Datos, operadores y palabras reservadas en VHDL Lista de palabras reservadas en VHDL
43. La precedencia de operadores se encuentran ordenados de mayor (arriba) a menor (abajo), los operadores que se encuentran en la misma fila tienen la misma precedencia y serán evaluados siguiendo el orden de izquierda a derecha. = /= < <= > <= + - & + (signo) - (signo) * / MOD REM Precedencia de operadores ** ABS NOT AND OR NAND NOR XOR XNOR Mayor Menor
44. Variables Las variables pueden ser modificadas cuando sea necesario, pueden ser declaradas solamente dentro de los procesos y subprogramas. VARIABLE identidicador : tipo [:= valor]; Ejemplo VARIABLE aux1, aux2: bit; SIGNAL identidicador : tipo [:= valor]; Ejemplo SIGNAL A, B : bit := ‘0’; SIGNAL dato: bit_vector (7 downto 0); Señales Las señales si pueden almacenar o pasar valores lógicos, por lo tanto, representan elementos de memoria o conexiones y si pueden ser sintetizadas. Son declaradas en las arquitecturas antes del BEGIN. Constantes Una constante es un elemento que puede tomar un único valor de un tipo dato, las constantes pueden ser declaradas dentro de entidades, arquitecturas, procesos y paquetes. CONSTANT identidicador : tipo := valor; Ejemplo CONSTANT byte: integer := 8; Un objeto de datos en VHDL es un elemento que toma un valor de algún tipo de dato determinado, según sea el tipo de dato, el objeto poseerá un conjunto de propiedades. En VHDL los objetos de datos son generalmente una de las tres clases siguientes: Objetos de Datos
46. 4.1. Programación de estructuras básicas mediante declaraciones concurrentes Una declaración concurrente se encuentra fuera de un proceso. Suelen usarse en las descripciones de flujo de datos y estructural. En una declaración concurrente no importa el orden en que se escriban las señales. Existen tres tipos de declaraciones concurrentes: Declaración condicional asignada a una señal ( when-else ). Declaración concurrente asignada a señales ( gates ). Selección de una señal ( with-select-when ). 43
47. Declaración condicional asignadas a una señal (when -else). Escriba la descripción VHDL de un sistema que se encuentra definido por la tabla de verdad siguiente: 44 Ejemplo: --EJEMPLO COMBINACIONAL BÁSICO LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY prueba IS PORT ( a,b,c : IN STD_LOGIC; F : OUT STD_LOGIC ); END prueba; ARCHITECTURE ejemplo of prueba IS BEGIN F<= '1' WHEN ( a='0' AND b='0' AND c='0' )ELSE '1' WHEN ( a='0' AND b='1' AND c='1' )ELSE '1' WHEN ( a='1' AND b='1' AND c='0' )ELSE '1' WHEN ( a='1' AND b='1' AND c='1' )ELSE '0'; END ejemplo;
48. Ejemplo sencillo donde se utilizan las declaraciones when-else: --EJEMPLO when-else LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Ejemplo_when_else IS PORT( a, b : IN STD_LOGIC; F : OUT STD_LOGIC ); END Ejemplo_when_else; ARCHITECTURE ejemplo of Ejemplo_when_else IS BEGIN F<= '1' WHEN ( a='1' AND b='1' ) ELSE '0'; END ejemplo;
49. Ejercicio. Una función F depende de cuatro variables D, C, B, A, que representan un número binario, donde A es la variable menos significativa. La función F adopta el valor de cero si el número formado por las cuatro variables es inferior a 10 y superior o igual a 5. En caso contrario la función F es uno. Realice el programa correspondiente en VHDL utilizando estructuras del tipo when- else. 45
50. --EJEMPLO COMBINACIONAL BÁSICO LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY tabla_4_entradas IS PORT ( entradas : IN STD_LOGIC_VECTOR(3 downto 0); F : OUT STD_LOGIC ); END tabla_4_entradas; ARCHITECTURE tabla of tabla_4_entradas IS BEGIN F<= '0' WHEN ( entradas="0101" )ELSE '0' WHEN ( entradas="0110" )ELSE '0' WHEN ( entradas="0111" )ELSE '0' WHEN ( entradas="1000" )ELSE '0' WHEN ( entradas="1001" )ELSE '1'; END tabla; Solución al problema anterior utilizando estructuras del tipo when- else.
52. Selección de una señal (with-select-when) Ejemplo: 48 ENTITY fig_4_51 IS PORT ( a, b : IN BIT; --DECLARA LOS BITS DE --ENTRADA INDIVIDUALES c : OUT BIT); --DECLARA LA SALIDA END fig_4_51; ARCHITECTURE verdad OF fig_4_51 IS SIGNAL bits_ent : BIT_VECTOR(1 DOWNTO 0); BEGIN bits_ent <= a & b; --CONCATENA LOS BITS DE --ENTRADA EN UN VECTOR WITH bits_ent SELECT c <= '1' WHEN "00“,--TABLA DE VERDAD '0' WHEN "01", '1' WHEN "10", '0' WHEN "11"; END verdad;
53. ENTITY tabla IS PORT( a: IN BIT_VECTOR(2 DOMNTO 0); c: OUT BIT_VECTOR(1 DOMNTO 0) ); END tabla; ARCHITECTURE tabla1 OF tabla IS BEGIN WITH a SELECT c<= "00" WHEN "000", "10" WHEN "001", "00" WHEN "010", "01" WHEN "011", "11" WHEN "100", "00" WHEN "101", "01" WHEN "110", "00" WHEN "111"; END tabla1; Otro ejemplo de la selección de una señal (with-select-when):
54. Otro ejemplo de la selección de una señal (with-select-when): --TABLA DE VERDAD EN VHDL SISTEMAS DIGITALES 10A ED DEL TOCCI PAG 183 ENTITY fig_4_51 IS PORT ( a, b, c : IN BIT; --DECLARA LOS BITS DE ENTRADA INDIVIDUALES y : OUT BIT); --DECLARA LA SALIDA END fig_4_51; ARCHITECTURE verdad OF fig_4_51 IS SIGNAL bits_ent : BIT_VECTOR(2 DOWNTO 0); BEGIN bits_ent <= a & b & c; --CONCATENA LOS BITS DE ENTRADA EN UN --VECTOR WITH bits_ent SELECT y <='0' WHEN "000", --TABLA DE VERDAD '0' WHEN "001", '0' WHEN "010", '1' WHEN "011", '0' WHEN "100", '1' WHEN "101", '1' WHEN "110", '1' WHEN "111"; END verdad;
55. Ejercicio Diseñe un circuito comparador para comparar las magnitudes de dos números de 2 bits (A0 A1 y B0 B1). El circuito tendrá tres señales de salida GT, LT y EQ. GT será 1 para indicar que el valor de A es mayor que el valor de B. LT será 1 para indicar que el valor de A es menor que el valor de B. EQ será 1 si el valor de A y el valor de B son iguales. Utilice instrucciones del tipo with-select-when 49
56. --COMPARADOR DE 2 BITS CON WITH-SELECT-WHEN LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY comparador_2bit IS PORT ( a, b: IN BIT_VECTOR(1 DOWNTO 0); --DEFINE LAS ENTRADAS DEL BLOQUE gt, lt, eq : OUT BIT); --DEFINE LA SALIDA DEL BLOQUE END comparador_2bit; ARCHITECTURE ckt OF comparador_2bit IS SIGNAL input : BIT_VECTOR(3 DOWNTO 0); --NOMBRA UNA SEÑAL INTERMEDIA SIGNAL output : BIT_VECTOR(2 DOWNTO 0); --NOMBRA UNA SEÑAL INTERMEDIA BEGIN input <= a & b; WITH input SELECT output <= "001“ WHEN "0000", "010“ WHEN "0001", "010“ WHEN "0010", "010" WHEN "0011", "100" WHEN "0100", "001" WHEN "0101", "010" WHEN "0110", "010" WHEN "0111", "100" WHEN "1000", "100" WHEN "1001", "001" WHEN "1010", "001" WHEN "1011", "100" WHEN "1100", "100" WHEN "1101", "100" WHEN "1110", "001" WHEN "1111"; gt<=output(2); lt<=output(1); eq<=output(0); END ckt; Solución al problema anterior utilizando estructuras del tipo with-select-when .
57. 4.2. Programación de estructuras básicas mediante declaraciones secuenciales Una declaración secuencial debe ejecutarse en el orden en que aparece y forma parte de un proceso ( process ). Se utilizan las declaraciones if-then-else con la estructura elsif , if la condición 1 se cumple then realiza la operación 1; elsif la condición 2 se cumple then realiza la operación 2; else realiza la operación 3; end if; o declaraciones case-when case A is when “ valor1deA ” => salida <=“ valor1salida ”; when “ valor2deA ” => salida <= “ valor2salida ”; when others => salida <= “v alor3salida ” ; end case; 50
59. Comparador Ejemplo: Diseñe mediante declaraciones secuenciales un comparador de dos números A y B, cada número formado por dos bits (A1 A0) y (B1 B0), la salida del comparador también es de dos bits y está representada por la variable Z (Z1 Z0) de tal forma que si: 52
60. Ejemplo : Diseñe un circuito decodificador de BCD a 7 segmentos utilizando declaraciones secuenciales con case-when . La entrada A esta formada por 4 bits (A3, A2, A1, A0) y la salida “d” por siete bits (a, b, c, d, e, f, g) activos en bajo. 54
62. 5.1. Diseño Lóg i co Secuencial Un sistema secuencial se forma con un arreglo lógico combinacional y elementos de memoria. La salida no solo depende de los valores de entrada presentes, sino también de la historia del sistema. Hay dos tipos de sistemas secuenciales: Síncronos: se sincronizan al pulso de reloj del sistema Asíncronos: dependen del orden y momento en el cual se aplican sus señales de entrada. En el diseño secuencial con VHDL las declaraciones if-then- else son las más utilizadas. 57
63. 5.2. Flip-Flops Los Flip-Flops son los elementos de memoria utilizados en los sistemas secuenciales síncronos. Un Flip-Flop mantiene o almacena un bit de manera indefinida hasta que un pulso o una señal cambie de estado. Algunos de los Flip-Flops más comunes son: SR, JK, D y T. 58
64. El atributo ‘event( evento) se utiliza para describir un hecho u ocurrencia de una señal en particular. Los atributos sirven para definir características que pueden asociarse con cualquier tipo de datos, objeto o entidades. La condición if ( clk’event ) es cierta solo cuando ocurre un cambio de valor en clk . La declaración if-then que depende de ‘event no maneja la condición else , debido a que el compilador mantiene el valor de Q hasta que no exista un cambio de valor en la señal clk . 59
65. Ejemplo: Describa en VHDL el Flip-Flop D. 60 --EJEMPLO DE FLIP_FLOP D LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY FLIP_FLOP_D IS PORT ( d,clk : IN STD_LOGIC; q : OUT STD_LOGIC); END FLIP_FLOP_D; ARCHITECTURE ejemplo of FLIP_FLOP_D IS BEGIN PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') then q<=d; end if; END PROCESS; END ejemplo;
66. Ejercicio: Escriba y simule el código VHDL de un Flip-Flop SR (el programa se realiza utilizando instrucciones condicionales y el tipo de dato no importa, ‘ - ’). 61 --EJEMPLO DE UN FLIP FLOP SR CON EVENTOS LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY FLIP_FLOP_SR IS PORT ( s, r, clk : IN STD_LOGIC; q, qn : INOUT STD_LOGIC);--SE TIENE QUE DECLARAR LA SEÑAL --Q COMO INOUT DEBIDO A QUE SE UTILIZA COMO ENTRADA Y SALIDA END FLIP_FLOP_SR; ARCHITECTURE ejemplo of FLIP_FLOP_SR IS BEGIN PROCESS (clk, s, r) BEGIN IF (clk'EVENT AND clk='1') then IF (s='0'AND r='1')THEN q<='0'; qn<='1'; ELSIF (s='1'AND r='0')THEN q<='1‘; qn<='0'; ELSIF (s='0'AND r='0')THEN q<=q; qn<=qn; ELSE q<='-'; qn<='-'; END IF; END IF; END PROCESS; END ejemplo;
67. 5.3 . Registros El diseño de registros es muy parecido al diseño de Flip-Flops. Se utilizan vectores de bits en lugar de un solo bit. Ejemplo: Escriba un programa de un registro de 4 bits. Las variables sensitivas del proceso son CLK y CLR. 62
68. 5.4 . Contadores La forma usual para describir contadores en VHDL es mediante operaciones de incremento, decremento o ambas. Cuando se requiere retroalimentación de una señal ( Q <= Q +1), ya sea dentro o fuera de la entidad, se utiliza el modo inout . Ejemplo : Elabore un programa que describa el funcionamiento de un contador de 4 bits. Realice en el diseño una señal de control (Up/Down) que determine el sentido del conteo: ascendente o descendente 63
69. Ejercicio: Describa en VHDL un contador síncrono con reset asíncrono y carga en paralelo (load). Y simule su funcionamiento. 64 --EJEMPLO DE UN CONTADOR CON EVENTOS LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; --USE WORK.STD_ARITH.ALL; USE IEEE.STD_LOGIC_unsigned.ALL; ENTITY contador IS PORT ( p: IN STD_LOGIC_VECTOR(3 DOWNTO 0); clk, load, enp, reset: IN STD_LOGIC; q: INOUT STD_LOGIC_VECTOR(3 DOWNTO 0) );--SE TIENE QUE --DECLARAR LA SEÑAL Q COMO INOUT DEBIDO A QUE SE UTILIZA --COMO ENTRADA Y SALIDA END contador; ARCHITECTURE ejemplo of contador IS BEGIN PROCESS (clk, reset, load, enp) BEGIN IF(reset='1') THEN q<="0000"; ELSIF (clk'EVENT AND clk='1') then IF (load='0' and enp='0')THEN q<=p; ELSIF (load='0' and enp='1')THEN q<=p; ELSIF(load='1' and enp='0')THEN q<=q; ELSIF(load='1' and enp='1')THEN q<=q+1; END IF; END IF; END PROCESS; END ejemplo;
70. 4.5. Diseño de sistemas secuenciales síncronos Los sistemas secuenciales se pueden implementar utilizando dos modelos: La estructura de Mealy, donde las señales de salida dependen tanto del estado en que se encuentra el sistema, como de la entrada que se aplica en determinado momento. La estructura de Moore, donde la señal de salida sólo depende del estado en que se encuentra. Un sistema secuencia se desarrolla a través de una serie de pasos generalizados: enunciado del problema, diagrama de estados, tabla de estados, asignación de estados, ecuaciones de entrada a los elementos de memoria y diagrama electrónico del circuito. 65
71. El diseño de una máquina secuencial con VHDL se realiza a partir del diagrama de estados, ya que solo se requieren conocer las transiciones entre los estados y las condiciones que controlan el proceso. La transición de un estado a otro se especifica como: En VHDL se utiliza estructuras case-when para especificar cada estado. Las transiciones se especifican con estructuras if-then-else . 66
72. En VHDL los estados se definen dentro de un tipo de dato enumerado mediante la declaración type . type estados is (d0, d1, d2, d3); signal edo_presente, edo_futuro : estados; Dentro del proceso se describe la transición del edo_presente al edo_futuro. La declaración del proceso queda como: 67 proceso1: process (edo_presente, ent) begin case edo_presente is when d0 => sal<= ‘valsal’; if ent=‘valent’ then edo_futuro <= d*; else edo_futuro <= d*; end if;
75. --EJEMPLO DE UN CONTADOR CON EVENTOS LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_unsigned.ALL; ENTITY MAQUINA_DE_ESTADOS IS PORT ( clk, x : IN STD_LOGIC; z : OUT STD_LOGIC ); END MAQUINA_DE_ESTADOS; ARCHITECTURE ejemplo of MAQUINA_DE_ESTADOS IS TYPE estados is (d0, d1 ,d2, d3, d4); SIGNAL edo_presente, edo_futuro: ESTADOS; BEGIN PROCESO1: PROCESS (edo_presente, x) BEGIN CASE edo_presente is WHEN d0 => z<='0'; IF x= '1' THEN edo_futuro<=d1; else edo_futuro<=d4; END IF; WHEN d1 => z<='0'; IF x= '1' THEN edo_futuro<=d2; else edo_futuro<=d4; END IF; WHEN d2 => IF x= '1' THEN edo_futuro<=d3; z<='1'; else edo_futuro<=d4; z<='0'; END IF; WHEN d3 => z<='0'; IF x= '1' THEN edo_futuro<=d3; else edo_futuro<=d3; END IF; WHEN d4 => z<='0'; IF x= '1' THEN edo_futuro<=d1; else edo_futuro<=d4; END IF; END CASE; END PROCESS PROCESO1; PROCESO2: PROCESS (CLK) BEGIN IF(CLK'EVENT AND CLK='1')THEN edo_presente<= edo_futuro; end if; END PROCESS PROCESO2; END ejemplo; Solución al problema anterior utilizando estructuras case-when .
76. -- CONTADOR MOD 10 ENTITY MOD_10 IS PORT( clock :IN BIT; CONTEO_MAX, q0, q1, q2, q3: OUT BIT); END MOD_10; ARCHITECTURE a OF MOD_10 IS BEGIN PROCESS (clock) VARIABLE count: BIT_VECTOR(3 DOWNTO 0); -- define a numeric VARIABLE VARIABLE x1: BIT; BEGIN IF (clock = '1' AND clock'event) THEN -- rising edge? CASE count IS WHEN "0000"=> count:="0001"; x1:='0'; WHEN "0001"=> count:="0010"; x1:='0'; WHEN "0010"=> count:="0011"; x1:='0'; WHEN "0011"=> count:="0100"; x1:='0'; WHEN "0100"=> count:="0101"; x1:='0'; WHEN "0101"=> count:="0110"; x1:='0'; WHEN "0110"=> count:="0111"; x1:='0'; WHEN "0111"=> count:="1000"; x1:='0'; WHEN "1000"=> count:="1001"; x1:='0'; WHEN OTHERS=> count:="0000"; x1:='1'; END CASE; END IF; CONTEO_MAX<=x1; q0 <= count(0);-- transfer register contents to outputs q1 <= count(1); q2 <= count(2); q3 <= count(3); END PROCESS; END a; Contador Mod10 utilizando estructuras case-when .
77. Ejercicio: Contador Mod 5 utilizando variables de tipo integer . ENTITY MAQUINA_MEALLY IS PORT( clock, x :IN BIT; q :OUT INTEGER RANGE 0 TO 4 ); END MAQUINA_MEALLY; ARCHITECTURE a OF MAQUINA_MEALLY IS BEGIN PROCESS (clock, x) VARIABLE count: INTEGER RANGE 0 TO 4; -- define a numeric VARIABLE BEGIN IF (clock = '1' AND clock'event) THEN -- rising edge? IF (x='1')THEN IF count > 0 THEN -- less than max? count := count - 1; -- increment value ELSE -- must be at max or bigger count := 4; -- reset to zero END IF; ELSE IF count < 4 THEN -- less than max? count := count + 1; -- increment value ELSE -- must be at max or bigger count := 0; END IF; END IF; END IF; q <= count; -- transfer register contents to outputs END PROCESS; END a;