Intermedio > Circuitos integrados > Logica combinacional VHDL

Logica combinacional VHDL

Objetivos

  1. Usar el VHDL como herramienta de edición para la edición de bloques funcionales a medida.
  2. Usar el VHDL en la edición de tablas de verdad para bloques combinacionales.
  3. Usar el VHDL para la edición de Lógica Combinacional.
  4. Integrar bloques funcionales en sistemas de mayor complejidad usando decodificadores, multiplexores y comparadores.

Introducción Teórica

Declaración de decodificadores y tablas de verdad

Un decodificador contiene lógica combinacional, que interpreta patrones de entrada y los convierte en valores de salida.

Para el diseño del codificador de BCD a 7 segmentos, se requiere del manejo de datos similares a los que se utilizan en la declaración de cualquier diseño, como su título y datos, sin embargo, en la parte lógica (desarrollo del funcionamiento) se requiere utilizar la palabra reservada “std_logic_vector” para hacer un código más compacto y versátil. El código completo del decodificador de BCD a siete segmentos es el siguiente:

library ieee;
use ieee.std_logic_1164.all;

entity decobcd_7s is
port(
A: in std_logic_vector(3 downto 0);
d: out std_logic_vector( 6 downto 0)
);
end decobcd_7s;

architecture argdeco of decobcd_7s is
begin
process (A)
begin
case A is
when "0000" =>d<="0000001";
when "0001" =>d<="1001111";
when "0010" =>d<="0010010";
when "0011" =>d<="0000110";
when "0100" =>d<="1001100";
when "0101" =>d<="0100100";
when "0110" =>d<="0100000";
when "0111" =>d<="0001110";
when "1000" =>d<="0000000";
when "1001" =>d<="0000100";
when others =>d<="1111111";
end case;
end process;
end argdeco;

Declaración de lógica condicional

Diseñar el control de prioridad en la entrada a un hospital. Al hospital pueden llegar tres tipos de pacientes: los que lleguen con una super-emergencia, los que lleguen con una emergencia y los que lleguen tan solo por chequeo, por lo que se requiere que dicho control sea de prioridad.

Solución:
El primer paso es hacer una asignación binaria a las entradas:
Súperemergencia = 3,
Emergencia = 2,
Chequeo = 1.

Utilizando lenguaje VHDL el código queda de la siguiente manera:

library ieee;
use ieee.std_logic_1164.all;

entity condicional is
port (
superemergencia, emergencia, chequeo: in boolean;
nivel_mas_alto: out std_logic_vector (1 downto 0)
);
end condicional;


architecture arqdeco of condicional is

begin
process(superemergencia, emergencia, chequeo)
begin
IF superemergencia then
nivel_mas_alto <=”11”;
ELSIF emergencia then
nivel_mas_alto <=”10”;
ELSIF chequeo then
nivel_mas_alto <=”01”;
ELSE
nivel_mas_alto <=”00”;
END IF;
End process;
END arqdeco;

Preparación

Para el desarrollo de esta experiencia el alumno debe tener claro los conceptos dados en la clase teórica, revisar sus apuntes y afianzar sus conocimientos con el texto base y la bibliografía del curso

Procedimiento

