You are on page 1of 17

ESCUELA SUPERIOR POLITECNICA DEL LITORAL

LABORATORIO DE SISTEMAS DIGITALES


PROYECTO #1
DECODIFICADOR DE DATOS

PROFESOR
Msc. Ronald Ponguillo

INTEGRANTES
Bedn Snchez Jos Manssur Nicola Adib

TERMINO VACACIONAL 2012

ESPECIFICACION
El circuito que se ah procedido a ensamblar, nos permite recibir una trama de manera serial, esto es bit a bit, el cual posteriormente se proceder a verificar, que cumpla una serie de especificaciones: Para que la trama sea vlida deber tener las siguientes caractersticas:

La secuencia de inicio consta de los tres bits: 110 Los cuatro dgitos siguientes corresponden a la informacin, que es un nmero en formato BCD El siguiente bit es un bit de complemento, que para nuestro caso no significar nada en especial Los dos ltimos bits representan la secuencia de fin de trama y ser: 01 El circuito estar listo para recibir la trama cada vez que se presione y suelte el botn START. Este circuito deber hacer la validacin de la trama y en caso de haber error generar la seal correspondiente. Los tres posibles errores que se pueden dar son: Error de secuencia de inicio, Error de secuencia de fin y error de formato de dato, cada uno de los cuales se presentarn visualmente por medio de diodos led, y de activarse debern mantener su estado hasta que se presione la seal START. Si existe una trama vlida se deber encender la salida VALIDO y si se presiona el botn MOSTRAR deber verse el dato en un display de siete segmentos. El circuito DECODIFICADOR DE DATOS funciona tanto con reloj manual, como con reloj automtico, esta seleccin se la ejecuta mediante un selector.

DIAGRAMA DE BLOQUES

Reset

Data

Sel Clock

Enter

Pulso

CIRCUITO DIGITAL

Start

Mostrar

TRAMA

Valido

DIAGRAMA ASM

Resetn a enR,ldR,enC,ldC

Start 1 b

Start c 0

0 Enter d 1

Enter 0 e enC,enR f

Veces 1 g

0 Valido 1 h Correcto 0 Start

i enLeds 0 Start

Descripcin Entradas Start: Es una seal externa, la cual se activa mediante un pulsador, el cual general una seal de lgica negativa para que posteriormente en el bloque de ANTIREBOTE, se corrija la seal y la invierta, este botn es de arranque para el circuito digital. Enter: Seal externa, de la misma manera de lgica negativa, este botn tiene la funcin de enviar el dato que se encuentre en la seal Data, la cual es manejada por un pulsador externo. Veces: Seal interna que se genera en alto cuando halla ocurrido 10 lecturas de Data, es decir que en el bloque de contador_down llegue a 0, se genera esta seal. Valido: Seal interna que verifica que si la trama contiene el formato indicado en las especificaciones. Salidas enR: seal de habilitacin del registro de reg_der_iz, esta seal sola activada hace la funcin de desplazar. ldR: seal de carga del reg_der_iz, junto a la seal enR activada, carga el valor de entrada del registro, para nuestro caso carga de 0, como inicializacin. enC: seal de conteo de contador_down, esta sola seal activada hace la funcin de decrementar su valor genrico para nuestro caso 11. ldC: seal de carga del contador_down, esta seal junto a la enC, mantiene su valor en la entrada. enLeds: seal que se habilita para poder visualizar el efecto en los LEDs que nos da el Error del formato. Correcto: en caso que la seal de entrada Valido sea verdadera, esto habilitar la salida Correcto, que significa que el formato en la trama esta Valido.

DIAGRAMA DE TIEMPO

En el diagrama se puede observar el cambio de estados en la seal y, la cual podemos constatar la transicin entre estados, para poder visualizar el funcionamiento, se cargo la entrada selClock seleccionado con alto, esto hace que usemos el oscilador interno de 8MHz el cual pasa por el bloque CLOCK_DIV y tomamos el reloj de 100Hz. Como podemos observar el funcionamiento no empieza mientras no este activada la entrada Start, luego de eso, se procedi a enviar 10 Enter consecutivos, en cada

