240 likes | 482 Views
Departamento de Ingeniería Electrónica Facultad de Ingeniería. Circuitos Digitales II. Elementos del VHDL (2da parte) Semana No.4 Semestre 2008-2 Prof. Gustavo Patiño gpatino@udea.edu.co Prof. Eugenio Duque eaduque@udea.edu.co. Temario. Ejemplo de Asignaciones
E N D
Departamento de Ingeniería Electrónica Facultad de Ingeniería Circuitos Digitales II Elementos del VHDL (2da parte) Semana No.4 Semestre 2008-2 Prof. Gustavo Patiño gpatino@udea.edu.co Prof. Eugenio Duque eaduque@udea.edu.co
Temario • Ejemplo de Asignaciones • Modelo estructural de Nivel de Puertas Lógicas • Modelo estructural RTL Asignación condicional • Modelo estructural RTL Asignación seleccionada • Modelo comportamental definido dentro de un process y usando IF-ELSE • Modelo comportamental definido dentro de un process y usando CASE • Modelo comportamental definido dentro de un process y usando FOR • Operadores Aritméticos • VHDL Estructural • Síntesis vs Simulación • Test Bench (Banco de Prueba)
Recordando…. • Instrucciones de Asignación concurrentes • Sólo dentro de arquitecturas • Tipos de asignación concurrentes : • Asignación básica de señal • Asignación de señal condicional • When – Else • Asignación de señal seleccionada • With – Select – When • Instrucciones de Asignación dentro de Process • Instrucciones secuenciales • Tipos de asignación : • Asignación básica de señal • Asignación de señal condicional • If – Elsif – Else – Endif • Asignación de señal seleccionada • Case – When – End case
Ejemplo Final de Tipos de Asignación : Mux de dos entradas de 4 bits Seis (6) formas diferentes de escribir el mismo sistema. Diferentes niveles de abstracción.
Modelo de Nivel de Puertas Lógicas -- MUX de dos entradas de cuatro bits LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY quad_2_input IS PORT ( select_data : IN STD_LOGIC; data_a, data_b : IN STD_LOGIC_VECTOR(3 DOWNTO 0); data_q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END quad_2_input; ARCHITECTURE gates_only OF quad_2_input IS BEGIN data_q(0) <= (data_a(0) AND NOT select_data) OR (data_b(0) AND select_data); data_q(1) <= (data_a(1) AND NOT select_data) OR (data_b(1) AND select_data); data_q(2) <= (data_a(2) AND NOT select_data) OR (data_b(2) AND select_data); data_q(3) <= (data_a(3) AND NOT select_data) OR (data_b(3) AND select_data); END gates_only;
Modelo RTL Asignación condicional -- MUX de dos entradas de cuatro bits LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY quad_2_input IS PORT ( select_data : IN STD_LOGIC; data_a, data_b : IN STD_LOGIC_VECTOR(3 DOWNTO 0); data_q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END quad_2_input; ARCHITECTURE conditional_assignOF quad_2_input IS BEGIN data_q <= data_a WHEN select_data = ’0’ ELSE data_b; ENDconditional_assign;
Modelo RTL Asignación seleccionada -- MUX de dos entradas de cuatro bits LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY quad_2_input IS PORT ( select_data : IN STD_LOGIC; data_a, data_b : IN STD_LOGIC_VECTOR(3 DOWNTO 0); data_q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END quad_2_input; ARCHITECTUREusing_select OF quad_2_input IS BEGIN WITH select_data SELECT data_q <= data_a WHEN ’0’, data_b WHEN OTHERS, ENDusing_select;
Modelo comportamental definido dentro de un process y usando IF-ELSE -- MUX de dos entradas de cuatro bits LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY quad_2_input IS PORT (select_data : IN STD_LOGIC; data_a, data_b : IN STD_LOGIC_VECTOR(3 DOWNTO 0); data_q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END quad_2_input; ARCHITECTUREprocess_if OF quad_2_input IS BEGIN PROCESS (select_data, data_a, data_b) BEGIN IF (select_data = ’0’) THEN data_q <= data_a; ELSE data_q <= data_b; END IF; END PROCESS; ENDprocess_if;
Modelo comportamental definido dentro de un process y usando CASE -- MUX de dos entradas de cuatro bits LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY quad_2_input IS PORT (select_data : IN STD_LOGIC; data_a, data_b : IN STD_LOGIC_VECTOR(3 DOWNTO 0); data_q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END quad_2_input; ARCHITECTUREprocess_caseOF quad_2_input IS BEGIN PROCESS (select_data, data_a, data_b) BEGIN CASE select_data IS WHEN ’0’ => data_q <= data_a; WHEN OTHERS => data_q <= data_b; END CASE; END PROCESS; ENDprocess_case;
Modelo comportamental definido dentro de un process y usando FOR -- MUX de dos entradas de cuatro bits LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY quad_2_input IS PORT (select_data : IN STD_LOGIC; data_a, data_b : IN STD_LOGIC_VECTOR(3 DOWNTO 0); data_q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END quad_2_input; ARCHITECTUREprocess_loopOF quad_2_input IS BEGIN PROCESS (select_data, data_a, data_b) BEGIN FOR i IN 0 to 3 LOOP data_q(i) <= (data_a(i) AND NOT select_data) OR (data_b(i) AND select_data); END LOOP; END PROCESS; ENDprocess_loop;
Arithmetic Operators in VHDL (1) To use basicarithmeticoperationsinvolvingstd_logic_vectorsyouneedtoincludethefollowinglibrarypackages: LIBRARYieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; or USE ieee.std_logic_signed.all;
Arithmetic Operators in VHDL (2) You can use standard+, -operatorstoperformaddition and subtraction: signalA : STD_LOGIC_VECTOR(3 downto 0); signalB : STD_LOGIC_VECTOR(3 downto 0); signalC : STD_LOGIC_VECTOR(3 downto 0); …… C <= A + B;
VHDL Estructural • Hasta ahora, cada dispositivo se ha diseñado, compilado y simulado en forma independiente. • Para conectar varios dispositivos, se requiere definir una arquitectura estructural (componentes + conexiones) • Ejemplo mínimo: Test Bench
VHDL Estructural (…cont) • Beneficios: • Al sintetizar una descripción estructural, los elementos individuales VHDL se colapsan dentro de un solo bloque, resultando quizá en lógica más eficiente. • Portabilidad. • Problemas: • Fácilmente se equivocan las conexiones. • No se puede rescatarse el diseño original a partir del archivo de síntesis.
Modelo para VHDL estructural ENTITY nombre IS PORT(...); END ENTITY nombre; ARCHITECTURE estructural OF nombre IS COMPONENT tipo1 PORT( … ); END COMPONENT; COMPONENT tipo2 PORT( … ); END COMPONENT; … SIGNAL señal1, señal2, … BEGIN c1: tipo1 PORT MAP( …); c2: tipo2 PORT MAP(…); ... ... END ARCHITECTURE estructural;
VHDL Estructural (…cont) • Components • Once you have defined an entity, the next thing is to instantiate it as a component within another entity’s architecture. • The interface of the componentmust be defined in any architecture that instantiates it. Then, any number of port map statements create instances of that component. • Example : Here is how to connect eight of the full adders to give a eight-bit adder:
Ejemplo : Sumador completo de 1- bit library ieee; -- add this to the IEEE library use ieee.std_logic_1164.all; -- includes std_ulogic entity full_adder is port(a, b, c : in std_ulogic; sum, carry : out std_ulogic); end full_adder; architecture imp of full_adder is begin sum <= (a xor b) xor c; -- combinational logic carry <= (a and b) or (a and c) or (b and c); end imp;
Ejemplo : Sumador completo de 8- bits usando components library ieee; use ieee.std_logic_1164.all; entity add2 is port (A, B : in std_logic_vector(7 downto 0); sum_out : out std_logic_vector(8 downto 0)); end add2; architectureimpof add2 is component full_adder port (a, b, c : in std_ulogic; sum, carry : out std_ulogic); end component; signal carry : std_ulogic_vector(6 downto 0); begin bit0 : full_adder port map (a => A(0), b => B(0), c => ’0’, sum => sum_out(0), carry => carry(0)); bit1 : full_adder port map (a => A(1), b => B(1), c => carry(0), sum => sum_out (1), carry => carry(1)); bit2 : full_adder port map (a => A(2), b => B(2), c => carry(1), sum => sum_out (2), carry => carry(2)); bit3 : full_adder port map (a => A(3), b => B(3), c => carry(2), sum => sum_out (3), carry => carry(3)); bit4 : full_adder port map (a => A(4), b => B(4), c => carry(3), sum => sum_out (4), carry => carry(4)); bit5 : full_adder port map (a => A(5), b => B(5), c => carry(4), sum => sum_out (5), carry => carry(5)); bit6 : full_adder port map (a => A(6), b => B(6), c => carry(5), sum => sum_out (6), carry => carry(6)); bit7 : full_adder port map (a => A(7), b => B(7), c => carry(6), sum => sum_out (7), carry => sum_out (8)); end imp;
Síntesis vs Simulación • Todos los diseños sintetizables pueden ser simulados. • No todos los diseños para simulación pueden ser sintetizados. • Considere, por ejemplo, el siguiente código:
Síntesis vs Simulación (…cont) • La entrada din es asignada a dout después de 10ns (after 10ns) • Puede esto representar un sistema del mundo real ? SI • Será posible de implementar esto en un dispositivo ? TAL VEZ • Será posible de implementar esto en todos los dispositivos ? NO • Esta arquitectura puede ser simulado más no sintetizado. • Algunas herramientas de diseño en VHDL sólo permiten el uso de palabras claves sintetizables. • La mayoría de las herramientas aceptan un subconjunto sintetizable de VHDL’93.
Test Bench (Banco de Prueba) -- Modelo VHDL para elaboración de un testbench en VHDL: LIBRARY IEEE; USE IEEE.std_logic_1164.all; LIBRARY WORK; USE WORK.all; ----------------------------------------------------------------------- -- Declaración del banco de prueba ----------------------------------------------------------------------- ENTITY mux2a1_tb IS END ENTITY mux2a1_tb; • Eventualmente WORK es la colección de diseños que se desean simular. • No hay interface externa. • Básicamente debido a que la declaración de un Testbenchno es en si mismo un bloque circuital. • Es sólo la especificación temporal de variaciones de señales para efectos de simulación.
Componentes del TestBench ---------------------------------------------------------------- -- Definición del banco de prueba ---------------------------------------------------------------- ARCHITECTURE prueba OF mux2a1_tb IS -- Declaración del componente bajo prueba (cbp) COMPONENT mux2a1 IS PORT( s : IN std_logic ; -- selector a,b : IN std_logic_vector(7 DOWNTO 0); -- entradas o : OUT std_logic_vector(7 DOWNTO 0) -- salida ); END COMPONENT mux2a1; -- Declaración de señales de prueba SIGNAL clk : std_logic; SIGNAL a,b,o : std_logic_vector(7 DOWNTO 0);
Instancias y procesos del testbench BEGIN cbp : COMPONENT mux2a1 -- instancia del dispositivo PORT MAP( clk ,a,b,o); reloj:PROCESS IS -- generación de reloj BEGIN clk <= '1'; WAIT FOR 25 ns ; clk <= '0'; WAIT FOR 25 ns ; END PROCESS reloj; estimulación: PROCESS IS-- patrones de estimulación BEGIN a <= "01010101"; -- define entrada 'a' b <= "00001111"; -- define entrada 'b' WAIT ; END PROCESS estimulación; END ARCHITECTUREprueba; Component/Port map : Genera una instancia del componente y lo conecta a las señales del circuito al cual pertenece. Wait/waitfor: Le indican al simulador que esperen infinitamente por el tiempo especificado.
Taller próxima clase • Actividad en clase • Taller para realizar en la próxima em preparación para el Quiz No.1. • Multiplicador de 4 bits. • Quiz No. 1. • Miércoles 03 de diciembre del 2008.