Se requiere diseñar el control para una cortadora de planchas de aluminio, la cual es accionada por dos motores, uno de tracción de la faja de transporte ( M1, M0) y el otro de accionamiento para la cuchilla de corte (C0).
El sistema posee dos sensores a la entada a la faja (S1 y S0) para detectar el ingreso de las planchas de aluminio y su correcto alineamiento; estos sensores entregan la información a un decodificador bajo las siguientes condiciones: Si las dos entradas marcan cero el motor no se mueve, si alguna marca distinto de cero el motor retrocede y si ambas marcan uno el motor adelanta la faja.
Además posee una salida ( D ) para habilitar la medición de la longitud de las planchas. Las líneas de control del motor de la faja llevan un control de paro forzado.
La medición de las longitudes de corte se realiza por medio de cuatro sensores que indican la posición de la plancha mientras esta es transportada por la faja mediante la siguiente codificación: Si se activa T0 la salida será 0, si T1 se activa la salida será 1, si T2 se activa la salida será 2 y si se activa T3 la salida será 3.
Los datos entregados por el codificador se darán en binario hacia un comparador de medida, el cual será conformado por un condicionador lógico y un comparador de 2 bits con línea de habilitación.
El condicionador lógico debe de ser capaz de tener entradas seleccionadas como “CHICO, MEDIANO, GRAND” y entregar para cada caso valores en binario correspondientes a 1, 2, 3 respectivamente. La información del condicionador lógico definirá en el comparador mediante el estado de igualdad si la plancha ya alcanzo el tamaño adecuado de acuerdo a lo seleccionado.
Enviando una señal de activación al control del motor de la guillotina para el corte y el paro forzado del motor de la faja.
Debido a que los operarios que retiran la plancha cortada son ciegos se deberá de acondicionar un indicador sonoro para diferenciar mediante señales audibles de 100hz (para el ingreso de la plancha), 400hz (para corte chico), 800hz (corte mediano) y 1Khz (corte grande). Las diferentes medidas de corte.

Presente en su solución.

  1. Diagrama de bloques
  2. Determinar número de variables de E/S
  3. Definir y asignar letras a las variables

A continuación se definirán las condiciones de los bloques del sistema:
a. Decodificador:

  • Impleméntelo mediante VHDL, simúlelo y compruebe su funcionamiento.

A continuación se aprecia la programación del modulo y arquitectura descrita para un decodificado.

  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. entity ejemplo01b is
  4. port (
  5. s1, s0 : in STD_LOGIC :='0';
  6. m1, m0 : out SRD_LOGIC;
  7. d : out STD_LOGIC
  8. );
  9. end ejemplo01b;
  10. architecture behavioral of ejemplo01b is
  11. begin
  12. process (s1, s0)
  13. begin
  14. if(s0 ='0' and s1= '0') then
  15. m0 <='0';
  16. m1 <='0';
  17. d <='0';
  18. elsif (so='1' and s1='0') then
  19. m0 <='0';
  20. m1 <='1';
  21. d <='0';
  22. elsif (so='0' and s1='1') then
  23. m0 <='0';
  24. m1 <='1';
  25. d <='0';
  26. else
  27. m0 <='1';
  28. m1 <='0';
  29. d <='1';
  30. end if;
  31. end process;
  32. end behavioral;

A continuación, se observa la parte de Test Bench, que posteriormente sera usado para visualizar el diagrama de tiempos:

  1. library IEEE
  2. use IEEE.std_logic_1164.ALL;
  3. entity ejemplo01b is
  4. port(
  5. s1, s0 : in std_logic := '0';
  6. m1, m0: out std_logic;
  7. d : out std_logic
  8. );
  9. end ejemplo01b;
  10. architecture behavioral of ejemplo01b is
  11. begin
  12. process (s1, s0)
  13. begin
  14. if(s0 = '0' and s1='0')then
  15. m0 <='0';
  16. m1 <='0';
  17. d <='0';
  18. elsif (s0='1' and s1='0')then
  19. m0 <='0';
  20. m1 <='1';
  21. d <= '0';
  22. elsif (s0='0' and s1='1')then
  23. m0 <='0';
  24. m1 <='1';
  25. d <='0';
  26. else
  27. m0 <= '1';
  28. m1 <= '0';
  29. d <= '1';
  30. end if;
  31. end process;
  32. end behavioral;

Diagrama de tiempos:

b. Codificador:

  • Impleméntelo mediante VHDL, simúlelo y compruebe su funcionamiento.

Acontinuació, podemos ver la parte de la entidad y la arquitectura (VHDL_Module)

  1. library IEEE;
  2. use IEEE.std_logic_1164.ALL;
  3. entity ejemplo01 is
  4. port(
  5. T3, T2, T1, T0: in std_logic:='0';
  6. A2, A1: out std_logic
  7. );
  8. end ejemplo02;
  9. architecture behavioral of ejemplo02 is
  10. begin
  11. process (T3, T2, T1, T0)
  12. begin
  13. if (T0 ='1' and T1='0' and T3='0') then
  14. A1<='0';
  15. A2 <= '0';
  16. elsif(T0'0' and T1='1' and T3='0')then
  17. A1 <='0';
  18. A2 <='1';
  19. elsif (T0='0' and T1='0' and T2='1' and T3='0') then
  20. A1 <='1';
  21. A2<= '0';
  22. else
  23. A1 <='1';
  24. A2 <='1';
  25. end if;
  26. end process;
  27. end behavioral;