ejecucin se habilita el enR y enC, los cuales el uno desplaza el dato en el registro de desplazamiento y el otro decrementa el valor de conteo del contador_down, los cuales toman el valor que se encuentra en la entrada Data, y lo carga en el registro de desplazamiento, el cual interacta 10 veces, cuando esto ocurre la seal interna Veces debi activarse, y aqu hace el cambio de estado, en la cual procede a preguntar si toda la trama es valida, para el caso particular la trama fue vlida, por lo tanto ningn led de Error se puso en alto, en cambio la salida Valido, fue habilitada, se puede notar, que existe un enter 11, el cual no lo reconoce, debido a que al pasar a otro estado en la cual no pregunta por el Enter actual, sino por la seal de Valido, esto es porque las 10 ejecuciones ya fueron realizadas. Finalmente se pone en bajo la seal de Reset el cual es asincrnico, esto es que no depende de la seal de reloj, simplemente como mxima prioridad en todo el circuito encera todas las entradas, actuales en cada bloque.

DIAGRAMA ESQUEMATICO

DESCRIPCION VHDL
Controlador.vhd
controlador Clock Resetn Start Enter Veces Valido enC ldC enR ldR enLeds Correcto

inst23

library ieee; use ieee.std_logic_1164.all; entity controlador is port(Clock,Resetn,Start,Enter,Veces,Valido:in std_logic; enC,ldC,enR,ldR,enLeds,Correcto:out std_logic); end controlador; architecture sol of controlador is type estado is (a,b,c,d,e,f,g,h,i); signal y:estado; Begin Process(Clock,Resetn) Begin if(Resetn='0') then y<=a; else if(Clock'event and Clock='1') then case y is when a => if(Start='0') then y<=a; else y<=b; end if; when b => if(Start='1') then y<=b; else y<=c; end if; when c => if(Enter='0') then y<=c; else y<=d; end if; when d => if(Enter='1') then y<=d; else y<=e; end if; when e => y<=f; when f => if(Veces='0') then y<=c; else y<=g; end if; when g => if(Valido='1') then y<=h; else y<=i; end if; when h => if(Start='0') then y<=h; else y<=a; end if; when i => if(Start='0') then y<=i; else y<=a; end if; end case; end if;end if; end process;

Process(y,Start,Enter,Veces,Valido) Begin enC<='0';ldC<='0';enR<='0';ldR<='0';Correcto<='0';enLeds<='0'; case y is when a => enC<='1';ldC<='1';enR<='1';ldR<='1'; when b => when c => when d => when e => enC<='1';enR<='1'; when f => when g => when h => Correcto<='1'; when i => enLeds<='1'; end case; end process; end sol;

selector.vhd
selector ClockM ClockI sel inst2 Clock

library ieee; use ieee.std_logic_1164.all; entity selector is port( ClockM,ClockI,sel Clock end selector;

:in std_logic; :out std_logic);

architecture sol of selector is Begin Clock<=ClockM when(sel='0') else ClockI; end sol;

Reg_izq_der.vhd
Param eter Value Type k 10 Signed Integer
reg_der_izq resetn clock en ld data v al_ini[k-1..0] Q[k-1..0]

inst1

library ieee; use ieee.std_logic_1164.all; entity reg_der_izq is generic(k: integer:=10); port(resetn,clock,en,ld,data: in std_logic; val_ini: in std_logic_vector(k-1 downto 0); Q: buffer std_logic_vector(k-1 downto 0)); end reg_der_izq; architecture sol of reg_der_izq is begin process(resetn,clock) begin if(Resetn='0') then Q<=(others=>'0'); elsif (clock'event and clock='1') then if en='1' then if Ld='1' then Q<=val_ini; else desp:for i in 1 to k-1 loop Q(i)<=Q(i-1); end loop; Q(0)<=data; end if; end if; end if; end process; end sol;

Formato.vhd
f ormato dato[9..0] led[2..0] v alido

inst4

library ieee; use ieee.std_logic_1164.all; entity formato is port( dato: in std_logic_vector(9 downto 0); led: out std_logic_vector(2 downto 0); valido: out std_logic); end formato; architecture sol of formato is signal tmp:std_logic_vector(2 downto 0); Begin tmp(0)<='0' when (dato(9)='1' and dato(8)='1' and dato(7)='0') else '1'; tmp(1)<='0' when (dato(1)='0' and dato(0)='1') else '1'; tmp(2)<='0' when (tmp(0)='0' and tmp(1)='0') else '1'; led<=tmp; valido<=not(tmp(2)); end sol;

portero.vhd
portero A[2..0] enable B[2..0]

inst9

library ieee; use ieee.std_logic_1164.all; entity portero is port( A:in std_logic_vector (2 downto 0); enable:in std_logic; B:out std_logic_vector(2 downto 0)); end portero; architecture sol of portero is Begin B<=A when(enable='1') else "000"; end sol;

contador_down.vhd
Param eter Value Type n 11 Signed Integer
contador_down resetn clock en ld Q[0..n-1]

inst6

library ieee; use ieee.std_logic_1164.all; entity contador_down is generic(n:integer:=10); port( resetn,clock: in std_logic; en,ld : Q end contador_down;

in std_logic; : buffer integer range 0 to n-1);

architecture sol of contador_down is begin process(resetn,clock) begin if(resetn='0') then Q<=0; elsif (clock'event and clock='1') then if en='1' then if ld='1' then Q<=n-1; else Q<=Q-1;end if; end if; end if; end process; end sol;

NORp.vhd
Param eter Value Type n 11 Signed Integer
NORp A[0..n-1] B

inst5

library ieee; use ieee.std_logic_1164.all; entity NORp is generic(n:integer:=10); port( A:in integer range 0 to n-1; B:out std_logic); end NORp; architecture sol of NORp IS

Begin B<='1' when (A=0) else '0'; end sol;

BinarioBCD.vhd
BinarioBCD bin[3..0] bcdU[3..0] bcdD[3..0]

inst3

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity BinarioBCD is port( bin:in std_logic_vector(3 downto 0); bcdU,bcdD:out std_logic_vector(3 downto 0)); end BinarioBCD; architecture sol of BinarioBCD is Begin bcdD<="0001" when (bin>"1001") else "0000"; bcdU<=bin when (bin<"1010") else (bin-"1010"); end sol;

decoderUD.vhd
decoderUD bcd[3..0] show Resetn inst7 seg[6..0]

library ieee; use ieee.std_logic_1164.all; entity decoderUD is Port( bcd:in std_logic_vector(3 downto 0); show,Resetn:in std_logic; seg:out std_logic_vector(6 downto 0)); end decoderUD; architecture sol of decoderUD is signal tmp: std_logic_vector(6 downto 0):="0000000"; Begin Process(Resetn,bcd,show,tmp) Begin if(Resetn='0') then seg<=(others=>'0'); else if(show='1') then if (bcd="0000") then tmp<="1111110"; elsif (bcd="0001") then tmp<="0110000"; elsif (bcd="0010") then tmp<="1101101"; elsif (bcd="0011") then tmp<="1111001"; elsif (bcd="0100") then tmp<="0110011"; elsif (bcd="0101") then tmp<="1011011"; elsif (bcd="0110") then tmp<="1011111"; elsif (bcd="0111") then tmp<="1110000"; elsif (bcd="1000") then tmp<="1111111"; elsif (bcd="1001") then tmp<="1111011"; end if; seg<=tmp; else tmp<="0000000"; seg<=tmp; end if; end if; end Process; end sol;

Reporte de Aprovechamiento

You might also like