Código concurrente en VHDL [5] Lab. Sistemas Digitales Universidad Técnica Particular de Loja Prof: Diego Barragán Guerrero Oct. 2014 - Feb. 2015 Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 1 / 28
Introducción VHDL puede ser concurrente (paralelo) o secuencial. Declaraciones concurrentes: WHEN y GENERATE. Asignaciones con operadores: And, Not, +, *, sll, etc. Figura: Secuencial vs. concurrente [4]. Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 2 / 28
Lógica concurrente versus secuencial Lógica combinacional: la salida del circuito depende solo de las entradas actuales. Así, el sistema no requiere memoria. Implementación solo con compuertas lógicas. Figura: Lógica secuencial. Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 3 / 28
Lógica concurrente versus secuencial Lógica secuencial: la salida depende de la entrada previa. Elementos de memoria son necesarios. Figura: Lógica secuencial. Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 4 / 28
Código concurrente en VHDL VHDL es inherentemente concurrente (paralelo). Código concurrente se conoce también como flujo de datos (dataflow). Código concurrente: Operadores. When (When / Else o With / Select / When) Generate. Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 5 / 28
Operadores Forma más básica de crear código concurrente. Cualquier sistema combinacional se implementa con operadores. Figura: Tabla de operadores. Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 6 / 28
Ejemplo: multiplexor 1 (1/3) Multiplexores: circuitos combinacionales con varias entradas y una única salida. Entradas de control: seleccionar una, y sólo una, de las entradas de datos para permitir su transmisión desde la entrada seleccionada hacia dicha salida [2]. Figura: Multiplexor. Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 7 / 28
Ejemplo: multiplexor 1 (2/3) Código VHDL LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------- ENTITY mux IS PORT ( a, b, c, d, s0, s1: IN STD_LOGIC; y: OUT STD_LOGIC); END mux; --------------------------------------- ARCHITECTURE pure_logic OF mux IS BEGIN y <= (a AND NOT s1 AND NOT s0) OR (b AND NOT s1 AND s0) OR (c AND s1 AND NOT s0) OR (d AND s1 AND s0); END pure_logic; Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 8 / 28
Ejemplo: multiplexor 1 (3/3) s0 s1 a b c d y 0.00 ns 50 ns 100 ns 150 ns 200 ns 250 ns 300 ns 350 ns 400 ns 450 ns 500 ns Figura: Diagrama temporal. Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 9 / 28
When Código VHDL ------ Con WHEN/ELSE outp <= "000" WHEN (inp= 0 OR reset= 1 ) ELSE "001" WHEN ctl= 1 ELSE "010"; ---- Con WITH/SELECT/WHEN WITH control SELECT output <= "000" WHEN reset, "111" WHEN set, UNAFFECTED WHEN OTHERS; Todas las permutaciones son examinadas. Usar Others siempre que sea necesario. UNAFFECTED no ejecuta ningún cambio. Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 10 / 28
Ejemplo: multiplexor 2 (1/4) Código VHDL ------- WHEN/ELSE-------- LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------- ENTITY mux IS PORT ( a, b, c, d: IN STD_LOGIC; sel: IN STD_LOGIC_VECTOR (1 DOWNTO 0); y: OUT STD_LOGIC); END mux; ------------------------------------------- ARCHITECTURE mux1 OF mux IS BEGIN y <= a WHEN sel="00" ELSE b WHEN sel="01" ELSE c WHEN sel="10" ELSE d; END mux1; Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 11 / 28
Ejemplo: multiplexor 2 (2/4) Código VHDL ---WITH/SELECT/WHEN ----- LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------- ENTITY mux IS PORT ( a, b, c, d: IN STD_LOGIC; sel: IN STD_LOGIC_VECTOR (1 DOWNTO 0); y: OUT STD_LOGIC); END mux; ------------------------------------------- ARCHITECTURE mux2 OF mux IS BEGIN WITH sel SELECT y <= a WHEN "00", -- Uso de "," en lugar de ";" b WHEN "01", c WHEN "10", d WHEN OTHERS; -- no usar "d WHEN "11" " END mux2; Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 12 / 28
Tarea Realizar las simulaciones de los códigos de la página 72 y el buffer de tres estados de la página 73 del libro de Pedroni. Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 13 / 28
Ejemplo: codificador (1/4) Un codificador es un circuito combinacional con 2 N entradas y N salidas, cuya misión es presentar en la salida el código binario correspondiente a la entrada activada[1]. Figura: Codificador. Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 14 / 28
Ejemplo: codificador (2/4) Código VHDL: WHEN/ELSE LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------------- ENTITY encoder IS PORT ( x: IN STD_LOGIC_VECTOR (7 DOWNTO 0); y: OUT STD_LOGIC_VECTOR (2 DOWNTO 0)); END encoder; --------------------------------------------- ARCHITECTURE encoder1 OF encoder IS BEGIN y <= "000" WHEN x="00000001" ELSE "001" WHEN x="00000010" ELSE "010" WHEN x="00000100" ELSE "011" WHEN x="00001000" ELSE "100" WHEN x="00010000" ELSE "101" WHEN x="00100000" ELSE "110" WHEN x="01000000" ELSE "111" WHEN x="10000000" ELSE "ZZZ"; END encoder1; Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 15 / 28
Ejemplo: codificador (3/4) x 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000 y 000 001 010 011 100 101 110 111 0.00 ns 10 ns 20 ns 30 ns 40 ns 50 ns 60 ns 70 ns 80 ns Figura: Test bench ModelSim. Figura: Test bench ISim. Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 16 / 28
Ejemplo: codificador (4/4) LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------------- ENTITY encoder IS PORT ( x: IN STD_LOGIC_VECTOR (7 DOWNTO 0); y: OUT STD_LOGIC_VECTOR (2 DOWNTO 0)); END encoder; --------------------------------------------- ARCHITECTURE encoder2 OF encoder IS BEGIN WITH x SELECT y <= "000" WHEN "00000001", "001" WHEN "00000010", "010" WHEN "00000100", "011" WHEN "00001000", "100" WHEN "00010000", "101" WHEN "00100000", "110" WHEN "01000000", "111" WHEN "10000000", "ZZZ" WHEN OTHERS; END encoder2; Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 17 / 28
Ejemplo: ALU (Arithmetic Logic Unit) Unidad aritmético lógica (ALU): circuito digital que calcula operaciones aritméticas (como suma, resta, multiplicación, etc.) y operaciones lógicas (si, y, o, no), entre dos números [3]. Figura: ALU. Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 18 / 28
Ejemplo: ALU (Arithmetic Logic Unit) Figura: ALU. Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 19 / 28
Ejemplo: ALU (Arithmetic Logic Unit) Código VHDL ---------------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; ---------------------------------------------- ENTITY ALU IS PORT (a, b: IN STD_LOGIC_VECTOR (7 DOWNTO 0); sel: IN STD_LOGIC_VECTOR (3 DOWNTO 0); cin: IN STD_LOGIC; y: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END ALU; ---------------------------------------------- ARCHITECTURE dataflow OF ALU IS SIGNAL arith, logic: STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 20 / 28
Ejemplo: ALU (Arithmetic Logic Unit) Código VHDL ----- Unidad aritmética ------ WITH sel(2 DOWNTO 0) SELECT arith <= a WHEN "000", a+1 WHEN "001", a-1 WHEN "010", b WHEN "011", b+1 WHEN "100", b-1 WHEN "101", a+b WHEN "110", a+b+cin WHEN OTHERS; Código VHDL ----- Unidad lógica ----------- WITH sel(2 DOWNTO 0) SELECT logic <= NOT a WHEN "000", NOT b WHEN "001", a AND b WHEN "010", a OR b WHEN "011", a NAND b WHEN "100", a NOR b WHEN "101", a XOR b WHEN "110", NOT (a XOR b) WHEN OTHERS; -------- Mux: --------------- WITH sel(3) SELECT y <= arith WHEN 0, logic WHEN OTHERS; END dataflow; Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 21 / 28
Ejemplo: ALU (Arithmetic Logic Unit) Figura: Test Bench ALU. Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 22 / 28
Tarea Realizar la ALU usando el paquete numeric std. Recuerde que debe usar funciones de conversión de tipo de datos y declarar el tipo de dato como SIGNED o UNSIGNED, no como STD LOGIC VECTOR. Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 23 / 28
Figura: (a) Mux 2x1 (b) Instalado 3 veces (c) Mux 2x3 Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 24 / 28 Generate [6] Problema: repetir muchas veces un componente. Ej: memoria, registro, etc. Solución intuitiva: generar N veces el código del componente. Solución sintética: usar FOR / GENERATE.
Ejemplo: For/Generate Código VHDL -----Multiplexador 2x1----- LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------- ENTITY mux2x1 IS PORT (a, b, sel: IN STD_LOGIC; x: OUT STD_LOGIC); END ENTITY; --------------------------------- ARCHITECTURE mux2x1 OF mux2x1 IS BEGIN x<=a WHEN sel= 0 ELSE b; END ARCHITECTURE; --------------------------------- Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 25 / 28
Ejemplo: For/Generate LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------------------- ENTITY mux2x3 IS PORT (a, b: IN STD_LOGIC_VECTOR(2 DOWNTO 0); sel: IN STD_LOGIC; x: OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); END ENTITY; ------------------------------------------------------- ARCHITECTURE mux2x3 OF mux2x3 IS ---Declaración del component----- COMPONENT mux2x1 IS PORT (a, b, sel: IN STD_LOGIC; x: OUT STD_LOGIC); END COMPONENT; BEGIN ---Integración del componente--- generate_mux2x3: FOR i IN 0 TO 2 GENERATE comp: mux2x1 PORT MAP (a(i), b(i), sel, x(i)); END GENERATE generate_mux2x3; END ARCHITECTURE; Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 26 / 28
Tarea Realizar el Test Bench del código anterior. Si en lugar de tipos de datos STD LOGIC VECTOR se necesita usar tipo de datos SIGNED, cuáles serían los cambios a realizar en el código? Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 27 / 28
Bibliografía [1] Codificador. http://goo.gl/xa94qk. Acceso: 2014-09-09. [2] Multiplexor. http://goo.gl/iflx81. Acceso: 2014-09-09. [3] Unidad aritmético lógica. http://goo.gl/h6yfv. Acceso: 2014-09-09. [4] Using sas on sequential and parallel systems. http://goo.gl/o86xjc. Acceso: 2014-09-09. [5] V. A. Pedroni. Circuit Design with VHDL. MIT Press, Cambridge, MA, USA, 2004. [6] V. A. Pedroni. Circuit Design and Simulation with VHDL. The MIT Press, 2nd edition, 2010. Lab. Sistemas Digitales (UTPL) IET Oct. 2014 - Feb. 2015 28 / 28