Anda di halaman 1dari 17

ESCUELA POLITECNICA DEL EJERCITO

DEPARTAMENTO DE ELECTRICA Y ELECTRONICA AUTOMATIZACION Y CONTROL DISEO VLSI

SECUENCIA DE LEDS

PIETROS MATAMOROS ALBERTO MOSQUERA CHRISTIAN SALGADO

Sangolqu, 20 de diciembre de 2011

OBJETIVOS

Utilizacin de las instrucciones secuenciales, concurrentes y paquetes aprendidos en clase. Familiarizarse con el Spartan 3 y el uso de un constraint file para asignacin de pines de I/O, pulsadores, switches y LEDs.

MARCO TEORICO

Mquina Secuencial: Son ciertos circuitos secuenciales que tienen un nmero determinado de estados (2n). Pueden ser retroalimentados (flip flops, biestables) o mquinas sincrnicas temporizadas cuando utilizan las primeras para crear circuitos cuyas entradas son examinadas y cuyas salidas cambian con respecto a una seal de reloj controlada. En cualquier caso, se tienen unas entradas, unas salidas y unos estados.

Lgica de estado siguiente (F): Una funcin de las entradas y del estado actual. Memoria de estados: Es un conjunto de n fil flops que almacenan el estado presente de la mquina, que tiene 2n estados diferentes. La seal de reloj: controla el cambio de estado en tales flip flops. La seal de reloj: dispone el funcionamiento de los flip flops ya sea por disparo de flanco o por disparo de pulso Lgica de salida (G): Una funcin del estado actual y/o de la entrada.

Mquina de Mealy: Es la mquina de estado en la cul la salida depende tanto del estado presente como de las entradas externas. Mquina de Moore: Es la mquina de estado en la cual las salidas solo dependen del estado presente.

REPRESENTACIN DE LAS MQUINAS SECUENCIALES Divisor de frecuencia: Se llamadivisor de frecuenciaa un dispositivo que produce a su salida unafrecuenciamenor que la de entrada. Suelen estar formados porcontadoresdigitales. Se pueden obtener relaciones de frecuencia no enteras utilizando contadores de mdulo variable, por ejemplo, si a cada pulso de salida se cambia el mdulo del contador entre 2 y 3, se obtiene una relacin de frecuencias de 5:2. La importancia y utilidad de los divisores en sus variantes, radica en la precisin, por ejemplo, en la necesidad de conocer la frecuencia exacta de una seal electromagntica del tipo que sea, ya que cuanto mayor sea la exactitud de la divisin tanto mayor ser la precisin de la medicin realizada con dicha divisin.

Cdigos de Paridad La definicin de cdigo dice: representacin unvoca de cantidades, de tal forma que a cada una de stas se le asigna una determinada combinacin de smbolos y viceversa. De all se deduce que los sistemas de numeracin constituyen cdigos de representacin de cantidades. Los cdigos de paridad se utilizan para detectar errores en la transmisin de datos, y se obtienen aadiendo a las combinaciones de los cdigos un bit llamado de paridad. Puede ser de paridad par o de paridad impar. Paridad par. El bit que se agrega ser tal, que haga que el nmero de unos de cada combinacin sea par. Por ejemplo: CombinacinBit de paridad par 01010 01111 10001 10010 Paridad impar. El bit que se agrega ser tal, que haga que el nmero de unos de cada combinacin sea impar. Por ejemplo: CombinacinBit de paridad impar 0101 1 0111 0 1000 0 1001 1

Bit de pariedad Unbit de paridades undgito binarioque indica si el nmero de bits con un valor de1en un conjunto de bits esparoimpar. Los bits de paridad conforman el mtodo dedeteccin de errores ms simple. La paridad par es un caso especial delcontrol de redundancia cclica(CRC), donde el bit de CRC se genera por el polinomiox+1. Ntese que este mtodo detecta los errores, pero no los corrige (salvo en el caso de que la palabra transmitida sea de tamao 1 bit).

Programacin FPGA:

Las FPGA se programan en el lenguaje del fabricante, como por ejemplo en VHDL para Xilinx, o Verilog. ste tipo de lenguajes, a diferencia de uno de programacinestndar, se caracteriza en definir las conexioneselctricaso la unin de cables y operaciones bsicas entre registros. Se

podra decir que se trata de un lenguaje de bajo nivel, sin confundir con ensamblador, porque eso va por otra vertiente, al tratarse de la definicin de las conexiones de registros y pines. Como es evidente hacer funcionar algo interesante en una placa con una FPGA puede llevar horas o das, ya que hay que plantearlo de manera puramente hardware.

Descripcin de VHDL:

VHDL, se trata de un lenguaje de descripcin de hardware, esto significa que mediante l se puede describir la forma de comportarse de un circuito electrnico. El comportamiento puede ser llevado a algn dispositivo que dispondr de sus propios componentes con los que lograr ese comportamiento deseado. El VHDL es un estndar llamado IEEE 1076-1993. Sus ventajas son:

Una disponibilidad pblica Independencia de dispositivos y fabricantes Reutilizacin Diseo jerrquico

Tipos de programacin o descripcin de VHDL:

Como se ha dicho antes, VHDL sirve para describir un circuito electrnico, pero el mismo circuito puede ser descrito de varias formas. Las formas de hacerlo son:

Descripcin de comportamiento Descripcin de flujo de datos (RTLRegistred Transfer Level) Descripcin estructural

EQUIPO USADO HARDWARE Spartan 3E XC3S400 SOFTWARE Maquina Virtual Windows XP Xilinx EXPLICACION DEL PROGRAMA SECUENCIA DE LEDS A) Incluimos dos divisores de frecuencia el uno de 3Hz y el otro de 0.8hz con clk1 y clk2 como salida de los divisores de frecuencia respectivamente; de cada clock sacamos dos procesos donde cada uno de ellos va ha ser sensible a su seal de reloj correspondiente, dentro de cada proceso esta

implementado el cdigo para la secuencia, tanto para la secuencia propuesta como para el cambio intermitente de los leds, las cuales son controladas por la variable selector. La salida para el proceso 1 y proceso 2, son salida y salida1 respectivamente, debido a que cada salida tiene el mismo proceso pero a diferente frecuencia, tal como fue propuesto en el enunciado, realizamos un seleccin de las dos ha ser impresa al final del programa con un with select donde la salida elegida pasar a salida0 para ser visualizada en los leds de la tarjeta Spartan DETECTOR DE PARIDAD C) Se usaron mquinas secuenciales donde cada flanco representaba el bit de nuestra entrada del bit menos significativo LSB al ms significativo MSB. De acuerdo a esto se uso un diagrama de estados de donde dependiendo de las anteriores opciones saltaba a la siguiente para comprobar la paridad, para implementar esto se crearon variables tipo state y una lgica de programacin secuencial tal como se lo vio en clase, y de esta manera poder simular los pulsos que a su vez activaran los flancos de la mquina secuencial utilizamos un divisor de frecuencia alimentado con el propio reloj de la tarjeta de 4Mhz de este divisor de frecuencia sacamos una frecuencia de 0.45Hz lo que nos dara pulsos calda 2.2segundos CLCULOS

F requerida N 3 Hz 666667 0.8 Hz 2500000 0.45 Hz 4444444 Tabla 1. Calculo de frecuencias Tablas y diagramas El literal A) de nuestro ejercicio fue elaborado segn la siguiente tabla de valores, la tabla2 corresponde al selector de frecuencia y la tabla 3 es la correspondiente a la salida en los leds Variable frec frecuencia 0 3 Hz 1 0.8 Hz Tabla 2 . Estados dip-switch MSB

selector 0 0 0 0 0

A7 0 0 0 0 0

A6 0 0 0 0 0

A5 0 0 0 0 0

A4 0 0 0 0 0

A3 0 0 0 0 1

A2 0 0 0 1 0

A1 0 0 1 0 0

A0 0 1 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1

0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1

0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1

0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1

1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1

0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1

0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 1

0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 1

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1

Tabla3. Salida secuencia de leds

Literal C) Diagrama correspondiente a la maquina de estados; en el flanco del diagrama de estados E0 a E1 y a E4 se introducir el LSB, de E1 a E2 o E3 y E4 a E3 y E2 ingresar al sistema el Bit1 de nuestra secuencia, de E2 a E0 y de E3 a E0, ingresar al sistema el MSB

Grfico 1. Representacin Maquina Secuencial Constrains Secuencia de leds

Grafica 2 . Constraints secuencia de leds Detector de paridad

Grafica 3. Constraints Detector de paridad

PROGRAMAS SECUENCIA DE LEDS Principal


---------------------------------------------------------------------------------library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use work.bloque1.all; entity principal is Port ( clk : in std_logic; reset : in STD_LOGIC; selector : in STD_LOGIC; frec : in STD_LOGIC; salida0 : out STD_LOGIC_VECTOR (7 downto 0));