Podemos observar la parte de estimulos de Teste bench, que luego nos dara el diagrama de tiempos:

  1. --stimulus process
  2. stim_proc: process
  3. begin
  4. T3<='0';
  5. T2 <='0';
  6. T1 <='0';
  7. T0 <='1';
  8. wait for 10 ns;
  9. T3<='0';
  10. T2 <='0';
  11. T1 <='1';
  12. T0 <='0';
  13. wait for 10 ns;
  14. T3<='0';
  15. T2 <='1';
  16. T1 <='0';
  17. T0 <='0';
  18. wait for 10 ns;
  19. T3<='1';
  20. T2 <='0';
  21. T1 <='0';
  22. T0 <='0';
  23. wait;
  24. end process;
  25. end;

Diagrama de tiempos, a partir del Test Bench:

c. Condicionador Lógico::

  • Impleméntelo mediante VHDL, simúlelo y compruebe su funcionamiento.

Códigos de la entidad y arquitectura (VHDL_Module)

  1. library IEEE
  2. use IEEE.std_logic_1164.ALL;
  3. entity cond_logico is
  4. port(
  5. Otros, Chico, MEdiano, Grande:in STD_LOGIC;
  6. s1, s2: out std_logic;
  7. );
  8. end cond_logico;
  9. architecture behavioral of cond_logico is
  10. begin
  11. process (Otros, Chico, Mediano, Grande)
  12. begin
  13. if(Otros='1' and Chicos='0' and Mediano='0' and Grande='0')then
  14. s1 <='0';
  15. s2 <='0';
  16. elsif (Otros='1' and Chicos='1' and Mediano='0' and Grande='0')then
  17. s1 <='0';
  18. s2 <='1';
  19. elsif (Otros='1' and Chicos='0' and Mediano='1' and Grande='0')then
  20. s1 <='1';
  21. s2 <='0';
  22. elsif (Otros='1' and Chicos='0' and Mediano='0' and Grande='1')then
  23. s1 <='1';
  24. s2 <='1';
  25. end if;
  26. end process;
  27. end behavioral;

En esta parte se realizo el Test Bench o estimulos, para poder visualizar en el diagrama de tiempos:

  1. stim_proc: process
  2. begin
  3. Otros <='0';
  4. Chico<='0',
  5. Mediano<='0';
  6. Grande <='0';
  7. wait for 10ns;
  8. Otros <='1';
  9. Chico<='0',
  10. Mediano<='0';
  11. Grande <='0';
  12. wait for 10ns;
  13. Otros <='0';
  14. Chico<='1',
  15. Mediano<='0';
  16. Grande <='0';
  17. wait for 10ns;
  18. Otros <='0';
  19. Chico<='0',
  20. Mediano<='1';
  21. Grande <='0';
  22. wait for 10ns;
  23. Otros <='0';
  24. Chico<='0',
  25. Mediano<='0';
  26. Grande <='1';
  27. wait for 10ns;
  28. wait;
  29. end process;
  30. end;

Diagrama de tiempos,a partir de los estimulos realizados:

d. Comparador de 2 bits:
Mediante la siguiente tabla de operadores de comparación para VHDL, edite un comparador de 2 bits ( a[1..0] y b[1..0] ) con entrada condicional de habilitación D.Para el caso de igualdad.

  • Impleméntelo mediante VHDL, simúlelo y compruebe su funcionamiento.

Códigos de la entidad y arquitectura (VHDL_Module);

  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. entity comparador isport(
  4. a0, a1: in std_logic;
  5. b0, b1 : in std-logic;
  6. D : in std_logic;
  7. S : out std_logic;
  8. );
  9. end comparador;
  10. architecture behavioral of comparador is
  11. begin
  12. process (a0,a1,b0,b1,D)
  13. begin
  14. if (a0 =b0 and b1=a1 and D='1') then
  15. S<='1';
  16. else
  17. S<='0';
  18. end if;
  19. end process;
  20. end behavioral;

