Está en la página 1de 20

MODELADO DE

CIRCUITOS
COMBINACIONALES

Laboratorio de Circuitos Digitales II


I
Ingeniería
i í Electrónica
El t ó i
CIRCUITOS BÁSICOS USANDO
MODELOS CONCURRENTES

– Las declaraciones concurrentes se


q
encuentran dentro de la arquitectura

– Pueden usarse tanto en descripciones


funcionales como definidas estructurales

– No importa
p el orden como se escriban las
señales
TIPOS DE DECLARACIONES
CONCURRENTES

1
1. Declaraciones condicionales asignadas a una
señal (when - else).

2. Declaraciones concurrentes asignadas a


señales.

3. Selección de una señal (with-select-when).

4. Instrucciones Generate
DECLARACIÓN CONDICIONAL
ASIGNADA A UNA SEÑAL

Declaración
D l ió (when
( h - else):
l ) se utiliza
tili para asignar
i
valores a una señal determinando así la función del
circuito.
circuito

La expresión puede ser lógica o aritmética

-- Sintaxis:

signal
g _name <= expression
p WHEN logic
g _expression
p ELSE
.
.
.
{expression WHEN logic_expression ELSE}
expression;
Ejemplo de asignación de señal
simple
Utilizando la tabla de verdad que describe el
comportamiento
i d l circuito,
del i i es posible
ibl
determinar la salida en función de las entradas
library ieee;
use ieee.std_logic_1164.all;

entity tabla_verdad is port (


a,b,c: in std_logic;
f: out std_logic;
end tabla_verdad;
QuickTime™ and a
decompressor
are needed to see this picture
picture. Architecture funcional of tabla_verdad
tabla verdad is

Begin

f <= '1' when (a='0' and b ='0' and c ='0') else


'1' when (a='0' and b ='1' and c ='1') else
'1' when (a='1' and b ='1' and c ='0') else
'1' when (a='1' and b ='1' and c ='1') else '0';
end funcional;
DECLARACION CONCURRENTE
ASIGNADA A SEÑALES
La función de salida se describe mediante
ecuaciones booleanas
booleanas, modelando el
comportamiento con compuertas
library ieee;
use ieee.std_logic_1164.all;

entity ec_booleana is port (


a,b,c,d,e,f: in std_logic;
-- Sintaxis: x1,x2: out std_logic;
end ec_booleana;
signal_name <= expression;
architecture funcional of ec_booleana is
SIGNAL a,b,c,f : STD_LOGIC;
. begin
. x1 <= a xnor b;
. x2 <= (((c and d) or a xnor b)) nand
f <= (a AND b) OR c
((e xor f) and (c and d)));
end funcional;
SELECCIÓN DE UNA SEÑAL
Declaración (with-select-when): asigna un valor a
una señal con respecto al valor de otra señal
previamente seleccionada
library ieee;
use ieee.std_logic_1164.all;

entity seleccion is port (


a: in std_logic_vector
std logic vector (1 downto 0);
-- Sintaxis: c: out std_logic);
end seleccion;
WITH expression SELECT
signal_name<= expression WHEN constant_value, architecture funcional of seleccion is
.
. begin
. with a select
expression WHEN constant_value; c <= '1' when "00",
'0'
0 when "01",
01 ,
'1' when "10",
'0' when others,
end funcional;
INSTRUCCIÓN GENERATE

– Proporciona la posibilidad de repetir de


manera fácil una expresión lógica o
componentes.

– Hay dos opciones: FOR GENERATE e IF


GENERATE
TIPOS DE DECLARACIONES
SECUENCIALES

a) Instrucción IF

b) Instrucción CASE

c)) Instrucción
I t ió LOOP
DEFINICIÓN DE UN PROCESO
(PROCESS)
– Permite separar asignaciones concurrentes de
l secuenciales
las i l

– Aparece dentro de la arquitectura y en el se


enmarcan otras instrucciones ((if,, case,, loop)
p)

– Las variables sólo se declaran dentro del


proceso
INSTRUCCIÓN PROCESS
-- Sintaxis:

