Descripciones funcionales y estructurales Circuitos Electrónicos

Anuncio
Circuitos Electrónicos Digitales
E.T.S.I. Telecomunicación
Universidad Politécnica de Madrid
Descripciones funcionales y
estructurales
Descripciones funcionales y estructurales.
Introducción al lenguaje VHDL. Descripciones en
VHDL. Componentes sobre los que realizar la
síntesis: CPLD y FPGA. Ejemplos adicionales y
ejercicios
CEDG - Tema 7
1
Niveles de abstracción
• Permiten abordar el diseño de
sistemas modernos que se
caracterizan por:
– Elevada y muy elevada
complejidad (millones de puertas
lógicas)
– Diseñados por equipos de
diseño en vez de diseñadores
individuales
• Se basan en simplificar el
problema para manejar la
complejidad
Nivel funcional
Nivel RTL
Nivel lógico
– Bajo nivel: mucho detalle
– Alto nivel: poco detalle
Nivel eléctrico
• Imprescindible la elaboración de
una metodología de diseño
CEDG - Tema 7
2
Síntesis de circuitos
• Se parte de una descripción funcional en un lenguaje de
descripción de alto nivel (en nuestro caso VHDL) y se
sigue un proceso de diseño hasta llegar a integrarlo en
uno o varios circuitos integrados (FPGA o PLD)
CEDG - Tema 7
3
Descripciones funcionales y estructurales
Descripción Estructural
Descripción Funcional
library IEEE;
use IEEE.std_logic_1164.all;
entity BasculaRS is
port (S, R: in STD_LOGIC;
Q, QN: buffer STD_LOGIC);
end BasculaRS;
S
Q
R
QN
Báscula RS
library IEEE;
use IEEE.std_logic_1164.all;
architecture BasculaRS _arch of BasculaRS is
component nor2 port (I0, I1: in STD_LOGIC; O: out
STD_LOGIC);
end component;
begin
U1: nor2 port map (R,QN,Q);
U2: nor2 port map (S,Q,QN);
entity BasculaRS is
port (S, R: in STD_LOGIC;
Q, QN: buffer STD_LOGIC);
end BasculaRS;
architecture BasculaRS_arch of BasculaRS
is
begin
QN <= S nor Q;
Q <= R nor QN;
end BasculaRS _arch;
end BasculaRS_arch;
CEDG - Tema 7
4
Estructura general en VHDL
library IEEE;
use IEEE.std_logic_1164.all;
Báscula RS
Librería
IEEE.std_logic_1164.all
Puertos:
S, R, Q y QN
Comportamiento o
estructura de la caja:
QN <= S nor Q;
Q <= R nor QN;
entity BasculaRS is
port (S, R: in STD_LOGIC;
Q, QN: buffer STD_LOGIC);
end BasculaRS;
architecture BasculaRS_arch of
BasculaRS is
begin
QN <= S nor Q;
Q <= R nor QN;
end BasculaRS_arch;
CEDG - Tema 7
5
Librerías (VHDL)
Librería de uso,
normalmente:
IEEE.std_logic_1164.all
estándar
IEEE.std_logic_arith.all
aritmética
IEEE.std_logic_unsigned.all
aritmética sin signo
Y muchas más según las
necesidades, definibles
también por el usuario
library IEEE;
use IEEE.std_logic_1164.all;
entity BasculaRS is
port (S, R: in STD_LOGIC;
Q, QN: buffer STD_LOGIC);
end BasculaRS;
architecture BasculaRS_arch of
BasculaRS is
begin
QN <= S nor Q;
Q <= R nor QN;
end BasculaRS_arch;
CEDG - Tema 7
6
Empaquetado I (VHDL)
BasculaRS
Nombre:
BasculaRS
Nombre de los puertos: S y R
Tipo: in
Señales: Lógicas estándar
Nombre de los puertos: Q y QN
Tipo: buffer
Señales: Lógicas estándar
library IEEE;
use IEEE.std_logic_1164.all;
entity BasculaRS is
port (S, R: in STD_LOGIC;
Q, QN: buffer STD_LOGIC);
end BasculaRS;
architecture BasculaRS_arch of
BasculaRS is
begin
QN <= S nor Q;
Q <= R nor QN;
end BasculaRS_arch;
CEDG - Tema 7
7
Empaquetado II (VHDL)
• Nombre del componente, “case sensitive”:
entity BasculaRS is
port (
);
end BasculaRS;
BasculaRS
• Nombre de los puertos:
port (S, R: in STD_LOGIC;
Q, QN: buffer STD_LOGIC);
• Tipo de los puertos:
–
–
–
–
in: Entrada de un componente
out: Salida de un componente. No puede ser leída desde su interior.
buffer: Salida de un componente. Puede ser leída desde su interior.
inout: Puede actuar como entrada o salida, típicamente triestado.
• Puertos simples y complejos:
– De un solo bit: STD_LOGIC
– Arrays de bits: STD_LOGIC_VECTOR (inferior to superior)
STD_LOGIC_VECTOR (superior downto inferior)
• Niveles de señal de los puertos: SDT_LOGIC
– “0”, “1”,”Z”, “X” y algunos más para diseño avanzado
CEDG - Tema 7
8
Comportamiento I (VHDL)
library IEEE;
use IEEE.std_logic_1164.all;
Nombre de la realización:
BasculaRS_arch
Nombre del componente:
BasculaRS
Asignaciones:
<=
Funciones:
nor
Variables o señales:
S, R, Q, QN
entity BasculaRS is
port (S,R: in STD_LOGIC;
Q, QN: buffer STD_LOGIC);
end BasculaRS;
architecture BasculaRS_arch of
BasculaRS is
begin
QN <= S nor Q;
Q <= R nor QN;
end BasculaRS_arch;
CEDG - Tema 7
9
Comportamiento II (VHDL)
• Nombre de la arquitectura, puede haber varias
realizaciones para una misma entidad:
architecture BasculaRS_arch_NOR of BasculaRS is
begin
Cuerpo;
end BasculaRS_arch_NOR
• Nombre del componente al que corresponde esta
realización (BasculaRS):
• Asignaciones (concurrentes):
variable_asignada <= variable o función que se asigna
Q <= R nor QN;
Salida <= ‘0’;
variable_asignada <= ‘valor’ when condición else ‘valor’
Z <= ‘1’ when X=‘1’ and Y=‘0’ else ‘0’;
CEDG - Tema 7
10
Comportamiento III (VHDL)
– Funciones simples:
Booleanas: and, or, nand, nor, xor, xnor, not
Enteras: +, -, *, /, y otras más
– Funciones complejas
• If-then-else
if condición then acción_1;
elsif acción_2;
...
else acción_n;
end if;
• select
with expresión select
señal <= valor_1 when condición_1,
…..
valor_n when condición_n;
• Procesos: Permiten definir acciones secuenciales en el Cuerpo
process (señal_1, señal_2, … , señal_n)
begin
cuerpo
end process;
CEDG - Tema 7
11
Circuitos combinacionales
• Descripción de algunos ejemplos de circuitos
combinacionales
– Decodificador 3_a_8 74xx138
– Variación de niveles sobre el 74xx138. Se muestra la flexibilidad de
este tipo de descripciones y su elevada productividad
– Multiplexor de 4 entradas de 8 bits
– Multiplexor especializado 4 entradas de 3 bits. Se diseña un nuevo
componente sobre el anterior
– Comparador de 8 bits
– Comparador de 8 bits (alternativo). Flexibilidad en las
implementaciones
– Barrel shifter de 16 bits con desplazamiento circular a la izquierda
• Al final del tema se presentan como ejercicios para el
alumno otros componentes
CEDG - Tema 7
12
Decodificador 3_a_8 74xx138
library IEEE;
use IEEE.std_logic_1164.all;
entity V74x138 is
port (G1, G2A_L, G2B_L: in STD_LOGIC; -- enable inputs
A: in STD_LOGIC_VECTOR (2 downto 0); -- select inputs
Y_L: out STD_LOGIC_VECTOR (0 to 7) ); -- decoded outputs
end V74x138;
architecture V74x138_a of V74x138 is
signal Y_L_i: STD_LOGIC_VECTOR (0 to 7);
begin
with A select Y_L_i <=
"01111111" when "000",
"10111111" when "001",
"11011111" when "010",
"11101111" when "011",
"11110111" when "100",
"11111011" when "101",
"11111101" when "110",
"11111110" when "111",
"11111111" when others;
Y_L <= Y_L_i when (G1 and not G2A_L and not G2B_L)='1' else
"11111111“;
end V74x138_a;
CEDG - Tema 7
13
Variación de niveles sobre el 74xx138
architecture V74x138_b of V74x138 is
signal G2A, G2B: STD_LOGIC; -- active-high version of inputs
signal Y: STD_LOGIC_VECTOR (0 to 7); -- active-high version of outputs
signal Y_s: STD_LOGIC_VECTOR (0 to 7); -- internal signal
begin
G2A <= not G2A_L; -- convert inputs
G2B <= not G2B_L; -- convert inputs
Y_L <= Y; -- convert outputs
with A select Y_s <=
"10000000" when "000",
"01000000" when "001",
"00100000" when "010",
"00010000" when "011",
"00001000" when "100",
"00000100" when "101",
"00000010" when "110",
"00000001" when "111",
"00000000" when others;
Y <= not Y_s when (G1 and G2A and G2B)='1' else "00000000";
end V74x138_b;
CEDG - Tema 7
14
Multiplexor de 4 entradas de 8 bits
library IEEE;
use IEEE.std_logic_1164.all;
entity mux4in8b is
port (
S: in STD_LOGIC_VECTOR (1 downto 0); -- Select inputs, 0-3 ==> A-D
A, B, C, D: in STD_LOGIC_VECTOR (1 to 8); -- Data bus input
Y: out STD_LOGIC_VECTOR (1 to 8) -- Data bus output
);
end mux4in8b;
architecture mux4in8b of mux4in8b is
begin
with S select Y <=
A when "00",
B when "01",
C when "10",
D when "11",
(others => 'U') when others; -- this creates an 8-bit vector of 'U'
end mux4in8b;
CEDG - Tema 7
15
Multiplexor especializado 4 entradas de 3 bits
library IEEE;
use IEEE.std_logic_1164.all;
entity mux4in3b is
port (
S: in STD_LOGIC_VECTOR (2 downto 0); -- Select inputs, 0-7 ==> ABACADAB
A, B, C, D: in STD_LOGIC_VECTOR (1 to 18); -- Data bus inputs
Y: out STD_LOGIC_VECTOR (1 to 18) -- Data bus output
);
end mux4in3b;
architecture mux4in3p of mux4in3b is
begin
process(S, A, B, C, D)
variable i: INTEGER;
begin
case S is
when "000" | "010" | "100" | "110" => Y <= A;
when "001" | "111" => Y <= B;
when "011" => Y <= C;
when "101" => Y <= D;
when others => Y <= (others => 'U'); -- 18-bit vector of 'U'
end case;
end process;
end mux4in3p;
CEDG - Tema 7
16
Comparador de 8 bits
library IEEE;
use IEEE.std_logic_1164.all;
entity vcompare is
port (
A, B: in STD_LOGIC_VECTOR (7 downto 0);
EQ, NE, GT, GE, LT, LE: out STD_LOGIC
);
end vcompare;
architecture vcompare_arch of vcompare is
begin
process (A, B)
begin
EQ <= '0'; NE <= '0'; GT <= '0'; GE <= '0'; LT <= '0'; LE <= '0';
if A = B then EQ <= '1'; end if;
if A /= B then NE <= '1'; end if;
if A > B then GT <= '1'; end if;
if A >= B then GE <= '1'; end if;
if A < B then LT <= '1'; end if;
if A <= B then LE <= '1'; end if;
end process;
end vcompare_arch
CEDG - Tema 7
17
Comparador de 8 bits (alternativo)
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity comp8 is
port ( A, B: in STD_LOGIC_VECTOR (7 downto 0);
EQ, GT: out STD_LOGIC );
end comp8;
architecture comp8_arch of comp8 is
begin
EQ <= '1' when A = B else '0';
GT <= '1' when A > B else '0';
end comp8_arch;
CEDG - Tema 7
18
Barrel shifter 16 bits desplz. circ. izquierda
library IEEE;
use IEEE.std_logic_1164.all;
entity rol16 is
port (
DIN: in STD_LOGIC_VECTOR(15 downto 0); -- Data inputs
S: in STD_LOGIC_VECTOR (3 downto 0); -- Shift amount, 0-15
DOUT: out STD_LOGIC_VECTOR(15 downto 0) -- Data bus output
);
end rol16;
architecture rol16_arch of rol16 is
begin
process(DIN, S)
variable X, Y, Z: STD_LOGIC_VECTOR(15 downto 0);
begin
if S(0)='1' then X := DIN(14 downto 0) & DIN(15); else X := DIN; end if;
if S(1)='1' then Y := X(13 downto 0) & X(15 downto 14); else Y := X; end if;
if S(2)='1' then Z := Y(11 downto 0) & Y(15 downto 12); else Z := Y; end if;
if S(3)='1' then DOUT <= Z(7 downto 0) & Z(15 downto 8); else DOUT <= Z; end if;
end process;
end rol16_arch;
CEDG - Tema 7
19
Circuitos secuenciales
• Descripción de algunos ejemplos de elementos
biestables, circuitos secuenciales y máquinas de
estados
– Báscula R-S
– Biestable D con flanco positivo
– Biestable D con Preset y Clear 74xx74. Se muestra la elevada
flexibilidad y productividad de estas descripciones
– Contador binario de cuatro bits 74xx163
– Ejemplo de máquina de estados que muestra un formato genérico
propuesto para la descripción de este tipo de máquinas
– Máquina estados: intermitente Thunderbird, como ejemplo de
implementación
• Al final del tema se presentan como ejercicios
para el alumno otros componentes
CEDG - Tema 7
20
Báscula R-S
library IEEE;
use IEEE.std_logic_1164.all;
entity Vsrlatch is
port (S, R: in STD_LOGIC;
Q, QN: buffer STD_LOGIC );
end Vsrlatch;
architecture Vsrlatch_arch of Vsrlatch is
begin
QN <= S nor Q;
Q <= R nor QN;
end Vsrlatch_arch;
CEDG - Tema 7
21
Biestable D con flanco positivo
library IEEE;
use IEEE.std_logic_1164.all;
entity Vdff is
port (D, CLK: in STD_LOGIC;
Q: out STD_LOGIC );
end Vdff;
architecture Vdff_b of Vdff is
begin
process(CLK)
begin
if (CLK'event and CLK='1') then Q <= D;
end if;
end process;
end Vdff_b;
CEDG - Tema 7
22
Biestable D con Preset y Clear 74xx74
library IEEE;
use IEEE.std_logic_1164.all;
entity Vdff74 is
port (D, CLK, PR_L, CLR_L: in STD_LOGIC;
Q, QN: out STD_LOGIC );
end Vdff74;
architecture Vdff74_b of Vdff74 is
signal PR, CLR: STD_LOGIC;
begin
process(CLR_L, CLR, PR_L, PR, CLK)
begin
PR <= not PR_L; CLR <= not CLR_L;
if (CLR and PR) = '1' then Q <= '0'; QN <= '0';
elsif CLR = '1' then Q <= '0'; QN <= '1';
elsif PR = '1' then Q <= '1'; QN <= '0';
elsif (CLK'event and CLK='1') then Q <= D; QN <= not D;
end if;
end process;
end Vdff74_b;
CEDG - Tema 7
23
Contador binario de cuatro bits 74xx163
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
entity V74x163 is
port ( CLK, CLR_L, LD_L, ENP, ENT: in STD_LOGIC;
D: in UNSIGNED (3 downto 0);
Q: out UNSIGNED (3 downto 0);
RCO: out STD_LOGIC );
end V74x163;
architecture V74x163_arch of V74x163 is
signal IQ: UNSIGNED (3 downto 0);
begin
process (CLK, ENT, IQ)
begin
if (CLK'event and CLK='1') then
if CLR_L='0' then IQ <= (others => '0');
elsif LD_L='0' then IQ <= D;
elsif (ENT and ENP)='1' then IQ <= IQ + 1;
end if;
end if;
if (IQ=15) and (ENT='1') then RCO <= '1';
else RCO <= '0';
end if;
Q <= IQ;
end process;
end V74x163_arch;
CEDG - Tema 7
24
Ejemplo de máquina de estados
library IEEE;
use IEEE.std_logic_1164.all;
entity smexamp is
port ( CLOCK, A, B: in STD_LOGIC;
Z: out STD_LOGIC );
end;
architecture smexamp_arch of smexamp is
type Sreg_type is (INIT, A0, A1, OK0, OK1);
signal Sreg: Sreg_type;
begin
process (CLOCK) -- state-machine states and transitions
begin
if CLOCK'event and CLOCK = '1' then
case Sreg is
when INIT => if A='0' then Sreg <= A0;
elsif A='1' then Sreg <= A1; end if;
when A0 => if A='0' then Sreg <= OK0;
elsif A='1' then Sreg <= A1; end if;
when A1 => if A='0' then Sreg <= A0;
elsif A='1' then Sreg <= OK1; end if;
when OK0 => if A='0' then Sreg <= OK0;
elsif A='1' and B='0' then Sreg <= A1;
elsif A='1' and B='1' then Sreg <= OK1; end if;
when OK1 => if A='0' and B='0' then Sreg <= A0;
elsif A='0' and B='1' then Sreg <= OK0;
elsif A='1' then Sreg <= OK1;
end if;
when others => Sreg <= INIT;
end case;
end if;
end process;
with Sreg select -- output values based on state
Z <= '0' when INIT | A0 | A1,
'1' when OK0 | OK1,
'0' when others;
end smexamp_arch;
CEDG - Tema 7
25
Máquina estados: intermitente Thunderbird
begin
process (CLOCK)
begin
if CLOCK'event and CLOCK = '1' then
if RESET = '1' then LIGHTS <= IDLE; else
entity Vtbird is
case LIGHTS is
port ( CLOCK, RESET, LEFT, RIGHT, HAZ: in STD_LOGIC;
when IDLE => if HAZ='1' or (LEFT='1' and RIGHT='1') then LIGHTS <= LR3;
LIGHTS: buffer STD_LOGIC_VECTOR (1 to 6) );
elsif LEFT='1' then LIGHTS <= L1;
end;
elsif RIGHT='1' then LIGHTS <= R1;
else LIGHTS <= IDLE;
architecture Vtbird_arch of Vtbird is
end if;
constant IDLE: STD_LOGIC_VECTOR (1 to 6) := "000000";
when L1 => if HAZ='1' then LIGHTS <= LR3; else LIGHTS <= L2; end if;
constant L3 : STD_LOGIC_VECTOR (1 to 6) := "111000";
when L2 => if HAZ='1' then LIGHTS <= LR3; else LIGHTS <= L3; end if;
constant L2 : STD_LOGIC_VECTOR (1 to 6) := "110000";
when L3 => LIGHTS <= IDLE;
constant L1 : STD_LOGIC_VECTOR (1 to 6) := "100000";
when R1 => if HAZ='1' then LIGHTS <= LR3; else LIGHTS <= R2; end if;
constant R1 : STD_LOGIC_VECTOR (1 to 6) := "000001";
when R2 => if HAZ='1' then LIGHTS <= LR3; else LIGHTS <= R3; end if;
constant R2 : STD_LOGIC_VECTOR (1 to 6) := "000011";
when R3 => LIGHTS <= IDLE;
constant R3 : STD_LOGIC_VECTOR (1 to 6) := "000111";
when LR3 => LIGHTS <= IDLE;
constant LR3 : STD_LOGIC_VECTOR (1 to 6) := "111111";
when others => null;
end case;
end if;
end if;
end process;
end Vtbird_arch;
CEDG - Tema 7
26
Introducción de la temporización (VHDL)
• Permiten asignar retardos a las señales (habitualmente a
las salidas respecto a las entradas) mediante la palabra
clave after
• Ejemplo
library IEEE;
use IEEE.std_logic_1164.all;
entity BasculaRS is
port (S,R: in STD_LOGIC;
Q, QN: buffer STD_LOGIC);
end BasculaRS;
architecture BasculaRS_arch of BasculaRS is
begin
QN <= S nor Q after 4 ns;
Q <= R nor QN after 4 ns;
end BasculaRS_arch;
CEDG - Tema 7
27
Descripciones estructurales (VHDL)
library IEEE;
use IEEE.std_logic_1164.all;
entity Decodificador_2_a_4 is
port (I0,I1,EN: in STD_LOGIC;
Y0,Y1,Y2,Y3: out STD_LOGIC);
end Decodificador_2_a_4;
architecture Decodificador_2_a_4_arch of
Decodificador_2_a_4 is
signal NOTI0, NOTI1: STD_LOGIC;
component inv port (I: in STD_LOGIC; O: out
STD_LOGIC); end component;
component and3 port (I0, I1, I2: in STD_LOGIC; O:
out STD_LOGIC); end component;
begin
process (CLK,CLR)
begin
U1: inv port map (I0,NOTI0);
U2: inv port map (I1,NOTI1);
U3: and3 port map (NOTI0,NOTI1,EN,Y0);
U4: and3 port map (I0,NOTI1,EN,Y1);
U5: and3 port map (NOTI0,I1,EN,Y2);
U6: and3 port map (I0,I1,EN,Y3);
end Decodificador_2_a_4_arch;
CEDG - Tema 7
28
PLD: Dispositivos Lógicos Programables
• Se basan en el principio de que cualquier circuito
combinacional puede realizarse como una suma de
productos
• La idea es construir dentro de un circuito integrado un
array grande de puertas AND (para realizar los productos)
y puertas OR (para realizar las sumas) con
interconexiones programables
– n entradas. Las puertas AND tienen 2n entradas, (cada
variable y su complementada)
– m salidas, que corresponden a las salidas de cada una
de las puertas OR que realizan las sumas
• Cada puerta AND puede conectarse por programación del
dispositivo a entradas de las puertas OR
• Los sintetizadores permiten pasar descripciones
funcionales (i.e. VHDL) a este tipo de dispositivos
CEDG - Tema 7
29
PLA 4X3 con 6 productos, p=6
• Las conexiones se realizan fundiendo los fusibles
marcados en azul como X
CEDG - Tema 7
30
Representación compacta
CEDG - Tema 7
31
Ejemplo
CEDG - Tema 7
32
PAL
• Habitualmente no se utiliza la compartición de productos,
lo que no justifica el array OR
• En las PAL el array OR es fijo. Cada puerta AND está
permanentemente conectada a una puerta OR
determinada
• Ejemplo: PAL16L8
CEDG - Tema 7
33
Ejemplo de PAL
• 10 entradas
• 8 salidas, con 7 AND por
salida
• 64 filas y 32 columnas (16
variables de entrada a
AND)
• 1 AND para salida
triestado
• 6 salidas disponibles como
entradas
– Mas entradas pero
menos salidas
– Pueden usarse como
lógica en dos pasos
CEDG - Tema 7
34
L
lid
i
tid
PAL secuenciales
• Integran biestables a las
salidas, lo que permite el
diseño de circuitos
síncronos
• Ejemplo: PAL 16R8
CEDG - Tema 7
35
Detalle de una salida de la PAL 16R8
• 8 términos producto entran a un biestable tipo D
– Reloj activado por flanco, común a todos los biestables
• La salida Q se realimenta en el array AND para facilitar la
realización de máquinas de estados
• Salidas triestado con una señal común de “Enable”
CEDG - Tema 7
36
GAL 16V8
• Una de las más comunes
• Cada salida es
programable para que
funcione como
combinacional o registrada
con un biestable
• El nivel de cada salida
también es programable
CEDG - Tema 7
37
Lógica de salida de la GAL 16V8
CEDG - Tema 7
38
Arquitectura general de una FPGA
• Dispone de bloques lógicos complejos programables
(CLB)
• Dispone de una matriz de interconexión de bloques lógicos
programable
CEDG - Tema 7
39
Bloque configurable de la FPGA XC4000
• Los bloques F, G y H son elementos combinacionales que
pueden implementar funciones de 4, 5, 6 y 9 variables
• Las salidas pueden ser registradas o no
CEDG - Tema 7
40
Diagrama general del conexionado XC4000
• Dispone de una gran variedad de posibilidades de
conexionado para maximizar el uso del hardware
CEDG - Tema 7
41
Ejemplos adicionales y ejercicios
• Se presentan tres ejemplos adicionales:
– Codificador de prioridad 8 entradas 74xx148
– Barrel shifter de16 bits y desplazamientos circulares a
izquierda y derecha
– Máquina de estados de las adivinanzas
• Ejercicios:
– Obtenga la función lógica y la tabla de comportamiento
del codificador de prioridad 74xx148
– Obtenga la función lógica y la tabla de comportamiento
del registro de desplazamiento del segundo ejemplo
– Obtenga el diagrama de estados de la máquina de
estados del tercer ejemplo
CEDG - Tema 7
42
Codificador de prioridad 8 entradas 74xx148
library IEEE;
use IEEE.std_logic_1164.all;
entity V74x148 is
port (
EI_L: in STD_LOGIC;
I_L: in STD_LOGIC_VECTOR (7 downto 0);
A_L: out STD_LOGIC_VECTOR (2 downto 0);
EO_L, GS_L: out STD_LOGIC
);
end V74x148;
architecture V74x148p of V74x148 is
signal EI: STD_LOGIC; -- active-high version of input
signal I: STD_LOGIC_VECTOR (7 downto 0); -- active-high version
of inputs
signal EO, GS: STD_LOGIC; -- active-high version of outputs
signal A: STD_LOGIC_VECTOR (2 downto 0); -- active-high version
of outputs
begin
process (EI_L, I_L, EI, EO, GS, I, A)
variable j: INTEGER range 7 downto 0;
begin
EI <= not EI_L; -- convert input
I <= not I_L; -- convert inputs
EO <= '1'; GS <= '0'; A <= "000";
if (EI)='0' then EO <= '0';
else for j in 7 downto 0 loop
if I(j)='1' then
GS <= '1'; EO <= '0'; A <= CONV_STD_LOGIC_VECTOR(j,3);
exit;
end if;
end loop;
end if;
EO_L <= not EO; -- convert output
GS_L <= not GS; -- convert output
A_L <= not A; -- convert outputs
end process;
end V74x148p;
CEDG - Tema 7
43
Barrel shifter 16 bitsarchitecture
despz.
circ.
izq.
y
dcha.
rol16r_arch of rolr16 is
library IEEE;
use IEEE.std_logic_1164.all;
entity rolr16 is
port (
DIN: in STD_LOGIC_VECTOR(15 downto 0); -Data inputs
S: in STD_LOGIC_VECTOR (3 downto 0); -- Shift
amount, 0-15
DIR: in STD_LOGIC; -- Shift direction, 0=>L, 1=>R
DOUT: out STD_LOGIC_VECTOR(15 downto 0) -Data bus output
);
end rolr16;
begin
process(DIN, S, DIR)
variable X, Y, Z: STD_LOGIC_VECTOR(15 downto 0);
variable CTRL0, CTRL1, CTRL2, CTRL3:
STD_LOGIC_VECTOR(1 downto 0);
begin
CTRL0 := S(0) & DIR; CTRL1 := S(1) & DIR; CTRL2 := S(2) &
DIR; CTRL3 := S(3) & DIR;
case CTRL0 is
when "00" | "01" => X := DIN;
when "10" => X := DIN(14 downto 0) & DIN(15);
when "11" => X := DIN(0) & DIN(15 downto 1);
when others => null; end case;
case CTRL1 is
when "00" | "01" => Y := X;
when "10" => Y := X(13 downto 0) & X(15 downto 14);
when "11" => Y := X(1 downto 0) & X(15 downto 2);
when others => null; end case;
case CTRL2 is
when "00" | "01" => Z := Y;
when "10" => Z := Y(11 downto 0) & Y(15 downto 12);
when "11" => Z := Y(3 downto 0) & Y(15 downto 4);
when others => null; end case;
case CTRL3 is
when "00" | "01" => DOUT <= Z;
when "10" | "11" => DOUT <= Z(7 downto 0) & Z(15 downto 8);
when others => null; end case;
end process;
end rol16r_arch;
CEDG - Tema 7
44
Máquina de estados de las adivinanzas
library IEEE;
use IEEE.std_logic_1164.all;
entity Vggame is
port ( CLOCK, RESET, G1, G2, G3, G4: in STD_LOGIC;
L1, L2, L3, L4, ERR: out STD_LOGIC );
end;
architecture Vggame_arch of Vggame is
type Sreg_type is (S1, S2, S3, S4, SOK, SERR);
signal Sreg: Sreg_type;
begin
process (CLOCK)
begin
if CLOCK'event and CLOCK = '1' then
if RESET = '1' then Sreg <= SOK; else
case Sreg is
when S1 => if G2='1' or G3='1' or G4='1' then Sreg <= SERR;
elsif G1='1' then Sreg <= SOK;
else Sreg <= S2;
end if;
when S2 => if G1='1' or G3='1' or G4='1' then Sreg <= SERR,
elsif G1='1' then Sreg <= SOK;
else Sreg <= S3;
end if;
when S3 => if G1='1' or G2='1' or G4='1' then Sreg <= SERR;
elsif G1='1' then Sreg <= SOK;
else Sreg <= S4;
end if;
when S4 => if G1='1' or G2='1' or G3='1' then Sreg <= SERR;
elsif G1='1' then Sreg <= SOK;
else Sreg <= S1;
end if;
when SOK | SERR => if G1='0' and G2='0' and G3='0' and G4='0'
then Sreg <= S1; end if;
when others => Sreg <= S1;
end case;
end if;
end if;
end process;
L1 <= '1' when Sreg = S1 else '0';
L2 <= '1' when Sreg = S2 else '0';
L3 <= '1' when Sreg = S3 else '0';
L4 <= '1' when Sreg = S4 else '0';
ERR <= '1' when Sreg = SERR else '0';
end Vggame_arch;
CEDG - Tema 7
45
Descargar