En esta parte se realizo el Test Bench o estimulos, para poder visualizar en el diagrama de tiempos:

  1. --stimulus process
  2. stim_proc:process
  3. begin
  4. a0 <= '0';
  5. a1 <= '0';
  6. b0 <= '0';
  7. b1 <= '0';
  8. D <= '0';
  9. wait for 20 ns;
  10. a0 <= '0';
  11. a1 <= '0';
  12. b0 <= '0';
  13. b1 <= '0';
  14. D <= '1';
  15. wait for 20 ns;
  16. a0 <= '1';
  17. a1 <= '0';
  18. b0 <= '1';
  19. b1 <= '0';
  20. D <= '0';
  21. wait for 20 ns;
  22. a0 <= '1';
  23. a1 <= '0';
  24. b0 <= '1';
  25. b1 <= '0';
  26. D <= '1';
  27. wait for 20 ns;
  28. a0 <= '0';
  29. a1 <= '1';
  30. b0 <= '0';
  31. b1 <= '1';
  32. D <= '0';
  33. wait for 20 ns;
  34. a0 <= '0';
  35. a1 <= '1';
  36. b0 <= '0';
  37. b1 <= '1';
  38. D <= '1';
  39. wait for 20 ns;
  40. a0 <= '1';
  41. a1 <= '1';
  42. b0 <= '1';
  43. b1 <= '1';
  44. D <= '0';
  45. wait for 20 ns;
  46. a0 <= '1';
  47. a1 <= '1';
  48. b0 <= '1';
  49. b1 <= '1';
  50. D <= '1';
  51. wait for 20 ns;
  52. a0 <= '1';
  53. a1 <= '0';
  54. b0 <= '1';
  55. b1 <= '1';
  56. D <= '0';
  57. wait for 20 ns;
  58. a0 <= '0';
  59. a1 <= '1';
  60. b0 <= '1';
  61. b1 <= '0';
  62. D <= '1';
  63. wait for 20 ns;
  64. wait;

Diagrama de tiempos,a partir de los estimulos realizados:

e. Multiplexor 4x2:
Implemente un mux 4x2 en base a un mux 2x1 cuya tabla de verdad es:

  • Impleméntelo mediante VHDL, simúlelo y compruebe su funcionamiento para el mux2x1 y el mux4x2.

Códigos de la entidad y arquitectura (VHDL_Module):

  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. entity mux_4x1 is port(
  4. a,b : in std-logic;
  5. sel: in std_logic;
  6. F : out std_logic
  7. );
  8. end mux_4x1;
  9. architecture behavioral of mux_4x1 is
  10. begin
  11. F <= '1' when (a='1' and b='0' and sel = '0') else
  12. '1' when (a='1' and b='1' and sel = '0') else
  13. '1' when (a='0' and b='1' and sel = '1') else
  14. '1' when (a='1' and b='1' and sel = '1') else
  15. '0';
  16. end behavioral;

En esta parte se realizo el Test Bench o estimulos, para poder visualizar en el diagrama de tiempos:

  1. stim_proc: process
  2. begin
  3. sel <= '0';
  4. a <= '0';
  5. b <= '0';
  6. wait for 100 ns;
  7. sel <= '0';
  8. a <= '1';
  9. b <= '0';
  10. wait for 100 ns;
  11. sel <= '0';
  12. a <= '0';
  13. b <= '1';
  14. wait for 100 ns;
  15. sel <= '0';
  16. a <= '1';
  17. b <= '1';
  18. wait for 100 ns;
  19. a <= '0';
  20. b <= '0';
  21. wait for 100 ns;
  22. sel <= '1';
  23. a <= '1';
  24. b <= '0';
  25. wait for 100 ns;
  26. sel <= '1';
  27. a <= '1';
  28. b <= '1';
  29. wait for 100 ns;
  30. wait for 100 ns;
  31. wait;

Diagrama de tiempos,a partir de los estimulos realizados:

Pueden descargar los archivos de ISE desde el siguiente enlace:https://github.com/mokuzaru/vhdl_labs

Linksappsclose