Professional Documents
Culture Documents
PROFESOR CARRILLO
LABORATORIO Nº1
OBJETIVOS:
En el siguiente proyecto experimentaremos con el módulo FPGA y usaremos los
softwares Max plus y Quartus para poder hacer las simulaciones.
Preparar, experimentar y almacenar como datos las muestras de señales
generadas por un programa o señales de voz y audio para trabajarlo junto con
el módulo FPGA.
DESARROLLO
Sólo para fines de simulación todo puerto puede tener un valor por defecto que
determina el valor inicial de la señal, los puertos de entrada pueden dejarse
desconectados si tienen un valor por defecto.
Este estilo se caracteriza por utilizar las asignaciones concurrentes a señales (ACS).
Tenemos 3 tipos de ACS:
- ACS única
- ACS condicional
- ACS selectiva
Estas sentencias terminan asignando un valor a una señal después de evaluar toda una
expresión, esta evaluación se realiza cuando ocurre un evento en una de las señales
que se encuentran a la derecha del símbolo de asignación a señal (<=).
En la declaración anterior se nota que hay una prioridad en la asignación a señal, por
ejemplo, para que la señal tome el resultado de la expresión3 debe cumplirse que la
condición1 y condición2 sean falsas y la condición3 sea verdadera. La prioridad la tiene
la condición1, si esta no se cumple se pasa a evaluar la condición2, si esta no se cumple
se pasa a evaluar la condición3 y así sucesivamente se evalúan todas las condiciones
hasta que cumpla alguna de ellas.
Hay que aclarar que siempre se termina evaluando una expresión y asignando la
respuesta a la señal así no se cumpla ninguna condición.
- decodificador de 3 a 8;
ENTRADA <= C & B & A;
TEMPORAL <= “11111110” when ENTRADA = “000” else
“11111101” when ENTRADA = “001” else
“11111011” when ENTRADA = “010” else
“11110111” when ENTRADA = “011” else
“11101111” when ENTRADA = “100” else
“11011111” when ENTRADA = “101” else
“10111111”whenENTRADA=“110”else“01111111”
;
Y <= TEMPORAL when ENA =’1’ else “11111111”;
Esta sentencia requiere que se especifique todos los posibles valores que puede tomar
la expresión a evaluar, por lo que generalmente la sentencia se escribe de la siguiente
manera:
Con la palabra others se está cubriendo el resto de valores que no han sido
especificados en la sentencia. Veamos algunos ejemplos:
- compuerta AND:
Laboratorio 2
Crear el circuito medio sumador mostrado en la Fig. 2.3 usando el editor de entradas de
diseño VHDL;
Ahora implementamos la parte de los component para unir las partes anteriores:
Ahora declaramos las entradas y salidas del FPGA:
Multiplexores y Demultiplexores:
Los multiplexores son circuitos combinacionales con varias entradas y una única salida
de datos. Están dotados de entradas de control capaces de seleccionar una, y sólo una,
de las entradas de datos para permitir su transmisión desde la entrada seleccionada
hacia dicha salida.
CIRCUITO A IMPLEMENTAR:
Codificador:
Ejemplo de codificador de 3 a 2
Implementación en VHDL
Decodificador:
Un decodificador es un circuito combinacional, cuya función es inversa a la
del codificador, es decir, convierte un código binario de entrada (natural, BCD, etc.)
de N bits de entrada y M líneas de salida (N puede ser cualquier entero y M es un
entero menor o igual a 2N), tales que cada línea de salida será activada para una
sola de las combinaciones posibles de entrada. Normalmente, estos circuitos
suelen encontrarse como decodificador / demultiplexor. Esto es debido a que un
demultiplexor puede comportarse como un decodificador.
Si por ejemplo se tiene un decodificador de 2 entradas con 2 2=4 salidas, su
funcionamiento sería el que se indica en la siguiente tabla, donde se ha
considerado que las salidas se activen con un "uno" lógico.
SISTEMAS SECUENCIALES
A diferencia de los sistemas combinacionales, en los sistemas secuenciales, los valores
de las salidas, en un momento dado, no dependen exclusivamente de los valores de las
entradas en dicho momento, sino también dependen del estado anterior o estado interno.
El sistema secuencial más simple es el biestable, de los cuales, el de tipo D (o cerrojo) es
el más utilizado actualmente.
El sistema secuencial requiere de la utilización de un dispositivo de memoria que pueda
almacenar la historia pasada de sus entradas (denominadas variables de estado) y le
permita mantener su estado durante algún tiempo, estos dispositivos de memoria pueden
ser sencillos como un simple retardador o celdas de memoria de tipo DRAM, SRAM2 o
multivibradores biestables también conocido como Flip-Flop1 entre otros.
PROCESS
Un PROCESS, como se ha dicho antes, es una sentencia concurrente en el sentido de
que todos los PROCESS y todas las demás sentencias concurrentes se ejecutarán sin un
orden establecido. No obstante las sentencias que hay dentro del PROCESS se ejecutan
de forma secuencial.
Por lo tanto se puede decir que una estructura secuencial va en el interior de
un PROCESS.
La estructura genérica de esta sentencia es:
PROCESS [lista de sensibilidad]
[declaración de variables]
BEGIN
[sentencias secuenciales]
END PROCESS;
La lista de sensibilidad es una serie de señales que, al cambiar de valor, hacen que se
ejecute el PROCESS.
Un ejemplo sería:
PROCESS(señal1, señal2)
...
Ejemplo_2 en VHDL
Simulación del código anterior
Latch SR
El latch lógico más simple es el SR, donde R y S representan los estados
'reset' y 'set' respectivamente. El latch es construido mediante la
interconexión retroalimentada de puertas lógicas NOR (negativo OR), o
bien de puertas lógicas NAND (aunque en este caso la tabla de verdad
tiene salida en lógica negativa para evitar la incongruencia de los datos). El
bit almacenado está presente en la salida marcada como Q, y Q´ su
complementación (valor negativo a Q).
Al tener dos entradas para el ingreso de datos (S y R), tenemos 4 posibles
combinaciones (recordando que 2n representa las combinaciones posibles
con datos binarios, donde 'n' representa el número de bits a trabajar). Cada
combinación define el estado presente en Q, de esta manera tenemos la
siguiente tabla de verdad:
Ejemplo en vhdl
Latch D
También conocido como latch transparente, debido a que el nivel presente en D se
almacenará en el latch en el momento en que la entrada Habilitar (Enable por su palabra
en inglés), sea activada, generalmente mediante un estado alto, es decir 1.
Al tener dos entradas para el ingreso de datos (EN y D), tenemos 4 posibles
combinaciones (recordando que 2n representa las combinaciones posibles con datos
binarios, donde 'n' representa el número de bits a trabajar). Cada combinación define el
estado presente en Q, de esta manera tenemos la siguiente tabla de verdad
Ejemplo en vhdl
D Flip-Flop
Un biestable (flip-flop en inglés), es un multivibrador capaz de permanecer en uno de dos
estados posibles durante un tiempo indefinido en ausencia de perturbaciones.1 Esta
característica es ampliamente utilizada en electrónica digital para memorizar información.
El paso de un estado a otro se realiza variando sus entradas. Dependiendo del tipo de
dichas entradas los biestables se dividen en:
Ejemplo en vhdl
D Flip-Flop con reset y con habilitador
Ejemplo en vhdl
Simulación
C3
C4
Mux4a1
Registro de 4 bits
Registro de 8 bits
Decodificador de 7 segmentos
library ieee;
use ieee.std_logic_1164.all;
entity top_calc is
port ( sw: in std_logic_vector (17 downto 0);
clock,reset,enter: in std_logic;
hex0,hex1: out std_logic_vector(6 downto 0);
ledr: out std_logic_vector(7 downto 0)
);
end top_calc;
component C2
port(
A,B: in std_logic_vector(7 downto 0);
F: out std_logic_vector(7 downto 0));
end component;
component C3
port(
A,B: in std_logic_vector(7 downto 0);
F: out std_logic_vector(7 downto 0));
end component;
component C4
port(
A: in std_logic_vector(7 downto 0);
F: out std_logic_vector(7 downto 0));
end component;
component mux4x1
port(
w,x,y,z: in std_logic_vector(7 downto 0);
s: in std_logic_vector(1 downto 0);
m: out std_logic_vector(7 downto 0));
end component;
component D_4FF
port(
CLK,RST,ENABLE: in std_logic;
D: in std_logic_vector(3 downto 0);
Q: buffer std_logic_vector(3 downto 0));
end component;
component D_8FF
port(
CLK,RST,ENABLE: in std_logic;
D: in std_logic_vector(7 downto 0);
Q: buffer std_logic_vector(7 downto 0));
end component;
component DECO7SEG
port (ENT: in std_logic_vector(3 downto 0);
DISPLAY: out std_logic_vector(6 downto 0));
end component;
begin
L1: C1 port map (sw(15 downto 8),sw(7 downto 0),f1);
L2: C2 port map (sw(15 downto 8),sw(7 downto 0),f2);
L3: C3 port map (sw(15 downto 8),sw(7 downto 0),f3);
L4: C4 port map (sw(7 downto 0),f4);
L5: mux4x1 port map (f1,f2,f3,f4,sw(17 downto 16),f);
L6: D_4FF port map (clock,reset,enter,f(7 downto 4),g1);
L7: D_4FF port map (clock,reset,enter,f(3 downto 0),g2);
L8: D_8FF port map (clock,reset,enter,f,ledr);
L9: DECO7SEG port map (g1,hex1);
L10: DECO7SEG port map (g2,hex0);
end solucion;
LABORATORIO 7
Maquinas de estados (FSM)
Se denomina máquina de estados a un modelo de comportamiento de un sistema con
entradas y salidas, en donde las salidas dependen no sólo de las señales de entradas
actuales sino también de las anteriores.
Las máquinas de estados se definen como un conjunto de estados que sirve de
intermediario en esta relación de entradas y salidas, haciendo que el historial de señales
de entrada determine, para cada instante, un estado para la máquina, de forma tal que la
salida depende únicamente del estado y las entradas actuales.
Una máquina de estados se denomina máquina de estados finitos (FSM por finite state
machine) si el conjunto de estados de la máquina es finito, este es el único tipo de
máquinas de estados que podemos modelar en un computador en la actualidad; debido a
esto se suelen utilizar los términos máquina de estados y máquina de estados finitos de
forma intercambiable. Sin embargo un ejemplo de una máquina de estados
infinitos sería un computador cuántico esto es debido a que los Qubit que utilizaría este
tipo de computadores toma valores continuos, en contraposición los bits toman valores
discretos (0 ó 1). Otro buen ejemplo de una máquina de estados infinitos es una Máquina
universal de Turing la cual se puede definir teóricamente con una "cinta" o memoria
infinita.
La representación de una máquina de estados se realiza mediante un Diagrama de
estados, sin embargo también es posible utilizar un Diagrama de flujo.
Máquina de Moore
Ejemplo en VHDL
Diseño de un contador anillo con máquinas de estados
Decodificador de 7 segmentos
Para la implementación del circuito se unió todos los bloques en un solo
archivo vhdl con ayuda de la sentencia component. Este circuito nos permite
visualizar en los display las letras desde la A hasta la Z(los números en
hexadecimal es lo que se visualizará en los display).
entity topstate is
port (key : in std_logic_vector(3 downto 0);
clk : in std_logic;
TD_RESET : out std_logic;
HEX0, HEX1 : out std_logic_vector(6 downto 0);
LEDG : out std_logic_vector(7 downto 0));
end topstate;
component ASCII_counter
port (clk : in std_logic;
key : in std_logic;
ASCII : buffer std_logic_vector(7 downto 0));
end component;
component decod7seg
port(A: in std_logic_vector(3 downto 0);
F1: out std_logic_vector(6 downto 0));
end component;
begin
LEDG<=F;
end solucion;
LABORATORIO 8
Diagrama de estados:
Tabla de transición
Código VHDL
Controlador FSM
library ieee;
use ieee.std_logic_1164.all;
entity FSMctrl is
port(clk, rst, enter: in std_logic;
operation: in std_logic_vector(1 downto 0);
--selection: out std_logic_vector(1 downto 0);
enable_1, enable_2: out std_logic);
end FSMctrl;
begin
process(clk, rst)
begin
if rst = '0' then
EP <= s0;
elsif rising_edge(clk) then
EP <= ES;
end if;
end process;
Circuito Final
library IEEE;
use IEEE.std_logic_1164.all;
entity top_calc is
port(SW: in std_logic_vector(17 downto 0);
EN,CLK,RST: in std_logic;
DISP1, DISP0: out std_logic_vector(6 downto 0);
LEDR: out std_logic_vector(17 downto 0));
end top_calc;
component C2
port(A: in std_logic_vector(7 downto 0);
B: in std_logic_vector(7 downto 0);
F: out std_logic_vector(7 downto 0));
end component;
component C3
port(A: in std_logic_vector(7 downto 0);
B: in std_logic_vector(7 downto 0);
F: out std_logic_vector(7 downto 0));
end component;
component C4
port(A: in std_logic_vector(7 downto 0);
F: out std_logic_vector(7 downto 0));
end component;
component mux4x1
port(w, x, y, z: in std_logic_vector(7 downto 0);
s: in std_logic_vector(1 downto 0);
m: out std_logic_vector(7 downto 0));
end component;
component reg4bits
port(CLK: in std_logic;
RST: in std_logic;
EN: in std_logic;
D: in std_logic_vector(3 downto 0);
Q: out std_logic_vector(3 downto 0));
end component;
component reg8bits
port(CLK: in std_logic;
RST: in std_logic;
EN: in std_logic;
D: in std_logic_vector(7 downto 0);
Q: out std_logic_vector(7 downto 0));
end component;
component decod7seg
port(A: in std_logic_vector(3 downto 0);
F1: out std_logic_vector(6 downto 0));
end component;
component FSMctrl
port(clk, rst, enter: in std_logic;
operation: in std_logic_vector(1 downto 0);
--selection: out std_logic_vector(1 downto 0);
enable_1, enable_2: out std_logic);
end component;
begin