Contador de 4 bits ascendente y en código Gray

Anuncio
INSTITUTO TECNOLÓGICO DE MORELIA
MAESTRIA EN CIENCIAS EN INGENIERÍA
ELECTRÓNICA
ELECTRONICA DIGITAL AVANZADA
REPORTE 2
“CONTADOR DE 4 BITS ASCENDENTE Y EN CODIGO
GRAY (ESTRUCTURAL Y SECUENCIAL)”
NOMBRE:
ING. ANTONY MORALES CERVANTES
N. C. M06120218
PROFESOR:
DR. ARTURO MENDEZ PATIÑO
06 DE FEBRERO DEL 2012
Durante la práctica se realizó un contador de 4 bits en VHDL mediante una programación
estructural y una secuencial. La practica consiste en hacer un contador ascendente y otro en gray
mediante un bit de selección. La programación estructural se especifican cuales componentes son
usados y de qué manera están interconectados. La programación secuencial utiliza condiciones o
comandos que se utilizan comúnmente en el lenguaje de programación como las condiciones IF,
THEN o CASE sin que el programador se preocupe de la distribución de las compuertas del PLD, es
necesario incluir un proceso ya que es una estructura secuencial.
Programación estructural
Para la primera parte se describe la programación estructural. En la Tabla 1 se muestran los
estados actuales y estados futuros del contador ascendente de 4 bits.
Tabla 1. Tabla de verdad del contador ascendente de 4 bits.
CONTADOR
ASCENDENTE
Q(3)
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
ESTADO ACTUAL
Q(2)
Q(1)
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
Q(0)
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
Q(3)
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
ESTADO FUTURO
Q(2)
Q(1)
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
0
Q(0)
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
A partir de la Tabla de verdad de la Tabla 1 se obtuvieron los mapas de karnaugh del estado
siguiente en base a la tabla de verdad del Flip Flop D descrito en la tabla 2.
Tabla 2. Tabla de verdad del Flip Flop D.
Q
D
0
0
1
1
Q+1
0
1
0
1
0
1
0
1
Los mapas de karnaugh están descritos en las siguiente tablas.
Tabla 3. Mapa de Karnaugh del contador ascendente para D0.
Q1 Q0
Q3 Q2
00
01
11
10
00
01
11
10
1
1
1
1
0
0
0
0
0
0
0
0
1
1
1
1
Tabla 4. Mapa de Karnaugh del contador ascendente para D1.
Q1 Q0
Q3 Q2
00
01
11
10
00
01
11
10
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
Tabla 5. Mapa de Karnaugh del contador ascendente para D2.
Q1 Q0
Q3 Q2
00
01
11
10
00
01
11
10
0
1
1
0
0
1
1
0
1
0
0
1
0
1
1
0
Tabla 6. Mapa de Karnaugh del contador ascendente para D3.
Q1 Q0
Q3 Q2
00
01
11
10
00
01
11
10
0
0
1
1
0
0
1
1
0
1
0
1
0
0
1
1
En la Tabla 7 se muestran los estados actuales y estados futuros del contador en código gray de 4
bits.
Tabla 7. Tabla de verdad del contador en código gray de 4 bits.
CONTADOR
EN CODIGO
GRAY
Q(3)
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
ESTADO ACTUAL
Q(2)
Q(1)
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
Q(0)
0
0
1
1
1
1
0
0
0
0
1
1
1
1
0
0
Q(3)
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
ESTADO FUTURO
Q(2)
Q(1)
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
0
A partir de la Tabla de verdad de la Tabla 7 se obtuvieron los mapas de karnaugh del estado
siguiente en base a la tabla de verdad del Flip Flop D descrito en la tabla 2.
Q(0)
0
1
1
1
1
0
0
0
0
1
1
1
1
0
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
Tabla 8. Mapa de Karnaugh del contador en código gray para D0.
Q1 Q0
Q3 Q2
00
01
11
10
00
01
11
10
1
0
1
0
1
0
1
0
0
1
0
1
0
1
0
1
Tabla 9. Mapa de Karnaugh del contador en código gray para D1.
Q1 Q0
Q3 Q2
00
01
11
10
00
01
11
10
0
0
0
0
1
0
1
0
1
0
1
0
1
1
1
1
Tabla 10. Mapa de Karnaugh del contador en código gray para D2.
Q1 Q0
Q3 Q2
00
01
11
10
00
01
11
10
0
1
1
0
0
1
1
0
0
1
1
0
1
1
0
0
Tabla 11. Mapa de Karnaugh del contador en código gray para D3.
Q1 Q0
Q3 Q2
00
01
11
10
00
01
11
10
0
1
1
0
0
0
1
1
0
0
1
1
0
0
1
1
Para la parte de selección de contador o código gray lo que se realizó fue utilizar un bit de
selección y a la parte que se utilizó para seleccionar con 0 (cero) se le agregó una compuerta AND
NEGADA a todas las ecucaciones con el bit de selección y para la parte que se seleccionó en 1
(uno) se le agregó una compuerta AND. Una vez obtenidos los resultados para las diferentes
salidas se obtuvieron las ecuaciones descritas en el programa de VHDL.
El código se muestra a continuación:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity FFDcontador is
Port ( clk : in STD_LOGIC;
SEL: in STD_LOGIC;
Q : INout STD_LOGIC_VECTOR (3 downto 0):= (others => '0'));
end FFDcontador;
architecture Behavioral of FFDcontador is
signal D : STD_LOGIC_VECTOR (3 downto 0):= (others => '0');
begin
D(0) <= (((not(Q(1))and not(Q(2)) and not(Q(3))) or (Q(1) and Q(2)and not (Q(3))) or (not(Q(1))and
Q(2) and Q(3)) or (Q(1)and not(Q(2)) and Q(3)))and not SEL)or (((not(Q(0))and not(Q(1))) or
(not(Q(0)) and Q(1)))and SEL);
D(1) <= (((Q(0)and not(Q(2)) and not(Q(3)))or (Q(0)and Q(2) and Q(3)) or (not(Q(0))and Q(1)))and
not SEL)or(((Q(0)and not(Q(1)))or (not(Q(0))and Q(1)))and SEL);
D(2) <= (((not(Q(0))and Q(1) and not(Q(3))) or (not(Q(1))and Q(2))or (Q(0) and Q(2)))and not
SEL)or (((not(Q(1))and Q(2)) or (not(Q(0))and Q(2))or (Q(0) and Q(1)and not (Q(2))))and SEL);
D(3) <= (((not(Q(0))and not (Q(1)) and Q(2))or (Q(0)and Q(3)) or (Q(1) and Q(3)))and not
SEL)or(((not(Q(1))and Q(3)) or (not (Q(0)) and Q(1) and Q(3))or (not (Q(2)) and Q(3))or (Q(0)and
Q(1) and Q(2) and not (Q(3))))and SEL);
process (clk, D) begin
if (clk'event and clk='1') then
Q<= D;
end if;
end process;
end Behavioral;
Simulación estructural
Una vez sintetizado el programa se realizó una simulación para comprobar el resultado, descrito a
continuación:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
ENTITY TB_FFDcontador IS
END TB_FFDcontador;
ARCHITECTURE behavior OF TB_FFDcontador IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT FFDcontador
PORT(
SEL : IN std_logic;
clk : IN std_logic;
Q : INOUT std_logic_vector(3 downto 0)
);
END COMPONENT;
--Inputs
signal D : std_logic_vector(3 downto 0) := (others => '0');
signal SEL: std_logic := '0';
signal clk : std_logic := '0';
--Outputs
signal Q : std_logic_vector(3 downto 0):= (others => '0');
-- Clock period definitions
constant clk_period : time := 10 ns;
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: FFDcontador PORT MAP (
SEL => SEL,
clk => clk,
Q => Q
);
-- Clock process definitions
clk_process :process
begin
clk <= '0';
wait for clk_period/2;
clk <= '1';
wait for clk_period/2;
end process;
-- Stimulus process
stim_proc: process
begin
SEL<='0' after 160ns;
SEL<='1' after 160ns;
wait;
end process;
END;
En las figuras 1-5 se muestra la simulación del contador ascendente y en código gray. Notandose
que cuando el Bit de selección “sel” está en 0 (cero) el contador es en gray y cuando el bit de
selección está en 1 (uno) el contador es ascendente.
Figura 1. Simulación del contador ascendente y gray en programación estructural (0 a 50 nS).
Figura 2. Simulación del contador ascendente y gray en programación estructural (50 a 120 nS).
Figura 3. Simulación del contador ascendente y gray en programación estructural (120 a 180 nS).
Figura 4. Simulación del contador ascendente y gray en programación estructural (180 a 240 nS).
Figura 5. Simulación del contador ascendente y gray en programación estructural (240 a 320 nS).
Programación secuencial
Para la parte del contador ascendente y gray en modo secuencial se realizó con un process para
realizar el contador y la selección de contador-gray, con un decodificador para la realización del
código gray. Las instrucciones se muestran en el siguiente programa de VHDL.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity conta4bits is
Port ( clk : in STD_LOGIC;
seleccion : in STD_LOGIC;
salida : out STD_LOGIC_VECTOR (3 downto 0):= (others => '0'));
end conta4bits;
architecture Behavioral of conta4bits is
signal gray : STD_LOGIC_VECTOR (3 downto 0):= (others => '0');
signal contador : STD_LOGIC_VECTOR (3 downto 0):= (others => '0');
begin
with contador select
gray <= "0000" when "0000",
"0001" when "0001",
"0011" when "0010",
"0010" when "0011",
"0110" when "0100",
"0111" when "0101",
"0101" when "0110",
"0100" when "0111",
"1100" when "1000",
"1101" when "1001",
"1111" when "1010",
"1110" when "1011",
"1010" when "1100",
"1011" when "1101",
"1001" when "1110",
"1000" when others;
process (clk, seleccion) begin
if (clk'event and clk= '1') then
if (seleccion ='1') then
contador <= contador+1;
salida <=contador;
else
contador <=contador+1;
salida <= gray;
end if;
end if;
end process;
end Behavioral;
Simulación en secuencial
Una vez sintetizado el programa se realizó una simulación para comprobar el resultado, descrito a
continuación:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
ENTITY TB_conta4bits IS
END TB_conta4bits;
ARCHITECTURE behavior OF TB_conta4bits IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT conta4bits
PORT(
clk : IN std_logic;
seleccion : IN std_logic;
salida : OUT std_logic_vector(3 downto 0)
);
END COMPONENT;
--Inputs
signal clk : std_logic := '0';
signal seleccion : std_logic := '0';
signal salida : std_logic_vector(3 downto 0):= (others => '0');
-- Clock period definitions
constant clk_period : time := 10 ns;
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: conta4bits PORT MAP (
clk => clk,
seleccion => seleccion,
salida => salida
);
-- Clock process definitions
clk_process :process
begin
clk <= '0';
wait for clk_period/2;
clk <= '1';
wait for clk_period/2;
end process;
-- Stimulus process
stim_proc: process
begin
seleccion<='0' after 170ns;
seleccion<='1' after 170ns;
wait;
end process;
END;
En las figuras 6-9 se muestra la simulación del contador ascendente y en código gray. Notándose
que cuando el Bit de selección “sel” está en 0 (cero) el contador es en gray y cuando el bit de
selección está en 1 (uno) el contador es ascendente.
Figura 6. Simulación del contador ascendente y gray en programación secuencial (0 a 100 nS).
Figura 7. Simulación del contador ascendente y gray en programación secuencial (100 a 200 nS).
Figura 8. Simulación del contador ascendente y gray en programación secuencial (200 a 300 nS).
Figura 9. Simulación del contador ascendente y gray en programación secuencial (300 a 400 nS).
CONCLUSIONES
Para el desarrollo de esta práctica fue necesario el uso de las declaraciones de los puertos de
entrada y de salida necesarios para hacer el contador, tanto en programación estructural como en
secuencial. Se contaba con un bit de selección para la parte de contador y la parte de código gray.
Pudiéndose notar la para esta práctica fue más fácil desarrollarla en forma secuencial, ya que el
estar escribiendo las ecuaciones en el código es algo laborioso y hay que tener demasiado cuidado
en la escritura ya que con algún elemento que ponga uno mal, nos va dar un resultado erróneo.
Descargar