Вы находитесь на странице: 1из 52

UPV-EHU EUI de Vitoria-Gasteiz MICROELECTRNICA, 2 CURSO

LENGUAJE DE DESCRIPCIN DE HARDWARE VHDL


ENTORNO DE TRABAJO MAX+PLUS II DE ALTERA
J.A. Sainz Catedrtico de EU de Tecnologa Electrnica

BIBLIOGRAFA
1- VHDL Lenguaje estndar de diseo electrnico Ters L., Torroja Y., Olcoz S., Villar E. Mc Graw-Hill 1997 2-Curso de Diseo Digital con VHDL Impartido en la EUITI de Vitoria-Gasteiz 2001 T. Polln Centro Politcnico Superior Universidad de Zaragoza 3- VHDL FOR PROGRAMMABLE LOGIC K. Skahill Cypress Semiconductor (lenguaje VHDL Warp) Addison Wesley 1996 4- VHDL: de la tecnologa a la arquitectura de computadores J.J. Ruz Ortiz Editorial Sntesis 1997 5- Max+Plus II VHDL de Altera 6- IEEE Standard VHDL Language. Reference Manual Publised by the IEEE Inc. 1994 7- VHDL Lenguaje para sntesis y modelado de circuitos. Pardo F., Boluda J.A. Rama 1999 8- Electrnica Digital. Aplicaciones y problemas con VHDL Artigas J.I., Barragn L.A., Orrite C., Urriza I. Prentice Hall 2002 9-Descripcin de circuitos digitales F.J. Torres Universidad de Guadalajara 10- Introduccin al lenguaje VHDL M.A. Freire EUITT UPM

11-Lenguajes de alto nivel para el diseo de circuitos integrados digitales M.A. Aguirre, J. Noel, F. Muoz Escuela Superior de Ingenieros Universidad de Sevilla 12- Curso VHDL I. Oleagorda, D. Jimnez, M. Snchez http://www.ehu.es/~jtpolagi/inicio.htm 13- Siew-Wah Chan www.ee.newcastle.edu.au/users/staff/eeswc/elec37 20/elec3720.html Rama 1999 14- The VHDL handbook D.R. Coelho Kluwer Academic Publishers 1996 15- VHDL for Designers S. Sjoholm, L. Lindh Prentice Hall 1997 16- Diseo de sistemas digitales con VHDL S.A. Prez, E. Soto, S. Fernndez

Thomson 2002 17- Electrnica Digital (3 ed.). III Microelectrnica Toms Polln Prensas Universitarias de Zaragoza 2007 18- Diseo de hardware digital con VHDL A. Urqua, C. Villalba UNED 2008

* Nota. Algunas transparencias y ejemplos corresponden a las referencias 2, 3, 5, 8, 11, 12, 13.

1_trans

2_trans

LENGUAJE DE DESCRIPCIN DE HARDWARE VHDL PARA EL DISEO DE CIRCUITOS INTEGRADOS DIGITALES VHDL(VHSIC HDL) Very High Speed Integrated Circuit, Hardware Description Lenguage Origen: Dpto de Defensa de los EEUU (1982) Proyecto para crear un lenguaje que pudiera modificar el hardware para su utilizacin en otros sistemas digitales.

LENGUAJES HDL
MAYOR DIFUSIN: VHDL y VERILOG VERILOG (Creado por CADENCE) LENGUAJES SIMILARES A LOS DE ALTO NIVEL INDEPENDIENTES DE LA TECNOLOGA PARA PROFESIONALES DEL DISEO DIGITAL Y MTO. ES IMPRESCINDIBLE SU CONOCIMIENTO VHDL SE CONVIERTE EN LA NORMA IEEE-1076 (1987) 1993 REVISIN

3_trans

4_trans

VHDL ES USADO PARA: DOCUMENTAR CIRCUITOS SIMULAR CIRCUITOS DESCRIBIR EL DISEO PARA SINTETIZAR CIRCUITOS LA SNTESIS CON VHDL ES EL PROCESO MEDIANTE EL CUAL CIRCUITOS LGICOS SON CREADOS MEDIANTE DESCRIPCIONES DEL DISEO.

DESCRIPCIN DEL DISEO VHDL CONSTA DE UNA ENTIDAD ENTITY Y UNA ARQUITECTURA ARCHITECTURE ENTITY describe las I/O ARCHITECTURE describe el contenido del diseo.
ENTITY {nombre del dispositivo} IS PORT( {nombres-puertos de entrada} {nombres-puertos bidireccionales} {nombres-puertos de salida} {nombres-puertos de salida} END ENTITY;

: IN {tipo de dato}; : INOUT {tipo de dato}; : OUT {tipo de dato}; : BUFFER {tipo de dato});

6_trans 5_trans

LOS PORTS son a menudo asociados con los pines del dispositivo o con las I/O de un componente. En VHDL toda la informacin es transportada por seales SIGNALS Las signals son de un determinado tipo TYPE. LOS PORTS o puertos pueden ser de (MODE) IN OUT BUFFER INOUT Entrada (por defecto) Salida Salida que puede ser realimentada dentro de la ENTITY Seal bidireccional (entra y sale de la entity)

7_trans

8_trans

IEEE 1076 TYPES TIPOS DE SEALES BIT Puede tomar el valor 0 o 1 Ej. signal ck: bit; BIT_VECTOR Es un grupo de bits Ej. signal a: bit_vector (0 to 3); -- ascendente Signal b: bit_vector (3 downto 0); -descendente a <= 0101; --asignacin b <= 0101; -- comentarios Esto significa que: a(0) = 0 a(1) = 1 a(2) = 0 a(3) =1 b(0) = 1 b(1) = 0 b(2) = 1 b(3) =0

IEEE 1076 TYPES (continuacin) INTEGER Se pueden emplear para ndices para bucles, constantes... BOOLEAN Pueden tomar los valores TRUE o FALSE ENUMERADOS El usuario define un conjunto de posibles valores por ej. TYPE estados IS (inicio, entra_por _a, saliendo); Otros tipos NATURAL, POSITIVE,STRING, REAL, CHARACTER etc

10_trans 9_trans

IEEE 1164 TYPES El package standard logic IEEE 1164 define el siguiente type TYPE std_ulogic IS (U,X,0,1,Z,W,L,H,_); U X 0 1 Z W L H _ sin inicializar desconocido fuerte 0 fuerte 1 fuerte alta impedancia -- obligatorio mayscula desconocido dbil 0 dbil 1 dbil no importa

TIPOS DERIVADOS DEL STD_LOGIC std_ulogic_vector grupo de std_ulogic std_logic una versin del std_ulogic que contempla el caso cuando una seal est activada por varias fuentes std_logic_vector grupo de std_logic TIPOS DEFINIDOS POR EL USUARIO Restriccin del rango de un tipo escalar o enumerado Definiendo un tipo enumerado Definiendo arrays o records

11_trans

12_abc_trans

SINTAXIS BSICA DE LA ARQUITECTURA ARCHITECTURE {nombre_de_arquitectura} OF {nombre_de entidad} IS {zona de declaracin} BEGIN {zona de descripcin} END {nombre de arquitectura};

LA ARQUITECTURA DESCRIBE EL CONTENIDO DE LA ENTIDAD TIPOS DE DESCRIPCIONES Estructural (structural) Se describen las conexiones. Es la descripcin al nivel ms bajo. Los componentes se conectan y se analizan simultneamente mediante seales (son concurrentes). Suelen necesitar seales auxiliares, paquetes (packages) y libreras (library) Ej. dff1: dff PORT MAP (rst, D, clk, Q);

Comportamiento (behavior) Se describe el comportamiento del circuito al nivel ms elevado. Se caracteriza por incluir las sentencias y rdenes de lenguajes de programacin (if, then,case), sin tener conocimiento sobre cmo se implementar el circuito en el PLD. Esta estructura es secuencial y por tanto el orden no es arbitrario. Por ello es necesario crear un proceso (process). El proceso se considera externamente como un bloque concurrente es decir si hay varios definidos en la arquitectura no hay preferencia entre ellos Ej. IF A=B THEN estado <= inicio;

Flujo de datos (dataflow) Se realiza mediante un conjunto de sentencias de asignaciones concurrentes, es decir que se aplican simultneamente. Se indica cmo la informacin se transfiere de seal a seal. No se emplean asignaciones secuenciales es decir no se emplean procesos. Mixto Emplean una descripcin que es una mezcla de los definidos anteriormente.

13_trans

14_trans

15_trans

16_trans

17_trans

18_trans