end principal; architecture Behavioral of principal is signal clk1: std_logic; signal clk2: std_logic; signal salida: STD_LOGIC_VECTOR (7 downto 0); signal salida1: STD_LOGIC_VECTOR (7 downto 0); signal control: integer range 0 to 48; signal control1: integer range 0 to 48; begin u1: divisor_frecuencia generic map (666667) port map (clk,reset,clk1); u2: divisor_frecuencia generic map (2500000) port map (clk,reset,clk2); process (clk1,reset,control) begin if reset='1' then salida <= "00000000"; control <= 0; elsif clk1'event and clk1 = '1' then if (selector = '0') then case control is when 0 => salida <= "00000000"; when 1 => salida <= "00000001"; when 2 => salida<= "00000010"; when 3 => salida<= "00000100"; when 4 => salida<= "00001000"; when 5 => salida<= "00010000"; when 6 => salida<= "00100000"; when 7 => salida<= "01000000"; when 8 => salida<= "10000000"; when 9 => salida<= "11000000"; when 10 => salida<= "10100000"; when 11 => salida<= "10010000"; when 12 => salida<= "10001000"; when 13 => salida<= "10000100"; when 14 => salida<= "10000010"; when 15 => salida<= "10000001"; when 16 => salida<= "10000011"; when 17 => salida<= "10000101"; when 18 => salida<= "10001001"; when 19 => salida<= "10010001"; when 20 =>

salida<= "10100001"; when 21 => salida<= "11000001"; when 22=> salida<= "11100001"; when 23=> salida<= "11010001"; when 24=> salida<= "11001001"; when 25=> salida<= "11000101"; when 26=> salida<= "11000011"; when 27=> salida<= "11000111"; when 28=> salida<= "11001011"; when 29=> salida<= "11010011"; when 30=> salida<= "11100011"; when 31=> salida<= "11110011"; when 32=> salida<= "11101011"; when 33=> salida<= "11100111"; when 34=> salida<= "11101111"; when 35=> salida<= "11110111"; when 36=> salida<= "11111111"; when 37=> salida<= "11111011"; when 38=> salida<= "11111111"; when 39=> salida<= "11111101"; when 40=> salida<= "11111111"; when 41=> salida<= "11111110"; when 42=> salida<= "11111100"; when 43=> salida<= "11111000"; when 44=> salida<= "11110000"; when 45=> salida<= "11100000"; when 46=> salida<= "11000000"; when 47=> salida<= "10000000"; when 48=> salida<= "00000000"; end case; control <= control + 1; if(control = 49) then control <= 0; end if; else if(control = 0) then control <= 1; salida <= "00000000";

else control <= 0; salida <= "11111111"; end if; end if; end if; end process;

process (clk2,reset,control) begin if reset='1' then salida1 <= "00000000"; control1 <= 0; elsif clk1'event and clk1 = '1' then if (selector = '0') then case control1 is when 0 => salida1 <= "00000000"; when 1 => salida1 <= "00000001"; when 2 => salida1 <= "00000010"; when 3 => salida1 <= "00000100"; when 4 => salida1 <= "00001000"; when 5 => salida1<= "00010000"; when 6 => salida1<= "00100000"; when 7 => salida1<= "01000000"; when 8 => salida1<= "10000000"; when 9 => salida1<= "11000000"; when 10 => salida1<= "10100000"; when 11 => salida1<= "10010000"; when 12 => salida1<= "10001000"; when 13 => salida1<= "10000100"; when 14 => salida1<= "10000010"; when 15 => salida1<= "10000001"; when 16 => salida1<= "10000011"; when 17 => salida1<= "10000101"; when 18 => salida1<= "10001001"; when 19 => salida1<= "10010001"; when 20 => salida1<= "10100001"; when 21 => salida1<= "11000001"; when 22=> salida1<= "11100001"; when 23=> salida1<= "11010001"; when 24=>

salida1<= "11001001"; when 25=> salida1<= "11000101"; when 26=> salida1<= "11000011"; when 27=> salida1<= "11000111"; when 28=> salida1<= "11001011"; when 29=> salida1<= "11010011"; when 30=> salida1<= "11100011"; when 31=> salida1<= "11110011"; when 32=> salida1<= "11101011"; when 33=> salida1<= "11100111"; when 34=> salida1<= "11101111"; when 35=> salida1<= "11110111"; when 36=> salida1<= "11111111"; when 37=> salida1<= "11111011"; when 38=> salida1<= "11111111"; when 39=> salida1<= "11111101"; when 40=> salida1<= "11111111"; when 41=> salida1<= "11111110"; when 42=> salida1<= "11111100"; when 43=> salida1<= "11111000"; when 44=> salida1<= "11110000"; when 45=> salida1<= "11100000"; when 46=> salida1<= "11000000"; when 47=> salida1<= "10000000"; when 48=> salida1<= "00000000"; end case; control1 <= control1 + 1; if(control1 = 49) then control1 <= 0; end if; else if(control1 = 0) then control1 <= 1; salida1 <= "00000000"; else control1 <= 0; salida1 <= "11111111"; end if; end if; end if; end process;

with frec select salida0 <= salida when '0', salida1 when others; end Behavioral;