PROCESS (signal_name{,signal name)

[VARIABLE declarations]

BEGIN

[Simple Signal Assignment Statements]


[Variable Assignment Statements]
[IF Statements]
[CASE Statements]
[LOOP Statements]

END PROCESS [process label];


INSTRUCCIÓN IF

-- Sintaxis:

IF expression THEN
statement;
Ejemplo
j p de MUX 2-1:
{statement;}
IF s = '1' THEN
ELSIF expression THEN
sal <= a;
statement;
ELSE
{statement;}
sal <= b;
END IF;
ELSE
statement;
{statement;}

END IF;
INSTRUCCIÓN CASE

-- Sintaxis:

CASE expression IS
Ejemplo
j p de MUX 2-1:
WHEN constant_value
constant value =>
statement;
CASE s IS
{statement;}
WHEN ’0' =>
WHEN constant_value
constant value =>
s <= a;
statement;
WHEN OTHERS =>
{statement;}
s <= b;
END CASE;;
WHEN OTHERS =>
statement;
{statement;}

END CASE;
INSTRUCCIÓN LOOP

– Repiten una o más instrucciones de


asignación secuencial

– Opciones: FOR-LOOP y WHILE-LOOP


EJEMPLO 1
Multiplexor : Uso del when - else.

Library ieee;
use ieee.std_logic_1164.all;

Entity
y multiplexor1
p is
port ( sel : in std_logic;
a : in std_logic_vector ( 3 downto 0 );
b : in std_logic_vector ( 3 downto 0 );
c : out std_logic_vector ( 3 downto 0));
end multiplexor1;

Architecture rtl of multiplexor1 is


begin
c <= a when sel = '1' else b;
end
d rtl;
tl
EJEMPLO 2
Decodificador : uso de case

library ieee;
use ieee.std_logic_1164.all;

entity decoder is
port ( q1 : in std_logic_vector ( 1 downto 0 );
q2 : out std_logic
q g _vector ( 3 downto 0 ));
end decoder;

architecture rtl of decoder is


begin
process ( q1 )
begin
case q1 is
when "00" => q2 <= "0001";
when "01" => q2 <= "0010";
when
h ""10"
0" => q2
2 <= "0"0100";
00"
when "11" => q2 <= "1000";
when others => q2 <= "0000";
end case;
end process;
p ;
end rtl;
EJEMPLO 3
Sumador_restador: Process y uso del if - then - else.

Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_signed.all;

Entity su_res is
port (x : in std_logic_vector (3 downto 0);
y : in std_logic_vector
std logic vector (3 downto 0);
s : out std_logic_vector (4 downto 0);
sel : in std_logic );
end su_res;

Architecture rtl of su_res


su res is
begin
process ( x,y,sel)
begin
if sel = '0' then
s <= ‘0’&x + y;
else
s <=‘0’&x - y;
end if;
end process;
end rtl;
EJEMPLO 4
Concurrencia de procesos

library ieee; architecture rtl of ROM2 is


use iieee.std_logic_1164.all; signal rom1,rom2 : std_logic_vector ( 1 downto 0 );
entity ROM2 is begin
port ( rom_sel : in std_logic; process ( rom1_pos )
rom1_pos,rom2_pos : in std_logic_vector ( 1 downto 0 ); begin
o t b s
out_bus : ooutt std
std_logic_vector
logic ector ( 1 do
downto
nto 0 ) ); case rom1
rom1_pos
pos is
end ROM2; when "00" => rom1 <="11”;
when "01" => rom1 <="11”;
when "10" => rom1 <="01";
when "11" => rom1 <="10";
•Cada proceso da origen a un decodificador.
decodificador when
h others
th =>> null;
ll
•Una sentencia when - else es un proceso paralelo. end case;
•Las señales son de uso global para toda la arquitectura. end process;
process ( rom2_pos )
begin
case rom2_pos is
when "00" => rom2 <="00"; •Cada
C d proceso dad origen
i a un decodificador.
d difi d
when "01" => rom2 <="01"; •Una sentencia when - else es un proceso paralelo.
when "10" => rom2 <="01"; •Las señales son de uso global para toda la arquitectura.
when "11" => rom2 <="10";
when others => null;;
end case;
end process;
out_bus <= rom1 when rom_sel = '0' else rom2;
end rtl;
EJEMPLO 5
Comparador

architecture math of compex is


library ieee;
begin
use ieee.std_logic_1164.all;
process ( bus1 )
use ieee.std_logic_arith.all;
begin
use ieee.std_logic_unsigned.all;
if bus1 < 3 then
bus2 <= bus1;
entity compex is
else
port ( bus1 : in std_logic_vector ( 3 downto 0 );
bus2 <= "0000";
bus2 : out std_logic
g _vector ( 3 downto 0 ));
endd if
if;
end compex;
end process;
end math;

También podría gustarte