OPERADORES DE VHDL STANDARD LGICOS Definidos para tipos BIT, BOOLEAN AND, OR, NOT, XOR RELACIONALES Definidos para tipos BIT, BIT_VECTOR, INTEGER = igual a /= distinto de < menor que > mayor que <= menor o igual a >= mayor o igual a

20_trans

19_trans

ARITMTICOS Definidos para tipo INTEGER + Adicin - Sustraccin CONCATENACIN Definidos para tipos STRING, BIT, BIT_VECTOR & String es cualquier secuencia de caracteres. Bit_vector es un string.

SENTENCIAS SECUENCIALES Y CONCURRENTES SECUENCIALES Las sentencias dentro de un process son generalmente secuenciales (if, case) y se evalan secuencialmente (en serie) en trminos de simulacin. No se ejecutan hasta que no se lee todo el mdulo (en end process) CONCURRENTES Las sentencias fuera de un process se evalan simultneamente (en paralelo) Los process son evaluados de forma concurrente; ms de un proceso puede estar activo a la vez. El proceso activo se evala de forma concurrente.

21_trans

22_trans

SENTENCIAS SECUENCIALES: EL PROCESS Las sentencias dentro de un process son evaluadas de forma secuencial en trminos de simulacin Un process puede estar activo o inactivo El process tiene una lista de sensibilidad Cuando una seal de la lista cambia de valor el process se activa Todas las asignaciones a seales se producen en la sentencia END PROCESS en trminos de tiempo de simulacin y entonces el process pasa a estar inactivo.

EJEMPLO DE SENTENCIAS SECUENCIALES DENTRO DE UN PROCESS mux: process (a, b, c) begin if s =0 then x <=a; else x <= b; end if; end process mux; --etiqueta mux es opcional

La lgica dentro del proceso puede ser combinacional o secuencial

20_trans 19_trans

ARITMTICOS Definidos para tipo INTEGER + Adicin - Sustraccin CONCATENACIN Definidos para tipos STRING, BIT, BIT_VECTOR & String es cualquier secuencia de caracteres. Bit_vector es un string.

SENTENCIAS SECUENCIALES Y CONCURRENTES SECUENCIALES Las sentencias dentro de un process son secuenciales y se evalan secuencialmente en trminos de simulacin CONCURRENTES Las sentencias fuera de un process se evalan simultneamente Los process son evaluados de forma concurrente; ms de un proceso puede estar activo a la vez. El proceso activo se evala de forma concurrente.

21_trans

22_trans

SENTENCIAS SECUENCIALES: EL PROCESS Las sentencias dentro de un process son evaluadas de forma secuencial en trminos de simulacin Un process puede estar activo o inactivo El process tiene una lista de sensibilidad Cuando una seal de la lista cambia de valor el process se activa Todas las asignaciones a seales se producen en la sentencia END PROCESS en trminos de tiempo de simulacin y entonces el process pasa a estar inactivo.

EJEMPLO DE SENTENCIAS SECUENCIALES DENTRO DE UN PROCESS mux: process (a, b, c) begin if s =0 then x <=a; else x <= b; end if; end process mux; --etiqueta mux es opcional

La lgica dentro del proceso puede ser combinacional o secuencial

22.2_trans

23_trans

24_trans

25_trans

EL ATRIBUTO EVENT XEVENT significa que si la seal X vara se produce un valor verdadero en el atributo EVENT Permite detectar la transicin de una seal de 0 a 1 de 1 a 0 mediante: XEVENT AND X=1 --detecta flanco de subida de X XEVENT AND X=0 --detecta flanco de bajada de X Aplicacin en D_FF: sinc: PROCESS(CLK) BEGIN IF (CLKEVENT AND CLK=1) THEN Q<=D; END IF; END PROCESS sinc;

SENTENCIAS DENTRO DE LOS PROCESOS IF THEN ELSIF ELSE IF condicin 1THEN Consecuencia 1; ELSIF condicin 2 THEN Consecuencia 2; ELSIF ... THEN ... ELSE Consecuencia por defecto; END IF; Condiciones lgicas o aritmticas La sentencia IF es jerrquica La condicin 1 es previa a la 2. Si se cumple la 1 no se evala la 2.

25.2_trans

25.3_trans

25.4_trans

25.5_trans

D_FF CON RISIGN_EDGE O FALLING_EDGE


25.6_D_ff_c

library ieee; use ieee.std_logic_1164.all; ENTITY d_FF_c is port ( CK, D Q END d_FF_c;

:IN :OUT

std_logic; std_logic);

ARCHITECTURE funcion OF d_FF_c is begin process (CK) begin -- if rising_edge(CK) THEN --activo con flanco de subida (para std_logic_1164) if falling_edge(CK) THEN --activo con flanco de bajada Q <= D; end if; end process; end funcion;

DFF CON RESET SNCRONO


25.7_D_FF_RST_SINC