Divisor de frecuencia
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity divisor_frecuencia is generic (n: integer:=3); Port ( clock : in STD_LOGIC; reset : in STD_LOGIC; salida : out STD_LOGIC); end divisor_frecuencia; architecture Behavioral of divisor_frecuencia is signal contador: integer range 0 to n; signal aux: std_logic:='0'; begin process (clock) begin if reset='1' then salida <= '0'; elsif clock'event and clock = '1' then if(contador = n-1) then aux <= not aux; contador <= 0; else contador <= contador+1; end if; end if; salida <= aux; end process; end Behavioral;

DETECTOR DE PARIDAD Principal


---------------------------------------------------------------------------------library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use work.bloque1.all; entity principal is Port ( entrada : in STD_LOGIC_VECTOR (2 downto 0); salida : out STD_LOGIC; clk : in STD_LOGIC; reset : in STD_LOGIC); end principal;

architecture Behavioral of principal is Type state is (e0,e1,e2,e3,e4); signal pr_state,nxt_state: state; signal pulso: STD_LOGIC; begin u1: divisor_frecuencia generic map (4444444) port map (clk,reset,pulso); process(reset,pulso) begin if(reset='1') then pr_state<= e0; elsif pulso'event and pulso='1' then pr_state<= nxt_state; end if; end process; ---------------------------------------------------------process(pr_state,entrada) begin case pr_state is when e0 => if(entrada(0)='0')then nxt_state<=e1; salida <= '0'; else nxt_state<=e4; salida <= '0'; end if; when e1 => if(entrada(1)='0')then nxt_state<=e2; salida <= '0'; else nxt_state<=e3; salida <= '0'; end if; when e2 => if(entrada(2)='0')then nxt_state<=e0; salida <= '0'; else nxt_state<=e0; salida <= '1'; end if; when e3 => if(entrada(2)='0')then nxt_state<=e0; salida <= '1'; else nxt_state<=e0; salida <= '0'; end if; when e4 => if(entrada(1)='0')then nxt_state<=e3; salida <= '0'; else nxt_state<=e2;

salida <= '0'; end if; end case; end process; end Behavioral;

Divisor de frecuencia
---------------------------------------------------------------------------------library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity divisor_frecuencia is generic (n: integer:=3); Port ( clock : in STD_LOGIC; reset : in STD_LOGIC; salida : out STD_LOGIC); end divisor_frecuencia; architecture Behavioral of divisor_frecuencia is signal contador: integer range 0 to n; signal aux: std_logic:='0'; begin process (clock) begin if reset='1' then salida <= '0'; elsif clock'event and clock = '1' then if(contador = n-1) then aux <= not aux; contador <= 0; else contador <= contador+1; end if; end if; salida <= aux; end process; end Behavioral;

Conclusiones y Recomendaciones: Los conceptos sobre jerarquas, fueron puestos en prctica, en la creacin de nuestro ASIC. Lo cual nos facilit el trabajo en el la implementacin, debido a que la programacin se hizo ordenada y top principal. Se recomienda revisar los temas pertenecientes a maquinas de estado para poder determinar los componentes de una funcin determinada en un bloque , debido a VHDL es un lenguaje que me describe el funcionamiento del Hardware.

Es importante incluir los paquetes que contienen los componentes previamente programados dentro de todo el programa, ya que si no se lo hace este generar problemas el momento de grabarlo en una tarjeta FPGA. El comprobar constantemente si la sintaxis del programa est bien descrita dentro del programa, en cada paso ayudar a identificar de manera ms rpida y a tiempo los errores que se pueden generar dentro del programa. Para este propsito ISE perteneciente a Xilinx tiene un depurador de sintaxis. Los conocimientos adquiridos en Sistemas Digitales son de gran ayuda para poder entender de mejor manera las especificaciones del programa, as como para realizar un programa mucho ms ptimo. Los cdigos de paridad se utilizan para detectar errores en la transmisin de datos, y se obtienen aadiendo a las combinaciones de los cdigos un bit llamado de paridad. Puede ser de paridad par o de paridad impar. En la parida par el bit que se agrega ser tal, que haga que el nmero de unos de cada combinacin sea par. En la paridad impar el bit que se agrega ser tal, que haga que el nmero de unos de cada combinacin sea impar. La maquina de Mealy, es la mquina de estado en la cul la salida depende tanto del estado presente como de las entradas externas.

Bibliografa:

http://es.wikipedia.org/wiki/M%C3%A1quina_de_Moore http://es.wikipedia.org/wiki/M%C3%A1quina_de_Mealy http://es.wikipedia.org/wiki/Divisor_de_frecuencia http://www.dav.sceu.frba.utn.edu.ar/homovidens/gomezgomez_paz/PROYECTIN /PAGINA/codigosdeparidadG.htm http://es.wikipedia.org/wiki/Bit_de_paridad http://193.146.57.132/depeca/repositorio/asignaturas/30822/08_09_VHDL_senten cias_secuenciales.pdf

Secuencia de Leds

Detector de Paridad