library ieee; use ieee.std_logic_1164.all; ENTITY d_ff_rst_sinc IS PORT( D,CLK,RST :IN STD_LOGIC; Q :OUT STD_LOGIC); END d_ff_rst_sinc; ARCHITECTURE logica of d_ff_rst_sinc is begin process(CLK) begin if (CLK 'EVENT AND CLK='1') then if (RST='1') then Q<='0'; else Q<=D; end if; end if; end process; end logica;

DFF CON PRESET Y CLEAR ASNCRONAS


25.8_D.a_FF_PRE_CLR

25.8_D.b_FF_PRE_CLR

LIBRARY ieee; use ieee.std_logic_1164.all; entity d_ff_pre_clr is port ( D,CLK,PRE,CLR :IN std_logic; Q :OUT std_logic); end d_ff_pre_clr; architecture logica of d_ff_pre_clr is begin process(CLK,PRE,CLR) begin if CLR='1' then --CLEAR ASNCRONO Q<='0'; elsif PRE='1' then --PRESET ASNCRONO Q<='1'; elsif (CLK'event and CLK='1') then Q<=D; end if; end process; end logica;

LATCH DE 8 BITS ACTIVADO POR FLANCO


25.9_latch_8bits_flanco

library ieee; use ieee.std_logic_1164.all; ENTITY latch_8bits_flanco is port ( CK :IN D :IN Q :OUT END latch_8bits_flanco;

std_logic; std_logic_vector(7 downto 0); std_logic_vector (7 downto 0));

ARCHITECTURE funcion OF latch_8bits_flanco is begin process (CK) begin if (CK'EVENT AND CK='1') THEN Q <= D; end if; end process; end funcion;

26.1_trans

26.2_trans

SENTENCIA CASE-WHEN CASE expresin IS WHEN caso1 => Sentencias 1; WHEN caso2 => Sentencias 2; WHEN caso3 | caso4 => Sentencias 34; WHEN caso5 to caso7 => Sentencias 57; --obligatorio cuando no se contemplan --todos los casos Cdigo para el resto de los casos; END CASE; WHEN OTHERS =>

--cuando se cumpla caso3 o caso 4 --cuando se cumplen desde el caso5 -- hasta el caso 7

27_trans

27.2_trans

27.3_a_statmach

27.3_b_statmach

MQUINA DE ESTADOS 2 ESTADOS


ENTITY STATMACH IS PORT( CLK, INPUT,RESET OUTPUT END STATMACH;

:IN BIT; :OUT BIT);

ARCHITECTURE A OF STATMACH IS TYPE ESTADOS IS (S0, S1); SIGNAL ESTADO :ESTADOS; BEGIN PROCESS (CLK, RESET) BEGIN IF RESET='1' THEN

ESTADO <= S0; ELSIF (CLK'EVENT AND CLK='1') THEN CASE ESTADO IS WHEN S0 => ESTADO <= S1; WHEN S1 => IF INPUT='1' THEN ESTADO <= S0; ELSE ESTADO <= S1; END IF; END CASE; END IF; END PROCESS; OUTPUT <= '1' WHEN ESTADO=S1 ELSE '0'; END A; --mquina de Moore

27.3_c_statmach

SENTENCIAS CONCURRENTES
28_sent_concurrentes

Instanciaciones d1: a1: dff and2 PORT MAP (a, ck, s1,s2); PORT MAP (s2, din, ctrla);

Las sentencias concurrentes incluyen Ecuaciones booleanas Asignaciones condicionales (when-else) Asignaciones de seales seleccionadas (with-select-when) Instanciaciones de componentes (descripcin estructural) Ejemplos Booleanas x <= (a AND (NOT aux_1) OR (b AND aux_2); Asignaciones condicionales y <= d WHEN (aux_1 =1) ELSE c; Q(3) <=0 WHEN (x =1 AND aux_2 =0) ELSE 1;

-- dos guiones seguidos indican un comentario en VHDL

29.1_when_else

29.2_trans

ASIGNACIN CONDICIONAL WHEN-ELSE Realiza las mismas operaciones que IF dentro de un process etiqueta: Seal Destino <= Expresin1 WHEN Condicin ELSE Expresin2;
-- etiqueta opcional

Admite varios when etiqueta: Seal Destino <= Expresin1 WHEN Condicin1 ELSE
Expresin2 WHEN Condicin2 ELSE Expresin3 WHEN Condicin3 ELSE .............. ExpresinN WHEN CondicinN ELSE Expresin; -- Se asigna la primera condicin verdadera

29.3_trans

CODIFICADOR CON PRIORIDAD


INTEGER (por defecto 32 bits, reducir rango de valores con RANGE)

SUMADOR COMPLETO SENTENCIAS CONCURRENTES WHEN-ELSE


entity sumador_completo is port(a,b,ci :in bit; s,co :out bit); end sumador_completo; architecture flujo_datos of sumador_completo is begin s<='1' when (a='0' and b='1' and ci='0') else '1' when (a='1' and b='0' and ci='0') else '1' when (a='0' and b='0' and ci='1') else '1' when (a='1' and b='1' and ci='1') else '0'; --Tambin: -s<='1' when (a='0' and b='1' and ci='0') OR -when (a='1' and b='0' and ci='0') OR -when (a='0' and b='0' and ci='1') OR -when (a='1' and b='1' and ci='1') else -'0'; co<='1' when (a='1' and b='1' and ci='0') else '1' when (a='0' and b='1' and ci='1') else '1' when (a='1' and b='0' and ci='1') else '1' when (a='1' and b='1' and ci='1') else '0'; end flujo_datos;

29.4.a_sumador_completo

30.1_trans 30_with_select_when

SELECCIN DE FORMA CONCURRENTE WITH-SELECT-WHEN


Es equivalente a CASE en forma concurrente etiqueta: WITH expresin_seleccin SELECT Seal Destino <= Expresin1 WHEN Valor_Seleccin1, Expresin2 WHEN Valor_Seleccin2, .... ExpresinN WHEN OTHERS; No puede haber dos valores de seleccin iguales La clusula others debe aparecer si no se cubren todos los posibles valores de seleccin

30.2_trans

WITH-SELECT-WHEN
30.3_mux_4_wsw

library ieee; use ieee.std_logic_1164.all; ENTITY mux_4_wsw IS PORT( I3, I2, I1, I0 : IN STD_LOGIC; control : IN STD_LOGIC_VECTOR (1 downto 0); SALIDA : OUT STD_LOGIC); END mux_4_wsw; ARCHITECTURE logica OF mux_4_wsw IS BEGIN WITH control SELECT SALIDA <= I0 WHEN "00", I1 WHEN "01", I2 WHEN "10", I3 WHEN "11", 'Z' WHEN OTHERS; END logica;

31.2_trans 31_trans

INSTANCIACIN DE COMPONENTES

COMPONENTES DECLARADOS EN LA ARQUITECTURA

31.3_trans

31.4_trans

DECLARACIN DE COMPONENTES EN UN PAQUETE (PACKAGE)

PACKAGE MAXPLUS2 DE ALTERA

31.5_trans

31.5.a_macrofunction_74151b

INFORMACIN OBTENIDA DEL HELP DE MAX+PLUS II OLD-STYLE MACROFUNCTIONS

MULTIPLEXERS
74151B

32_deco_1de8_funcion

DECODIFICADOR 1 DE 8 FUNCIONES LGICAS


ENTITY deco_1de8_funcion IS PORT( a :IN bit_vector(2 DOWNTO 0); b :OUT bit_vector(7 DOWNTO 0)); END deco_1de8_funcion; ARCHITECTURE logica OF deco_1de8_funcion IS BEGIN b(0) <= NOT a(2) AND (NOT a(1)) AND (NOT a(0)); b(1) <= NOT a(2) AND (NOT a(1)) AND a(0); b(2) <= NOT a(2) AND a(1) AND (NOT a(0)); b(3) <= NOT a(2) AND a(1) AND a(0); b(4) <= a(2) AND (NOT a(1)) AND (NOT a(0)); b(5) <= a(2) AND (NOT a(1)) AND a(0); b(6) <= a(2) AND a(1) AND (NOT a(0)); b(7) <= a(2) AND a(1) AND a(0); END logica;

33_ deco_1de8_case

DECODIFICADOR 1 DE 8 CASE
C :IN BIT_VECTOR(2 DOWNTO 0);

C <= ( others => 0)

-- Asigna todo 0. -- Equivale a C <= 000;


--

C <= ( 0 => 1 others => 0) -- Asigna 1 al bit0 y resto todo 0. Equivale a C <= 001; ENTITY deco_1de8_case IS PORT( a :IN bit_vector(2 DOWNTO 0); b :OUT bit_vector(7 DOWNTO 0)); END deco_1de8_case; ARCHITECTURE logica OF deco_1de8_case IS BEGIN PROCESS(a) BEGIN CASE a IS WHEN "000" => b <= (0 =>'1', others => '0'); --"00000001";

WHEN "001" => b <= "00000010"; WHEN "010" => b <= "00000100"; WHEN "011" => b <= "00001000"; WHEN "100" => b <= "00010000"; WHEN "101" => b <= "00100000"; WHEN "110" => b <= "01000000"; WHEN "111" => b <= "10000000"; END CASE; END PROCESS; END logica;

34.1.a_ cont_16_rst_asinc_sign

end process;
34.1.b_ cont_16_rst_asinc_sign

CONTADOR BINARIO DE 4 BITS SEAL AUXILIAR SIGNAL


library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ENTITY cont_16_rst_asinc_sign IS PORT( impulsos, rst : IN Q : OUT END cont_16_rst_asinc_sign;

Q <= cont; end logica;


ASIGNACIN FUERA DEL PROCESO OK ASIGNACIN DENTRO DEL PROCESO => ERROR

STD_LOGIC; STD_LOGIC_VECTOR(3 downto 0));

ARCHITECTURE logica of cont_16_rst_asinc_sign is signal cont :std_logic_vector(3 downto 0); --seal auxiliar begin -- contador binario con reset asncrono process (rst, impulsos) begin if rst='1' then --reset asncrono cont <= "0000"; elsif (impulsos'event and impulsos='1') then --cuenta con flancos up cont <=cont+1; --suma aritmtica (librera unsigned) end if;

CONTADOR BINARIO DE 4 BITS VARIABLE AUXILIAR


library ieee; use ieee.std_logic_1164.all; ENTITY contador_16_rst_asinc IS PORT( impulsos, rst : IN STD_LOGIC; Q : OUT integer range 0 to 15); END contador_16_rst_asinc; ARCHITECTURE logica of contador_16_rst_asinc is begin -- contador binario con reset asncrono process (rst, impulsos) variable cont :integer range 0 to 15;--variable auxiliar begin if rst='1' then --reset asncrono cont := 0; elsif (impulsos'event and impulsos='1') then --cuenta con flancos up cont:=cont+1; end if; Q <= cont; end process; end logica;

34.2.b_contador_16_rst_asinc

34.1.c_ cont_16_rst_asinc_sign_b

CONTADOR BINARIO DE 4 BITS SEAL AUXILIAR SIGNAL


ASIGNACIN INCORRECTA library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ENTITY cont_16_rst_asinc_sign_b IS PORT( impulsos, rst :IN STD_LOGIC; Q :OUT STD_LOGIC_VECTOR(3 downto 0)); END cont_16_rst_asinc_sign_b;

ARCHITECTURE logica of cont_16_rst_asinc_sign_b is signal cont :std_logic_vector(3 downto 0); --seal auxiliar begin -- contador binario con reset asncrono process (rst, impulsos)

34.1.c_ cont_16_rst_asinc_sign_b

begin if rst='1' then --reset asncrono cont <= "0000"; elsif (impulsos'event and impulsos='1') then --cuenta con flancos up cont <=cont+1; Q <= cont; --esto asignara mal el valor de cont a Q end if; end process; end logica;

34.2.C_seal_variable

SEALES Y VARIABLES
LAS SEALES SE ACTUALIZAN CUANDO EL PROCESO SE SUSPENDE Y NO CUANDO EST EN ACTIVO LAS VARIABLES SE ACTUALIZAN EN EL ACTO SE RECOMIENDA UTILIZAR SEALES EN VEZ DE VARIABLES PARA MODELAR CIRCUITOS DIGITALES PORQUE SU COMPORTAMIENTO SE ACERCA MS AL HARDWARE

34.3_contador_10_rst_asinc_buffer

CONTADOR DECIMAL. SALIDA TIPO BUFFER STD_LOGIC_VECTOR


library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ENTITY contador_10_rst_asinc_buffer IS PORT( impulsos, rst Q : IN : BUFFER STD_LOGIC; STD_LOGIC_VECTOR (3 downto 0));

END contador_10_rst_asinc_buffer; ARCHITECTURE logica of contador_10_rst_asinc_buffer is begin -- contador decimal con reset asncrono process (impulsos) begin if rst='1' then Q <= "0000"; elsif (impulsos'event and impulsos='1') then --cuenta con flancos up if Q = "1001" then Q <= "0000"; else Q <= Q + 1; --necesaria use ieee.std_logic_unsigned.all end if; end if; end process; end logica;

34.4_ cont_10_rst_y_paralell_sinc_var

CONTADOR DECIMAL CON CARGA PARALELO Y RESET SNCRONAS Seal Auxiliar


LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; --Contador decimal con reset y carga paralelo sncronas --Empleo de una seal auxiliar ENTITY cont_10_rst_y_paralell_sinc_var IS PORT ( rst, ck, load :IN STD_LOGIC; P :IN STD_LOGIC_VECTOR (3 DOWNTO 0); Q :OUT STD_LOGIC_VECTOR (3 DOWNTO 0)); END cont_10_rst_y_paralell_sinc_var; ARCHITECTURE logica of cont_10_rst_y_paralell_sinc_var is SIGNAL Q_aux :STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN PROCESS (ck) BEGIN IF(ck'event and ck='1') THEN

IF rst='1' THEN Q_aux <= "0000"; ELSIF load='1' THEN Q_aux <= P; ELSIF Q_aux="1001" THEN Q_aux <= "0000"; ELSE Q_aux <= Q_aux + 1; END IF; END IF; END PROCESS; --COMBINACIONAL Q <= Q_aux; END logica;

35.1_convertidor_ bcd_e3

CONVERTIDOR DE CDIGO BCD-EXCESO 3


LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY convertidor_bcd_e3 IS PORT ( INPUT : IN STD_LOGIC_VECTOR (3 DOWNTO 0); OUTPUT : OUT STD_LOGIC_VECTOR (3 DOWNTO 0)); END convertidor_bcd_e3; ARCHITECTURE logica of convertidor_bcd_e3 IS BEGIN PROCESS (INPUT) BEGIN CASE INPUT IS WHEN "0000" => OUTPUT <= "0011"; WHEN "0001" => OUTPUT <= "0100"; WHEN "0010" => OUTPUT <= "0101"; WHEN "0011" => OUTPUT <= "0110"; WHEN "0100" => OUTPUT <= "0111"; WHEN "0101" => OUTPUT <= "1000"; WHEN "0110" => OUTPUT <= "1001"; WHEN "0111" => OUTPUT <= "1010";

WHEN "1000" => OUTPUT <= "1011"; WHEN "1001" => OUTPUT <= "1100"; WHEN OTHERS => OUTPUT <= "0000"; END CASE; END PROCESS; END logica;
35.1.b

CONVERTIDOR DE CDIGO BCD-EXCESO 3

35.2_doble_convertidor

DOBLE CONVERTIDOR DE CDIGO ENTRADA BCD SALIDAS EXCESO-3 Y AIKEN


LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; -- DOBLE CONVERTIDOR DE CDIGO -- ENTRADA BCD -- SALIDAS E3 o AIKEN ENTITY doble_convertidor IS PORT ( EN :IN STD_LOGIC; BCD :IN INTEGER RANGE 0 TO 15; O :OUT INTEGER RANGE 0 TO 15); END doble_convertidor; ARCHITECTURE logica OF doble_convertidor IS BEGIN PROCESS (EN, BCD) BEGIN IF EN='1' THEN -- SALIDA CDIGO EXCESO-3 CASE BCD IS

WHEN 0 => O <=3; WHEN 1 => O <=4; WHEN 2 => O <=5;


WHEN 3 => O <=6;

WHEN 4 => O <=7; WHEN 5 => O <=8; WHEN 6 => O <=9; WHEN 7 => O <=10; WHEN 8 => O <=11; WHEN 9 => O <=12; WHEN OTHERS => O <=15; END CASE; ELSE -- SALIDA CDIGO AIKEN CASE BCD IS WHEN 0 => O <=0; WHEN 1 => O <=1; WHEN 2 => O <=2; WHEN 3 => O <=3; WHEN 4 => O <=4; WHEN 5 => O <=11; WHEN 6 => O <=12; WHEN 7 => O <=13;

WHEN 8 => O <=14; WHEN 9 => O <=15; WHEN OTHERS => O <=8; END CASE; END IF; END PROCESS; END logica;

36_chip_select

GENERACIN DE CHIP-SELECT BLOQUES DE 8K


ENTITY chip_select IS PORT( A15,A14,A13,A12 :IN BIT; CS0,CS1,CS2,CS3,CS4,CS5,CS6,CS7 :OUT END chip_select;

BIT);

ARCHITECTURE mapa_de_memoria OF chip_select IS SIGNAL address :BIT_VECTOR (3 DOWNTO 0); BEGIN address <= A15&A14&A13&A12; CS0 <='0' WHEN (address >= "0000") and (address <= "0001") ELSE '1'; CS1 <='0' WHEN (address >= "0010") AND (address <= "0011") ELSE '1'; CS2 <='0' WHEN (address >= "0100") AND (address <= "0101") ELSE '1'; CS3 <='0' WHEN (address >= "0110") AND (address <= "0111") ELSE '1'; CS4 <='0' WHEN (address >= x"8") AND (address <= x"9") ELSE '1'; CS5 <='0' WHEN (address >= x"A") AND (address <= "1011") ELSE '1'; CS6 <='0' WHEN (address >= x"C") AND (address <= "1101") ELSE '1'; CS7 <='0' WHEN (address >= x"E") ELSE '1'; END mapa_de_memoria;

37.2.a_deco_bdc_10_vhdl_7442

37.2.b_deco_bdc_10_vhdl_7442

DISEO CON CDIGO VHDL Y MACROFUNCINES DE ALTERA

--vhdl + macrofunciones altera --aplicacin contador decimal con salida decodificada --contador cdigo vhdl y decodificador macrofuncin a_7442

LIBRARY ALTERA; USE ALTERA.MAXPLUS2.ALL; LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; entity deco_bdc_10_vhdl_7442 is PORT ( rst, ck :IN STD_LOGIC; sal :OUT STD_LOGIC_VECTOR (9 DOWNTO 0)); END deco_bdc_10_vhdl_7442; ARCHITECTURE logica of deco_bdc_10_vhdl_7442 is SIGNAL Q :STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN

PROCESS (ck) BEGIN IF(ck'event and ck='1') THEN IF rst='1' THEN Q <= "0000"; ELSIF Q="1001" THEN Q <= "0000"; ELSE Q <= Q + 1; END IF; END IF; END PROCESS; deco: a_7442 port map( Q(3), Q(2), Q(1), Q(0), sal(0), sal(1), sal(2), sal(3), sal(4), sal(5), sal(6), sal(7), sal(8), sal(9)); END logica;

37.2.c_deco_bdc_10_vhdl_7442

37.2.d_deco_bdc_10_vhdl_7442

37.2.e_deco_bdc_10_vhdl_7442

37.2.f_deco_bdc_10_vhdl_7442

38.a_cont_latch_con_package

38.b_cont_latch_con_package

EMPLEO DE PACKAGES DEFINIDOS POR EL USUARIO LIBRARY: WORK PACKAGE: MY_COMPONENTS COMPONENTES DEL PACKAGE: LATCH_4 latch de 4 bits sincronizado por flanco con reset asncrono CONT_10_RST_ASINC_SIGNAL contador decimal, reset asncrono
Diseo final de un contador decimal cuya salida se latchea con una seal enable (empleamos un contador y un latch) 1 Ficheros VHDL de los futuros componentes del Package (latch y contador) latch_4.vhd y cont_10_rst_asinc_signal.vhd 2 Fichero del Package my_componests.vhd 3 Fichero vhdl principal que emplea los componentes del Package

38.c_cont_latch_con_package

38.d_cont_latch_con_package

1 Ficheros de los componentes: A) Nombre: latch_4.vhd --creacin de un latch de 4 bits para usarlo posteriormente --como macrofuncin definida por el usuario (package) library ieee; use ieee.std_logic_1164.all; entity latch_4 is port( D :in std_logic_vector(3 downto 0); rst,clk :in std_logic; Q :out std_logic_vector(3 downto 0)); end latch_4; architecture funcion of latch_4 is begin process(rst,clk) begin if rst='1' then Q <="0000"; elsif (clk'event and clk='1') then Q <= D; end if; end process; end funcion;

B) Nombre: cont_10_rst_asinc_signal.vhd LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY cont_10_rst_asinc_signal IS PORT ( rst, ck :IN STD_LOGIC; Q :OUT STD_LOGIC_VECTOR (3 DOWNTO 0)); END cont_10_rst_asinc_signal; ARCHITECTURE logica of cont_10_rst_asinc_signal is SIGNAL Q_aux :STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN PROCESS (ck, rst) BEGIN IF rst='1' THEN Q_aux <= "0000"; ELSIF(ck'event and ck='1') THEN IF Q_aux="1001" THEN Q_aux <= "0000"; ELSE Q_aux <= Q_aux + 1; END IF; END IF; END PROCESS;

38.e_cont_latch_con_package 38.f_cont_latch_con_package

2 Fichero del package Nombre: my_components.vhd library ieee; use ieee.std_logic_1164.all; package my_components is component latch_4 port( D :IN rst,clk :IN Q :OUT end component;

3 Fichero vhdl principal que emplea los componentes del package Nombre: cont_latch_con_package.vhd

library ieee; use ieee.std_logic_1164.all; library work; use work.my_components.all; entity cont_latch_con_package is port( impulsos, rst, enable :in std_logic; salidas :out std_logic_vector(3 downto 0)); end cont_latch_con_package; architecture funcion of cont_latch_con_package is signal aux :std_logic_vector(3 downto 0); begin contador: cont_10_rst_asinc_signal port map (rst, impulsos, aux); latch_4a: latch_4 port map (aux, rst, enable, salidas); end funcion;

std_logic_vector(3 downto 0); std_logic; std_logic_vector(3 downto 0));

component cont_10_rst_asinc_signal port ( rst, ck :IN std_logic; Q :OUT std_logic_vector(3 downto 0)); end component; end my_components;

38.g_cont_latch_con_package

39.1_aritm_std_logic_unsig_b

39.1.b_aritm_std_logic_unsig_b

OPERACIONES ARITMTICAS CON STD_LOGIC_VECTOR SUMA, RESTA, MULTIPLICACIN


library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity aritm_std_logic_unsig_b is port ( A, B :in std_logic_vector(3 downto 0); SUM1, SUM2, SUM3, RESTA1, PROD1 :out std_logic_vector(3 downto 0)); end aritm_std_logic_unsig_b; architecture funcion of aritm_std_logic_unsig_b is begin SUM1 <= A + B; SUM2 <= A + "1000"; SUM3 <= A + 9; RESTA1 <= A - B; -- PROD1 <= A * 2; no admite el producto de un std_logic_vector con un entero PROD1 <= A * "0010"; --DIV1 <= A/2 ; no admite divisin end funcion;

39_aritm_integer

OPERACIONES ARITMTICAS CON NMEROS ENTEROS


entity aritm_integer is port ( A, B O1, O2, O3, O4, O5, O6 end aritm_integer;

: in integer range 0 to 15; : out integer range 0 to 15);

architecture funcion of aritm_integer is begin O1 <= A + 1; --O2 <= A + "1001"; da error O2 <= 2*A; O3 <= A - B; O4 <= A + B; O5 <= B - 1; O6 <= A + 3; End funcion;

39.2_aritm_std_logic_sig

39.2.b_aritm_std_logic_sig

OPERACIONES ARITMTICAS CON STD_LOGIC_VECTOR


library ieee; use ieee.std_logic_1164.all; --use ieee.std_logic_arith.all; use ieee.std_logic_signed.all; entity aritm_std_logic_sig is port ( A, B :in std_logic_vector(3 downto 0); SUM1, SUM2, SUM3 :out std_logic_vector(3 downto 0)); end aritm_std_logic_sig; architecture funcion of aritm_std_logic_sig is begin SUM1 <= A + B; SUM2 <= A + "0011"; --SUM2 <= A + 5; SUM3 <= A + B + 2; end funcion;

Si

SUM2 =A + 5 LOS RESULTADOS DE LA SIMULACIN SON:

40_mux_varios library ieee; use ieee.std_logic_1164.all; ENTITY mux_4_when_a IS PORT( I3, I2, I1, I0, S0, S1 : IN STD_LOGIC; SALIDA : OUT STD_LOGIC); END mux_4_when_a; ARCHITECTURE logica OF mux_4_when_a IS BEGIN SALIDA <= I0 WHEN (S1='0' AND S0='0') ELSE I1 WHEN (S1='0' AND S0='1') ELSE I2 WHEN (S1='1' AND S0='0') ELSE I3; END logica; ************************************************************ library ieee; use ieee.std_logic_1164.all; ENTITY mux_4_when_b IS PORT(

I3, I2, I1, I0 control SALIDA END mux_4_when_b;

: IN STD_LOGIC; : IN STD_LOGIC_VECTOR (1 downto 0); : OUT STD_LOGIC);

ARCHITECTURE logica OF mux_4_when_b IS BEGIN SALIDA <= I0 WHEN control = "00" ELSE I1 WHEN control = "01" ELSE I2 WHEN control = "10" ELSE I3; END logica; ************************************************************ library ieee; use ieee.std_logic_1164.all; ENTITY mux_4_when_c IS PORT( I3, I2, I1, I0, S0, S1 : IN STD_LOGIC; SALIDA : OUT STD_LOGIC); END mux_4_when_c; ARCHITECTURE logica OF mux_4_when_c IS

signal control: std_logic_vector(1 downto 0); BEGIN control <=S1&S0; --union de seales SALIDA <= I0 WHEN control="00" ELSE I1 WHEN control="01" ELSE I2 WHEN control="10" ELSE I3; END logica; ************************************************** library ieee; use ieee.std_logic_1164.all; ENTITY mux_4_wsw IS PORT( I3, I2, I1, I0 : IN STD_LOGIC; control : IN STD_LOGIC_VECTOR (1 downto 0); SALIDA : OUT STD_LOGIC); END mux_4_wsw; ARCHITECTURE logica OF mux_4_wsw IS BEGIN WITH control SELECT SALIDA <= I0 WHEN "00",

I1 WHEN "01", I2 WHEN "10", I3 WHEN "11", 'Z' WHEN OTHERS; END logica; ************************************************** library ieee; use ieee.std_logic_1164.all; ENTITY mux_4_case_a IS PORT ( I3, I2, I1, I0 :IN STD_LOGIC; CONTROL :IN integer range 0 to 3; SALIDA :OUT STD_LOGIC); END mux_4_case_a; ARCHITECTURE funcion of mux_4_case_a is BEGIN process (I3,I2,I1,I0,CONTROL) begin CASE CONTROL IS WHEN 0 => SALIDA <=I0; WHEN 1 => SALIDA <=I1;

WHEN 2 => SALIDA <=I2; WHEN 3 => SALIDA <=I3; END CASE; END process; END funcion; *************************************************** library ieee; use ieee.std_logic_1164.all; ENTITY mux_4_case_c IS PORT ( I3, I2, I1, I0 :IN STD_LOGIC; CONTROL :IN STD_LOGIC_VECTOR (1 DOWNTO 0); SALIDA :OUT STD_LOGIC); END mux_4_case_c; ARCHITECTURE funcion of mux_4_case_c is BEGIN PROCESS (I3, I2, I1, I0, CONTROL) BEGIN CASE CONTROL IS -- IF CASE LOOP deben estar dentro de un proceso WHEN "00" => SALIDA <=I0;

WHEN "01" => SALIDA <=I1; WHEN "10" => SALIDA <=I2; WHEN "11" => SALIDA <=I3; WHEN OTHERS => SALIDA <= 'Z'; END CASE; END PROCESS; END funcion; *************************************************** library ieee; use ieee.std_logic_1164.all; ENTITY mux_4_if_a IS PORT ( I3, I2, I1, I0 :IN STD_LOGIC; CONTROL :IN STD_LOGIC_VECTOR (1 DOWNTO 0); SALIDA :OUT STD_LOGIC); END mux_4_if_a;

ARCHITECTURE funcion of mux_4_if_a is BEGIN PROCESS (I3,I2,I1,I0,CONTROL) BEGIN IF CONTROL="00" THEN SALIDA <=I0; ELSIF CONTROL="01" THEN SALIDA <=I1; ELSIF CONTROL="10" THEN SALIDA <=I2; ELSE SALIDA <=I3; END IF; END PROCESS; END funcion; *************************************************** library ieee; use ieee.std_logic_1164.all; ENTITY mux_4_if_b IS PORT ( Input CONTROL SALIDA END mux_4_if_b;

PROCESS (Input,CONTROL) BEGIN IF CONTROL="00" THEN SALIDA <=Input(0); ELSIF CONTROL="01" THEN SALIDA <=Input(1); ELSIF CONTROL="10" THEN SALIDA <=Input(2); ELSIF CONTROL="11" THEN SALIDA <=Input(3); END IF; END PROCESS; END funcion;

:IN STD_LOGIC_VECTOR (3 DOWNTO 0); :IN STD_LOGIC_VECTOR (1 DOWNTO 0); :OUT STD_LOGIC);

ARCHITECTURE funcion of mux_4_if_b is BEGIN

42.a_mealy_secuencia001

DISEO DE UNA MQUINA SECUENCIAL (MEALY) DETECCIN SNCRONA DE LA SECUENCIA 0-0-1


LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mealy_secuencia001 IS PORT ( entrada, clk, rst : IN STD_LOGIC; salida : OUT STD_LOGIC); END mealy_secuencia001; -- DETECCIN SNCRONA DE LA SECUENCIA 0-0-1 -- DISEO MEDIANTE UNA MQUINA DE MEALY ARCHITECTURE funcion of mealy_secuencia001 is type estados is (E1C, E2C, FINAL); signal estado : estados; begin process (clk, rst) begin if (rst='1') then estado <= E1C; --reset asncrono salida <= '0'; elsif (clk'event and clk='1') then case estado is when E1C =>

if (entrada ='0') then


42.b_mealy_secuencia001

estado <= E2C; salida <= '0'; else estado <= E1C; salida <='0'; end if; when E2C => if (entrada ='0') then estado <= FINAL; salida <= '0'; else estado <= E1C; salida <='0'; end if; when FINAL => if (entrada ='1') then estado <= E1C; salida <= '1'; else estado <= FINAL; salida <='0'; end if; end case; end if;

end process;
42.c_mealy_secuencia001

42.d_mealy_secuencia001

-- si la salida se genera fuera del proceso mediante salida <='1' when (estado = FINAL) and (entrada ='1') else '0' ; --en este caso la salida se activa cuando el estado es el final y en el --momento de aplicarse un '1' en la entrada pero sin tener en cuenta el --reloj . El resultado no sera correcto --Si la salida se obtiene dentro del proceso la salida se activa con el -- flanco del reloj cuando el sistema est en el estado final y adems se -- haya aplicado un '1' en la entrada end funcion;

RESULTADOS DE LA SIMULACIN,

44.1_moore_secuencia_001

DISEO DE UNA MQUINA SECUENCIAL (MOORE) DETECCIN SNCRONA DE LA SECUENCIA 0-0-1


Asignacin de los cdigos a los estados por el usuario Estado_actual y Estado_siguiente (2 procesos) library ieee; use ieee.std_logic_1164.all; ENTITY moore_secuencia_001 IS PORT( entrada, clk, rst : IN std_logic; salida : OUT std_logic ); END moore_secuencia_001; ARCHITECTURE funcion of moore_secuencia_001 IS -- declaraciones signal estado_actual, estado_sig : std_logic_vector (2 downto 0); constant S0 : std_logic_vector (2 downto 0) := "000"; constant S1 : std_logic_vector (2 downto 0) := "001"; constant S2 : std_logic_vector (2 downto 0) := "010"; constant S3 : std_logic_vector (2 downto 0) := "100"; -- cuerpo de la arquitectura begin

process (clk, rst) --proceso secuencial begin if (rst='1') then estado_actual <= S0; elsif (clk'event and clk='1') then estado_actual <= estado_sig; end if; end process; process (entrada, estado_actual) --proceso combinacional begin case estado_actual is when S0 => if (entrada = '0') then estado_sig <= S1; --tambin admite: estado_sig <= "000"; else estado_sig <= S0; end if; when S1 => if (entrada ='0') then estado_sig <= S2; else estado_sig <= S0; end if; when S2 => if (entrada ='0') then estado_sig <= S2; else estado_sig <= S3; end if;

when S3 => if (entrada ='0') then estado_sig <= S1; else estado_sig <= S0; end if; when others => --con altera es obligatorio considerar --todos los casos, si no da error estado_sig <= S0; end case; end process; salida <= estado_actual(2); end funcion;

44.2_moore_secuencia_001_b

DISEO DE UNA MQUINA SECUENCIAL (MOORE) DETECCIN SNCRONA DE LA SECUENCIA 0-0-1


Versin 2. Nombres de estados. Signal estado tipo estados.

process (clk, rst) begin if (rst='1') then estado <= S0; --reset asncrono elsif (clk'event and clk='1') then

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY moore_secuencia_001_b IS PORT ( entrada, clk, rst : IN STD_LOGIC; salida : OUT STD_LOGIC); END moore_secuencia_001_b; -- DETECCIN SNCRONA DE LA SECUENCIA 0-0-1 -- DISEO MEDIANTE UNA MQUINA DE MOORE ARCHITECTURE funcion of moore_secuencia_001_b is type estados is (S0, S1, S2, S3); signal estado : estados; begin

44.2.b_moore_secuencia_001_b

case estado is when S0 => if (entrada ='0') then estado <= S1; else estado <= S0; end if; when S1 => if (entrada ='0') then estado <= S2; else estado <= S0; end if; when S2 => if (entrada ='1') then estado <= S3; else estado <= S2; end if; when S3 => if (entrada ='1') then estado <= S0; else estado <= S1; end if;

end case; end if; end process; salida <='1' when (estado = S3); end funcion;
44.2.c_moore_secuencia_001_b

_trans

-11 => 2 euros -- estados vacio, hay05, hay10, hay15, fin (hay 2euros o ms) -- salida activa para suministrar refresco library ieee; use ieee.std_logic_1164.all; entity refres_1 is port ( rst, ck, A, B: salida: end refres_1;
_trans

in

std_logic; out std_logic);

architecture comportamiento of refres_1 is


43.a_refres_1

MQUINA DE REFRESCOS SIN CAMBIO


--mquina de refrescos sin cambio --precio 2 euros --tipos monedas 0.5, 1, 2 euros --monedero detecta tipo de monedas AB -00 => NO monedas -01 => 50c. -10 => 1 euro

type estados is (vacio, hay05, hay10, hay15, fin); signal estado: estados; begin process (rst, ck) begin if rst = '1' then estado <= vacio; elsif (ck'event and ck='1') then case estado is

43.b_refres_1

when vacio => if A='0' AND B='0' then estado <= vacio; elsif A='0' AND B='1' then estado <= hay05; elsif A='1' AND B='0' then estado <= hay10; elsif A='1' AND B='1' then estado <= fin; end if; when hay05 => if A='0' AND B='0' then estado <= hay05; elsif A='0' AND B='1' then estado <= hay10; elsif A='1' AND B='0' then estado <= hay15; elsif A='1' AND B='1' then estado <= fin; end if; when hay10 => if A='0' AND B='0' then estado <= hay10; elsif A='0' AND B='1' then estado <= hay15;

elsif A='1' then estado <= fin; end if; when hay15 => if A='0' AND B='0' then estado <= hay15; elsif A='1' OR B='1' then estado <= fin; end if;
43.c_refres_1

when fin => estado <= vacio; end case; end if; end process; salida <= '1' when (estado = fin); end comportamiento;

45.a_cont_deco_carry_2_trans

45.b_cont_deco_carry_2_trans

CONTADOR DECIMAL CON SALIDA DECODIFICADA Y CARRY CDIGO DE LOS ESTADOS DEFINIDOS POR EL USUARIO
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY cont_deco_carry_2 IS PORT ( Input, RST :IN Carry :OUT Q :BUFFER END cont_deco_carry_2;

STD_LOGIC; STD_LOGIC; STD_LOGIC_VECTOR(9 DOWNTO 0));

ARCHITECTURE logica OF cont_deco_carry_2 is SIGNAL ESTADO :STD_LOGIC_VECTOR(9 DOWNTO 0); CONSTANT S0 :STD_LOGIC_VECTOR (9 DOWNTO 0) CONSTANT S1 :STD_LOGIC_VECTOR (9 DOWNTO 0) CONSTANT S2 :STD_LOGIC_VECTOR (9 DOWNTO 0) CONSTANT S3 :STD_LOGIC_VECTOR (9 DOWNTO 0) CONSTANT S4 :STD_LOGIC_VECTOR (9 DOWNTO 0) CONSTANT S5 :STD_LOGIC_VECTOR (9 DOWNTO 0) CONSTANT S6 :STD_LOGIC_VECTOR (9 DOWNTO 0) CONSTANT S7 :STD_LOGIC_VECTOR (9 DOWNTO 0) CONSTANT S8 :STD_LOGIC_VECTOR (9 DOWNTO 0)

:="0000000001"; :="0000000010"; :="0000000100"; :="0000001000"; :="0000010000"; :="0000100000"; :="0001000000"; :="0010000000"; :="0100000000";

CONSTANT S9 :STD_LOGIC_VECTOR (9 DOWNTO 0) :="1000000000"; BEGIN PROCESS (Input, RST) BEGIN IF RST = '1' THEN ESTADO <=S0; ELSIF (Input'event AND Input='0') THEN -- Contador con flancos de bajada CASE ESTADO IS WHEN S0 => ESTADO <= S1; WHEN S1 => ESTADO <= S2; WHEN S2 => ESTADO <= S3; WHEN S3 => ESTADO <= S4; WHEN S4 => ESTADO <= S5; WHEN S5 => ESTADO <= S6; WHEN S6 => ESTADO <= S7; WHEN S7 => ESTADO <= S8; WHEN S8 => ESTADO <= S9; WHEN S9 => ESTADO <= S0; WHEN OTHERS => ESTADO <= S0; END CASE; END IF; END PROCESS; CARRY <= '1' WHEN ESTADO=S9 ELSE '0'; Q <= ESTADO; END logica;

45.c_cont_deco_carry_2_trans

47_semaforo_tren_b_trans

SEMFORO TREN
Versin 2 Salida depende de los estados y se asigna fuera del proceso entity semaforo_tren_b is port( rst,ck,sensor_a, sensor_b semf end semaforo_tren_b;

:IN

bit; :OUT bit);

architecture logica of semaforo_tren_b is type estados is (reposo, entra_por_a, entra_por_b, saliendo); signal estado :estados; begin process(rst,ck) begin if rst='1' then estado <= reposo; elsif (ck'event and ck='1') then case estado is when reposo => if (sensor_a ='1') then estado <= entra_por_a; elsif (sensor_b ='1') then estado <= entra_por_b; end if;

when entra_por_a => if (sensor_a ='1') then estado <= entra_por_a; elsif (sensor_a ='0' and sensor_b ='0') then estado <= entra_por_a; elsif (sensor_b ='1') then estado <= saliendo; end if; when entra_por_b => if (sensor_b ='1') then estado <= entra_por_b; elsif (sensor_a ='0' and sensor_b ='0') then estado <= entra_por_b; elsif (sensor_a ='1') then estado <= saliendo; end if; when saliendo => if (sensor_a ='1' or sensor_b ='1') then estado <= saliendo; elsif (sensor_a ='0' and sensor_b ='0') then estado <= reposo; end if; end case; end if; end process; semf <= '1' when (estado = entra_por_a) OR (estado = entra_por_b) OR (estado = saliendo) else '0';

--activacin del semforo dependiendo del estado (simultneamente no en sincronismo con ck) end logica;

48.2.a_semaforo_sasb_moore

48.2.b_semaforo_sasb_moore

CONTROL SEMFOROS CON 2 SENSORES SA Y SA (MOORE)


ENTITY semaforo_sasb_moore IS PORT (SA, SB, CLK, Reset :IN BIT; RA_AA_VA_RB_AB_VB :OUT BIT_VECTOR (5 downto 0)); END semaforo_sasb_moore; ARCHITECTURE logica OF semaforo_sasb_moore IS SIGNAL SENSOR :bit_vector(1 downto 0); TYPE ESTADOS IS (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11); SIGNAL ESTADO :ESTADOS; BEGIN SENSOR <= SA&SB; PROCESS (Reset, CLK) BEGIN IF Reset='1' THEN ESTADO <= S0; ELSIF (CLK'EVENT AND CLK='1') THEN CASE ESTADO IS WHEN S0 => IF SENSOR = "00" THEN

ESTADO <= S1; ELSIF SENSOR = "01" THEN ESTADO <= S4; ELSIF SENSOR = "11" THEN ESTADO <= S1; END IF; WHEN S1 => ESTADO <= S2; WHEN S2 => ESTADO <= S3; WHEN S3 => ESTADO <= S4; WHEN S4 => ESTADO <= S5; WHEN S5 => ESTADO <= S6; WHEN S6 => IF SENSOR <= "00" THEN ESTADO <= S7; ELSIF SENSOR = "01" THEN ESTADO <= S6;

48.2.c_semaforo_sasb_moore

48.2.d_semaforo_sasb_moore

ELSIF SENSOR = "10" THEN ESTADO <= S10; ELSIF SENSOR = "11" THEN ESTADO <= S7; END IF; WHEN S7 => ESTADO <= S8; WHEN S8 => ESTADO <= S9; WHEN S9 => ESTADO <= S10; WHEN S10 => ESTADO <= S11; WHEN S11 => ESTADO <= S0; END CASE; END IF; END PROCESS; RA_AA_VA_RB_AB_VB <= "001100" WHEN (ESTADO=S0 OR ESTADO=S1 OR ESTADO=S2 OR ESTADO=S3 OR ESTADO=S4) ELSE

"010100" WHEN ESTADO=S5 ELSE "100001" WHEN (ESTADO=S6 OR ESTADO=S7 OR ESTADO=S8 OR ESTADO=S9 OR ESTADO=S10) ELSE "100010" WHEN ESTADO=S11 ELSE "100100"; END LOGICA;

48.2.e_semaforo_sasb_moore

49.1.a_cocina_control_conmutador

CONTROL PARA UNA COCINA ELCTRICA


--CONTROL PARA UNA COCINA ELCTRICA --Entrada conmutador 7 posiciones del 0 al 6 (seal de control de 7 bits) --Cada posicin se codifica (control_aux) de acuerdo con el % de la potencia total para esa posicin -POSICIN cdigo-conmutador % potencia cdigo(control-aux de 5bits) -posicin 0 0000001 0% 00000-0 -posicin 1 0000010 15% 00101-5 -posicin 2 0000100 30% 01001-9 -posicin 3 0001000 45% 01101-13 -posicin 4 0010000 60% 10010-18 -posicin 5 0100000 90% 11011-27 -posicin 6 1000000 100% 11110-30 --La seal codificada (control_aux) del conmutador se compara con el estado de un contador --El contador es de mdulo 30. Salidas Q (Q4Q3Q2Q1Q0) --Si el cdigo control_aux es mayor que el estado del contador la salida se pone a nivel alto --Esta salida controlara el elemento de potencia de la cocina library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;

49.1.b_cocina_control_conmutador

entity cocina_control_conmutador is port ( RST, CK :IN std_logic; CONTROL :IN std_logic_vector(6 downto 0); SALIDA :OUT std_logic); end cocina_control_conmutador; architecture logica of cocina_control_conmutador is signal Q: std_logic_vector(4 downto 0); signal control_aux: std_logic_vector(4 downto 0); begin control_aux <="00000" when control="0000001" else "00101" when control="0000010" else "01001" when control="0000100" else "01101" when control="0001000" else "10010" when control="0010000" else "11011" when control="0100000" else "11110" when control="1000000" else "00000"; --posicin 0 del conmutador de la cocina --posicin 1 del conmutador de la cocina --posicin 2 del conmutador de la cocina --posicin 3 del conmutador de la cocina --posicin 4 del conmutador de la cocina --posicin 5 del conmutador de la cocina --posicin 6 del conmutador de la cocina

49.1.c_cocina_control_conmutador

process (CK, RST) begin if RST='1' then Q <= "00000" ; elsif (CK'event and CK='1') then if Q = "11101" then --contador a 29 (mdulo 30) Q <= "00000"; else Q <= Q + 1; end if; end if; end process; process (control_aux, Q) begin if control_aux > Q then SALIDA <='1'; else SALIDA <= '0'; end if; end process; end logica;

RESULTADOS DE SIMULACIONES PARA DIFERENTES POSICIONES DEL CONMUTADOR DE ENTRADA 1) CONMUTADOR EN POSICIN 0 COCINA APAGADA. SALIDA PERMANENTEMENTE A NIVEL BAJO

DETALLE DE LA SIMULACIN

49.1.d_cocina_control_conmutador

49.1.e_cocina_control_conmutador

CONMUTADOR EN POSICIN 2 30% DE LA POTENCIA. SALIDA A NIVEL ALTO EL 30% DEL TIEMPO

2) CONMUTADOR EN LA POSICIN 5 90% DE LA POTENCIA

DETALLE DE LA SIMULACIN DETALLE DE LA SIMULACIN

49.1.f_cocina_control_conmutador

CONMUTADOR EN POSICIN 6 100% DE POTENCIA

_trans

50.a_motor_p_a_p_simple_trans

MTODO SIMPLE CONTROL DE UN MOTOR PASO A PASO


--Control de un motor paso a paso --Diseo mediante una mquina de estados tipo moore --Necesarios 4 estados PASO1, PASO2, PASO3, PASO4 (mediante 2 bits) --Cuatro salidas D1, D2, D3, D4 para activar los devanados mediante un driver --externo --seal de sincronismo CLK que determina la velocidad de giro --Cada impulso de reloj el motor gira un paso --entrada de marcha o paro M. Si M=1 se mantiene la excitacin actual. Si M=0 se --aplican --las salidas para el siguiente paso --Sentido de giro depende de SG, si SG=1 CW, si SG=0 CCW. --Seales a aplicar a los devanados del motor. Sentido CW --En paso10101 (salidas D4-D3-D2-D1) --En paso21001 --En paso31010 --En paso40110 --El sentido CCW los pasos en sentido inverso. --Cuando se active el reset asncrono RST, las salidas se activan a los valores del --estado paso1.

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity motor_p_a_p_simple is port( CLK, RST, SG, M D1, D2, D3, D4 end motor_p_a_p_simple;

:IN :OUT

std_logic; std_logic);
50.b_motor_p_a_p_simple_trans

architecture funcion of motor_p_a_p_simple is --Declaraciones signal estado_actual, estado_siguiente :std_logic_vector(1 downto 0); --para 4 estados basta con 2 bits. constant paso1 :std_logic_vector(1 downto 0) :="00"; constant paso2 :std_logic_vector(1 downto 0) :="01"; constant paso3 :std_logic_vector(1 downto 0) :="11"; constant paso4 :std_logic_vector(1 downto 0) :="10"; begin --Definicin de la mquina de estados (moore) cambio_estado: process(CLK, RST) begin

if RST='1' then estado_actual <= paso1; elsif (CLK'event and CLK='1') then estado_actual <= estado_siguiente; end if; end process cambio_estado; maquina_de_estados: process(estado_actual, M, SG) begin case estado_actual is when paso1 => if (M='1') then estado_siguiente <= paso1; --no cambia de estado elsif (SG='1') then estado_siguiente <= paso2; --sentido CW else estado_siguiente <= paso4; --sentido CCW end if; when paso2 =>

50.c_motor_p_a_p_simple_trans

if (M='1') then estado_siguiente <= paso2; elsif (SG='1') then estado_siguiente <= paso3; else estado_siguiente <= paso1; end if; when paso3 => if (M='1') then estado_siguiente <= paso3; elsif (SG='1') then estado_siguiente <= paso4; else estado_siguiente <= paso2; end if; when paso4 => if (M='1') then estado_siguiente <= paso4; elsif (SG='1') then estado_siguiente <= paso1; else estado_siguiente <= paso3; end if; when others =>

--no cambia de estado --sentido CW --sentido CCW

--no cambia de estado --sentido CW --sentido CCW

--no cambia de estado --sentido CW --sentido CCW

estado_siguiente <= paso1; end case; end process maquina_de_estados; --Activacin de las salidas. --Se pueden activar teniendo en cuenta los estados (Moore) D1 <= not(estado_actual(1)); D2 <= estado_actual(1); D3 <= not (estado_actual(0)); D4 <= estado_actual(0); end funcion;
50.d_motor_p_a_p_simple_trans

53.a_registro_for_trans

REGISTRO DE DESPLAZAMIENTO DE 10 ETAPAS


ENTRADA SERIE Y SALIDA PARALELO EMPLEO DE BUCLES (dentro de procesos) --empleo de bucles --registro de desplazamiento de 10 etapas --entrada serie, salidas paralelo ENTITY registro_for IS PORT ( rst,entrada,ck Q END registro_for;

ELSE IF (ck'event AND ck='1') THEN Q(0) <= entrada; FOR n IN 1 TO 9 LOOP Q(n) <= Q(n-1); END LOOP; END IF; END IF; END PROCESS; END logica;

:IN

bit; :BUFFER bit_vector (9 downto 0));

ARCHITECTURE logica of registro_for IS BEGIN PROCESS(rst,ck) BEGIN IF rst='1' THEN FOR n IN 0 TO 9 LOOP Q(n) <= '0'; END LOOP;

54.a_ refres_change_display_trans

MQUINA DE REFRESCOS CON CAMBIO E INDICACIN DE MONEDAS INTRODUCIDAS CON DOS DISPLAYS
--mquina de refrescos con cambio --visualizacin con displays --precio 2 euros --tipos monedas 0.5, 1, 2 euros --monedero detecta tipo de monedas AB -00 => NO monedas -01 => 50c. -10 => 1 euro -11 => 2 euros -- estados vacio, hay05, hay10, hay15, hay20, hay25, hay30, hay35 -- salida se activa para suministrar refresco

library ieee; use ieee.std_logic_1164.all; entity refres_change_display is port ( rst, ck, A, B :in std_logic; salida, dev05, dev10 :out std_logic; Unidades :out std_logic_vector(1 downto 0); Decimas :out std_logic_vector(2 downto 0)); end refres_change_display;

--unidades de euro --dcimas de euro

architecture comportamiento of refres_change_display is type estados is (vacio, hay05, hay10, hay15, hay20, hay25, hay30, hay35); signal estado :estados; begin process (rst, ck) begin if rst = '1' then estado <= vacio; elsif (ck'event and ck='1') then case estado is when vacio => if A='0' AND B='0' then

estado <= vacio; elsif A='0' AND B='1' then estado <= hay05; elsif A='1' AND B='0' then estado <= hay10; elsif A='1' AND B='1' then estado <= hay20; end if; when hay05 => if A='0' AND B='0' then estado <= hay05; elsif A='0' AND B='1' then estado <= hay10; elsif A='1' AND B='0' then estado <= hay15; elsif A='1' AND B='1' then estado <= hay25; end if; when hay10 => if A='0' AND B='0' then estado <= hay10; elsif A='0' AND B='1' then estado <= hay15;

elsif A='1' AND B='0' then estado <= hay20; elsif A='1' AND B='1' then estado <= hay30; end if; when hay15 => if A='0' AND B='0' then estado <= hay15; elsif A='0' AND B='1' then estado <= hay20; elsif A='1' AND B='0' then estado <= hay25; elsif A='1' AND B='1' then estado <= hay35; end if; when hay20 => estado <= vacio; when hay25 => estado <= vacio; when hay30 => estado <= vacio; when hay35 => estado <= vacio;

end case; end if; end process;

salida <='1' when (estado = hay20) OR (estado = hay25) OR (estado = hay30) OR (estado = hay35) ELSE '0'; dev05 <='1' when (estado = hay25) OR (estado = hay35) ELSE '0'; dev10 <='1' when (estado = hay30) OR (estado = hay35) ELSE '0'; --Salidas para las unidades de euro (display) que pueden ser 0, 1, 2 y 3. --Basta con dos lneas de cdigo BCD. Las dos lneas de mayor peso estaran a masa Unidades <= "00" when (estado = vacio) or (estado = hay05) ELSE "01" when (estado = hay10) or (estado = hay15) ELSE "10" when (estado = hay20) or (estado = hay25) ELSE "11" when (estado = hay30) or (estado = hay35); --Salidas para las dcimas de euro (display) que pueden ser 5 y 0. --Son necesarias tres lneas de cdigo BCD. La lnea de mayor peso estara a masa Decimas <="000" when (estado = vacio) or (estado = hay10) or (estado = hay20) or (estado=hay30) ELSE "101" when (estado = hay05) or (estado = hay15) or (estado = hay25) or (estado = hay35); end comportamiento;

57.a_vhdl_symbol_cont_10

CONTADOR DECIMAL CON SALIDA 7-SEGMENTOS DISEO DESDE ESQUEMTICO CON SMBOLO CREADO A PARTIR DE CDIGO VHDL JUNTO CON SMBOLO DE LIBRERA 7447 CDIGO VHDL DEL CONTADOR LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; --Contador decimal con reset asncrono --Empleo de una seal auxiliar ENTITY cont_10_rst_asinc_signal IS PORT ( rst, ck :IN STD_LOGIC; Q :OUT STD_LOGIC_VECTOR (3 DOWNTO 0)); END cont_10_rst_asinc_signal; ARCHITECTURE logica of cont_10_rst_asinc_signal is SIGNAL Q_aux :STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN

PROCESS (ck, rst) BEGIN IF rst='1' THEN Q_aux <= "0000"; ELSIF(ck'event and ck='1') THEN IF Q_aux="1001" THEN Q_aux <= "0000"; ELSE Q_aux <= Q_aux + 1; END IF; END IF; END PROCESS; --COMBINACIONAL Q <= Q_aux; END logica;

CON FILE ----- CREATE DEFAULT SYMBOL

Se crea el smbolo El circuito completo es,

El decodificador BCD-7segmentos tiene sus salidas activas a nivel bajo. Los resultados de la simulacin son,