96902317-vhdl

download 96902317-vhdl

of 10

Transcript of 96902317-vhdl

  • Departamento de Tecnologa Electrnica

    Diseo digital con VHDL - - 27/11/2008 5-1

    5. Contadores En esta prctica aprenderemos a describir contadores sintetizables con VHDL. Afortunadamente veremos que es mucho ms sencillo que los contadores diseados mediante esquemticos que realizamos el curso pasado en EDI. En esta prctica veremos algunas aplicaciones de los contadores.

    5.1. Segundero El segundero que hicimos el ao pasado y que tanto nos cost, este ao lo podremos hacer en muy poco tiempo. En esta prctica queremos que un LED se mantenga encendido durante un segundo y se apague durante el segundo siguiente, este comportamiento se repetir peridicamente. Recordando del ao pasado, lo que tenemos que hacer es un divisor de frecuencia. Nuestro reloj tiene una frecuencia de 50 MHz y queremos una seal de 1 Hz (que llamaremos S1seg). El cronograma de estas seales se muestra en la figura 5.1. Como se puede apreciar, la seal S1seg estar a '1' solamente durante un ciclo de reloj durante un segundo.

    T=1 s (f = 1Hz)

    T=20 ns(no est a

    escala)

    Clk

    S1seg

    T=1 s (f = 1Hz)

    T=20 ns(no est a

    escala)

    Clk

    S1seg

    Figura 5.1: Cronograma de la seal que queremos obtener

    La seal S1seg ser la entrada a un biestable T, y har que cada segundo, el biestable cambie de valor. El esquema general del circuito se muestra en la figura 5.2.

    P_Conta1seg

    S1segClk

    Reset

    T=1 s

    1 Hz50 MHz

    T=20 nsT=20 ns Biestable T

    Q

    Clk

    T LED

    Cada segundo le llega un '1' y entonces cambiar de estado (se encender y apagar)

    (no est a escala)

    ClkS1seg

    P_Conta1seg

    S1segClk

    Reset

    T=1 s

    1 Hz50 MHz

    T=20 nsT=20 ns Biestable T

    Q

    Clk

    T LED

    Cada segundo le llega un '1' y entonces cambiar de estado (se encender y apagar)

    (no est a escala)

    ClkS1seg

    Figura 5.2: Esquema del circuito que queremos realizar

    Para implementar un divisor de frecuencia necesitamos contar y para contar debemos ser capaces de sumar (al menos sumar 1 cada vez). Por otro lado, necesitamos saber qu rango tiene nuestra cuenta (hasta qu nmero llega) para que la seal que utilicemos para contar tenga un nmero adecuado de bits. Para pasar de 20 ns a 1 segundo (de 50 MHz a 1 HZ), tenemos que contar hasta 50 millones (50 106). La menor potencia11 de dos superior a 50106 es 26. Esto es, 226 > 50106 > 225. Por tanto, necesitamos 26 bits para poder representar el nmero 50106. As que nuestra seal de cuenta va a tener 26 bits. Para llevar la cuenta se puede utilizar una seal de tipo entero o natural (integer o natural). Esta seal debe de tener un rango potencia de dos. Su declaracin sera:

    signal cuenta : natural range 0 to 2**26-1; Fjate que el rango de los enteros o naturales es ascendente (to en vez de downto como lo era en los std_logic_vector).

    11 Para calcular el nmero de bits que necesitas, obtn el entero superior al resultado del logaritmo en base 2 del nmero. Por ejemplo, log2(50106) = 25,75 26 bits. Para calcular el logaritmo en base dos y no tienes en la calculadora, lo puedes calcular con el logaritmo en base 10: log2 (X) = log10(X) / log10 (2). Otra forma (menos elegante) de hacerlo es ir calculando las potencias sucesivas de dos hasta encontrar la primera que sea mayor que el nmero.

  • Departamento de Tecnologa Electrnica Ejercicio 5. Contadores

    Diseo digital con VHDL - 27/11/2008 5-2

    La operacin potencia se representa con dos asteriscos en VHDL. Se debe restar uno al resultado de la potencia porque el rango empieza en cero. Por ejemplo para 8 bits, el rango sera:

    signal cuenta256 : natural range 0 to 2**8-1; -- de 0 a 255 Si a un entero no se le especifica el rango, se genera una seal de 32 bits, lo que en la mayora de los casos es un desperdicio de recursos. La arquitectura completa del segundero se muestra en el cdigo 5-1

    architecture Behavioral of conta1seg is signal cuenta : natural range 0 to 2**26-1; constant cfincuenta : natural := 50000000; signal s1seg : std_logic; signal ledaux : std_logic; begin P_conta1seg: Process (Reset, Clk) -- Proceso que genera la senal periodica de 1 segundo begin if Reset = '1' then cuenta

  • Departamento de Tecnologa Electrnica Ejercicio 5. Contadores

    Diseo digital con VHDL - 27/11/2008 5-3

    5.2. Contador de 10 segundos Ahora vamos a ampliar la prctica anterior, y realizar un contador de 10 segundos que mostraremos en un display de siete segmentos. La cuenta ir de 0 a 9 (un dgito BCD). Lo que haremos es utilizar la seal s1seg que creamos en el ejercicio anterior (figura 5.1 y cdigo 5-1) para contar cada segundo. As que utilizaremos dos contadores, uno que nos pasa de 50 MHz a 1 Hz y que crea la seal s1seg; y el otro contador contar diez cuentas de un segundo (s1seg). El esquema del circuito se muestra en la figura 5.3. A este esquema le falta el control de los nodos para que luzca el display (repasa la prctica 3). Como puedes observar, la cuenta de 10 segundos se mostrar por un display de siete segmentos y por cuatro LED.

    P_Conta1seg

    S1segClkReset

    50 MHz

    T=20 nsT=1 s

    1 Hz

    T=20 ns

    (no est a escala)

    Clk

    Clk

    S1segPConta10segs

    conta10s

    Clk

    CONV_7SEG

    LED(3:0)

    4 6 SEG(6:0)

    Reset

    PB3

    A

    G

    D

    B

    C

    F

    E

    P_Conta1seg

    S1segClkReset

    50 MHz

    T=20 ns

    50 MHz

    T=20 nsT=1 s

    1 Hz

    T=20 ns

    (no est a escala)

    T=1 s

    1 Hz

    T=20 ns

    (no est a escala)

    Clk

    Clk

    S1segPConta10segs

    conta10s

    Clk

    CONV_7SEG

    LED(3:0)

    44 66 SEG(6:0)

    Reset

    PB3

    A

    G

    D

    B

    C

    F

    E

    A

    G

    D

    B

    C

    F

    E

    Figura 5.3: Esquema del contador de 10 segundos

    En el ejercicio anterior vimos que podamos utilizar nmeros enteros o naturales para realizar contadores. Sin embargo, en VHDL para sntesis, los nmeros enteros y naturales no son recomendables de usar cuando queremos mostrarlos por un display (o por cualquier otro medio). Esto se debe a que en los circuitos los nmeros se representan en binario, y por tanto mejor es trabajar con vectores de bits. El nmero de bits del vector se corresponder con los bits necesarios para representar el mayor y menor nmero que queramos representar. Ya hemos visto vectores de bits: std_logic_vector. Sin embargo, sabemos del ao pasado que la representacin de un nmero cambia si utilizamos nmeros sin signo (binario puro) o con signo (habitualmente complemento a 2). Por ejemplo, el nmero si la seal S ="1001", ser es el nmero 9 si es un nmero sin signo, o ser el nmero -7 si es con signo en complemento a dos. As que para poder comparar, sumar y restar nmeros binarios necesitamos saber si son nmeros sin signo o si estn en complemento a dos. Para ello se utilizan los tipos: unsigned y signed. Su declaracin y manejo es similar al de los std_logic_vector. Por ejemplo, la declaracin de la seal conta10s, que queremos que sea un nmero que cuente de 0 a 9, ser:

    signal conta10seg : unsigned (3 downto 0); Cdigo 5-3: Declaracin de seal unsigned

    Con esta declaracin, especificamos un nmero binario de cuatro bits sin signo. Ya que el rango de un nmero de cuatro bits sin signo va de 0 a 15. Con tres bits no nos valdra porque slo podramos contar hasta siete, y por tanto, no sera un nmero BCD. Para utilizar los tipos unsigned y signed es recomendable cambiar de bibliotecas, en vez de utilizar las predeterminadas por el ISE-Webpack (ver cdigo 5-4), se recomiendan las del cdigo 5-5. Esto est en la cabecera de todos los diseos que crea el ISE-Webpack. As que a partir de ahora, siempre que crees una nueva fuente, quita las que estn en el cdigo 5-4 (las sealadas en negrita) y cmbialas por la del cdigo 5-5 (la biblioteca NUMERIC_STD).

    library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; Cdigo 5-4: Bibliotecas por defecto que pone el ISE

    library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL;

    Cdigo 5-5: Bibliotecas recomendadas

    El proceso que se encarga de contar los diez segundos (PConta10segs) va a contar con la seal conta10seg, que es de tipo unsigned (ver cdigo 5-3). El proceso se muestra en el cdigo 5-6. Fjate en la ltima sentencia: debido a que la seal conta10seg es de tipo unsigned y el puerto de salida LED es de tipo std_logic_vector,

  • Departamento de Tecnologa Electrnica Ejercicio 5. Contadores

    Diseo digital con VHDL - 27/11/2008 5-4

    hay que convertir conta10seg a std_logic_vector. Para hacer esto, es necesario que ambas seales tengan el mismo nmero de bits (en este caso 4: 3 downto 0).

    P_CONTA10SEG: Process (Reset, Clk) -- contador de 10 segundos begin if Reset = '1' then conta10seg '0'); ledaux

  • Departamento de Tecnologa Electrnica Ejercicio 5. Contadores

    Diseo digital con VHDL - 27/11/2008 5-5

    P_Conta1decimaS1decima

    ClkReset

    Clk

    PConta10decimas

    Clk

    Reset

    PB3

    PConta10segS1seg

    Clk

    Reset

    S1segdecimas 4

    S1seg

    segundos 4S10seg

    PConta60seg

    Clk

    Reset

    PConta10min

    Clk

    Reset

    S10segdec_segundos 4

    S60seg

    minutos 4

    decimas(3:0) segundos(3:0) dec_segundos(3:0) minutos(3:0)

    S1decimaP_Conta1decima

    S1decimaClk

    Reset

    Clk

    PConta10decimas

    Clk

    Reset

    PB3

    PConta10segS1seg

    Clk

    Reset

    S1segdecimas 44

    S1seg

    segundos 44S10seg

    PConta60seg

    Clk

    Reset

    PConta10min

    Clk

    Reset

    S10segdec_segundos 44

    S60seg

    minutos 44

    decimas(3:0) segundos(3:0) dec_segundos(3:0) minutos(3:0)

    S1decima

    Figura 5.6: Esquema del cronmetro

    Cada bloque de la figura 5.6 se puede implementar en un proceso. Ya dijimos que el primer proceso: P_Conta1cent es igual que el proceso P_conta1seg del cdigo 5-1, nicamente hay que cambiar el rango de la seal cuenta y el valor de la constante de fin de cuenta (ahora valdr 5000000). Cul sera el rango de la seal cuenta? El resto de procesos son similares al proceso P_Conta10seg del cdigo 5-3, pero hay que cambiar los nombres de las seales y crear las seales de fin de cuenta: S1seg, S10seg, S60seg. Por ejemplo, el proceso PConta10decimas (ver figura 5.6), sera como el mostrado en el cdigo 5-7 (la figura 5.7 muestra el esquema del contador de dcimas). La cuenta de diez dcimas de segundos produce la seal de aviso de que ha transcurrido un segundo: s1seg.

    P_CONTA10DECIMAS: Process (Reset, Clk) begin if Reset = '1' then decimas '0'); s1seg

  • Departamento de Tecnologa Electrnica Ejercicio 5. Contadores

    Diseo digital con VHDL - 27/11/2008 5-6

    SW7 SW6 nodo DISPLAY0 0 AN3 dcimas0 1 AN2 segundos1 0 AN1 decenas de segundos1 1 AN0 minutos

    SW7 SW6 nodo DISPLAY0 0 AN3 dcimas0 1 AN2 segundos1 0 AN1 decenas de segundos1 1 AN0 minutos

    Tabla 5-1: Displays que se muestran segn la

    configuracin de los interruptores

    I(0)I(1)

    AN(0)AN(1)AN(2)AN(3)

    DECOD_2a4S0S1S2S3

    Controlamos qu display se enciende

    Negamos porque los displays se controlan con lgica inversa

    SW6SW7

    AN3-AN0

    Lo hacemos sin habilitacin

    (siempre habilitado)

    I(0)I(1)

    AN(0)AN(1)AN(2)AN(3)

    DECOD_2a4S0S1S2S3

    Controlamos qu display se enciende

    Negamos porque los displays se controlan con lgica inversa

    SW6SW7

    AN3-AN0

    Lo hacemos sin habilitacin

    (siempre habilitado)

    Figura 5.8: Codificador para controlar los nodos de los displays

    Adems habr que seleccionar la cifra que se quiere mostrar (dcimas, unidades de segundo, decenas de segundo o minutos). La seleccin de la cifra se har conforme a la tabla 5-1. Como sabemos, para seleccionar necesitamos un multiplexor. Despus del multiplexor, pondremos un conversor a siete segmentos para mostrarlo por los displays. La figura 5.9 muestra el esquema de esta parte del diseo.

    4mostrar(3:0)

    00

    01

    10

    11

    4

    4

    4

    4

    decimas(3:0)

    dec_segundos(3:0)

    minutos(3:0)

    segundos(3:0)

    2I(1:0)SW6SW7

    CONV_7SEG

    6 SEG(6:0)

    SEG_A-SEG_G44

    mostrar(3:0)

    00

    01

    10

    11

    44

    44

    44

    44

    decimas(3:0)

    dec_segundos(3:0)

    minutos(3:0)

    segundos(3:0)

    22I(1:0)SW6SW7

    CONV_7SEG

    66 SEG(6:0)

    SEG_A-SEG_G

    Figura 5.9: Multiplexor que selecciona la cifra BCD segn la configuracin de os interruptores.

    El esquema completo del diseo se muestra en la figura 5.10. P_Conta1decima

    S1decimaClk

    Reset

    Clk

    PConta10decimas

    Clk

    Reset

    BTN3

    PConta10segS1seg

    Clk

    Reset

    S1segdecimas 4

    S1seg

    segundos 4S10seg

    PConta60seg

    Clk

    Reset

    PConta10min

    Clk

    Reset

    S10segdec_segundos 4

    S60seg

    minutos 4

    decimas(3:0)

    segundos(3:0)

    dec_segundos(3:0) minutos(3:0)

    S1decima

    44 44

    00 01 10 11

    4 mostrar(3:0)CONV_7SEG

    6 SEG(6:0)

    SEG_A-SEG_G

    El nmero que se muestra segn estn

    los interruptores

    I(1:0)SW6SW7

    I(0)I(1)

    AN(0)AN(1)AN(2)AN(3)

    DECOD_2a4S0S1S2S3

    SW6SW7 AN3-AN0

    P_Conta1decimaS1decima

    ClkReset

    Clk

    PConta10decimas

    Clk

    Reset

    BTN3

    PConta10segS1seg

    Clk

    Reset

    S1segdecimas 44

    S1seg

    segundos 44S10seg

    PConta60seg

    Clk

    Reset

    PConta10min

    Clk

    Reset

    S10segdec_segundos 44

    S60seg

    minutos 44

    decimas(3:0)

    segundos(3:0)

    dec_segundos(3:0) minutos(3:0)

    S1decima

    444 44

    00 01 10 11

    44 mostrar(3:0)CONV_7SEG

    66 SEG(6:0)

    SEG_A-SEG_G

    El nmero que se muestra segn estn

    los interruptores

    I(1:0)SW6SW7

    I(0)I(1)

    AN(0)AN(1)AN(2)AN(3)

    DECOD_2a4S0S1S2S3

    SW6SW7 AN3-AN0I(0)I(1)

    AN(0)AN(1)AN(2)AN(3)

    DECOD_2a4S0S1S2S3

    SW6SW7 AN3-AN0

    Figura 5.10:Esquema completo del cronmetro con visualizacin manual

    Ahora crea un nuevo proyecto llamado crono_manual, implementa el diseo de la figura 5.10 en la FPGA y comprueba que funciona. Evidentemente, es un cronmetro de prestaciones muy malas, porque no puedes visualizar simultneamente ms de un cifra. Tienes que seleccionar la cifra manualmente con los interruptores SW6 y SW7.

    5.3.2. Mostrar los dgitos. Solucin automtica Hemos visto las limitaciones de la solucin anterior. Si quisieses ver dos cifras simultneamente, podras probar a mover el interruptor manualmente lo ms rpidamente posible. Es obvio que esta solucin no es muy cmoda, as que vamos a intentar buscar una alternativa. La solucin podra ser que en vez de que nosotros cambiemos la seal I(1:0) moviendo los interruptores SW6 y SW7, hicisemos un circuito que haga como si los moviese peridicamente de manera automtica. La velocidad del cambio debe ser tan rpida que no sea perceptible por nosotros los humanos. Por ejemplo, si

  • Departamento de Tecnologa Electrnica Ejercicio 5. Contadores

    Diseo digital con VHDL - 27/11/2008 5-7

    cambiamos el display cada milisegundo seguramente no nos demos cuenta de que est cambiando (salvo que lo vemos lucir menos tiempo). As que vamos a probar de esta manera: crearemos otro contador similar al que crea una seal de un segundo (proceso P_conta1seg del cdigo 5-1) o similar al que hemos creado en el cronmetro para contar una dcima de segundo (figura 5.6). Nuestro contador crear una seal peridica de un milisegundo (s1mili) como la mostrada en la figura 5.11.

    T=1ms (f = 1kHz)

    T=20 ns(no est a

    escala)

    Clk

    S1mili

    50MHz

    Relacin:

    50MHz1kHz = 50000

    1ms20ns = = 50000

    1000000ns20ns

    frecuencia

    periodo

    1kHz

    T=1ms (f = 1kHz)

    T=20 ns(no est a

    escala)

    Clk

    S1mili

    T=1ms (f = 1kHz)

    T=20 ns(no est a

    escala)

    Clk

    S1mili

    50MHz

    Relacin:

    50MHz1kHz = 50000

    1ms20ns = = 50000

    1000000ns20ns

    frecuencia

    periodo

    Relacin:

    50MHz1kHz = 5000050MHz1kHz = 5000050MHz1kHz = 50000

    1ms20ns = = 50000

    1000000ns20ns

    1ms20ns = = 50000

    1000000ns20ns

    1000000ns20ns

    frecuencia

    periodo

    1kHz Figura 5.11 : Cronograma de la seal de una milsima de segundo que queremos obtener

    A partir de la seal de un milisegundo (s1mili) realizaremos una cuenta de cuatro (de cero a tres) para seleccionar el display que va a lucir y el nmero que se va a mostrar. Esta seal (cuenta4ms) ser equivalente a la seal I que antes era gobernada por los interruptores (ver figuras 5.8, 5.9 y 5.10). En la figura 5.12 se muestra el multiplexado en el tiempo. En cada milisegundo se muestra un display distinto (slo hay un nodo activo). La frecuencia de refresco del display es de 250 Hz (T=4ms). Es muy importante seleccionar el nmero correspondiente al nodo que se va a seleccionar.

    4 x 1 ms

    0 1 3 0 1 2 3

    s1mili

    CUENTA4MS

    AN_0

    T=1 ms

    2

    AN_1

    AN_2

    AN_3

    dec US Mmostrar DS US DS DMUM

    M DS US dec

    minutos decenas

    Segundos

    unidades dcimas

    Segn el valor de CUENTA4MS se selecciona las dcimas, las

    unidades o decenas de segundos o los minutos

    AN_3 AN_2 AN_1 AN_0

    4 x 1 ms

    0 1 3 0 1 2 3

    s1mili

    CUENTA4MS

    AN_0

    T=1 ms

    2

    AN_1

    AN_2

    AN_3

    dec US Mmostrar DS US DS DMUM

    M DS US dec

    minutos decenas

    Segundos

    unidades dcimas

    Segn el valor de CUENTA4MS se selecciona las dcimas, las

    unidades o decenas de segundos o los minutos

    AN_3 AN_2 AN_1 AN_0

    Figura 5.12:Multiplexado en el tiempo para mostrar los displays

    El esquema del circuito final se muestra en la figura 5.13. Crea un nuevo proyecto llamado crono_auto e implemntalo en la FPGA. Comprueba que te sale bien. Como conclusin, hemos aprendido a hacer un reloj digital. Hemos visto cmo podemos multiplexar en el tiempo una varias seales. Con esto reducimos el nmero de pines de la FPGA para manejar los displays. Con esta solucin tenemos los siete segmentos ms el punto decimal (8 pines) ms los cuatro nodos, en total 12 pines. De la otra forma, si necesitsemos los 8 pines por cada display sera 8x4=32 pines ms los cuatro nodos: 36 pines.

  • Departamento de Tecnologa Electrnica Ejercicio 5. Contadores

    Diseo digital con VHDL - 27/11/2008 5-8

    P_Conta1decimaS1decima

    ClkReset

    Clk

    PConta10decimas

    Clk

    Reset

    BTN3

    PConta10segS1seg

    Clk

    Reset

    S1segdecimas 4

    S1seg

    segundos 4S10seg

    PConta60seg

    Clk

    Reset

    PConta10min

    Clk

    Reset

    S10segdec_segundos 4

    S60seg

    minutos 4

    decimas(3:0)

    segundos(3:0)

    dec_segundos(3:0) minutos(3:0)

    S1decima

    44 44

    00 01 10 11

    4 mostrar(3:0)CONV_7SEG

    6 SEG(6:0)

    SEG_A-SEG_G

    Lo que antes era I

    I(1:0)SW6SW7

    AN(0)AN(1)AN(2)AN(3)

    DECOD_2a4S0S1S2S3

    AN3-AN0

    P_Conta1miliS1mili

    ClkReset

    Clk

    BTN3

    S1decimaPConta4milis

    Clk

    Reset

    cuenta4ms 2 cuenta4ms

    I2

    P_Conta1decimaS1decima

    ClkReset

    Clk

    PConta10decimas

    Clk

    Reset

    BTN3

    PConta10segS1seg

    Clk

    Reset

    S1segdecimas 44

    S1seg

    segundos 44S10seg

    PConta60seg

    Clk

    Reset

    PConta10min

    Clk

    Reset

    S10segdec_segundos 44

    S60seg

    minutos 44

    decimas(3:0)

    segundos(3:0)

    dec_segundos(3:0) minutos(3:0)

    S1decima

    444 44

    00 01 10 11

    44 mostrar(3:0)CONV_7SEG

    66 SEG(6:0)

    SEG_A-SEG_G

    Lo que antes era I

    I(1:0)SW6SW7

    Lo que antes era I

    I(1:0)SW6SW7

    AN(0)AN(1)AN(2)AN(3)

    DECOD_2a4S0S1S2S3

    AN3-AN0

    P_Conta1miliS1mili

    ClkReset

    Clk

    BTN3

    S1decimaPConta4milis

    Clk

    Reset

    cuenta4ms 22 cuenta4ms

    I22

    Figura 5.13:Esquema completo del cronmetro con visualizacin automtica

    5.3.3. Mejoras del circuito Si te apetece puedes introducir las siguientes mejoras: Muestra el punto decimal en el segundo y cuarto display para separar los segundos de las dcimas de

    segundo y los minutos. Haz que el circuito se pueda parar con un interruptor. El cronmetro se debe mantener parado en el

    tiempo en que estaba. Has que el circuito se pueda parar con un pulsador. Si pulsamos, el cronmetro se mantiene parado en el

    tiempo en que estaba, y si volvemos a pulsar, el cronmetro contina. Haz un reloj de minutos y horas, haciendo que el punto decimal de en medio parpadee cada segundo. 5.3.4. Optimizacin Sabemos que hay muchas formas posibles de realizar un circuito. En concreto para este circuito nos podemos plantear poner el multiplexor antes o despus de haber convertido el nmero a siete segmentos. Qu manera crees que es ms ptima en cuanto a ahorro de recursos de la fpga? En la figura 5.14 se muestra cmo sera este circuito. Este circuito es una alternativa ms costosa en trminos de recursos respecto al circuito de la figura 5.9. Tanto porque usa ms convertidores, como porque el multiplexor tiene un ancho de bus de los datos mayor (7 bits frente a 4). Al disear en VHDL debes tener muy presente qu circuito ests generando para evitar desperdiciar recursos.

    decimas(3:0)

    dec_segundos(3:0)

    minutos(3:0)

    segundos(3:0)

    7

    00

    01

    10

    11

    6

    6

    6

    2

    I(1:0)

    CONV_7SEG

    6

    SEG(6:0)

    4

    CONV_7SEG

    6

    4

    CONV_7SEG6

    4

    CONV_7SEG

    6

    4

    decimas(3:0)

    dec_segundos(3:0)

    minutos(3:0)

    segundos(3:0)

    77

    00

    01

    10

    11

    66

    66

    66

    22

    I(1:0)

    CONV_7SEG

    66

    SEG(6:0)

    44

    CONV_7SEG

    66

    44

    CONV_7SEG66

    44

    CONV_7SEG

    66

    44

    Figura 5.14:Otra alternativa al esquema de la figura 5.9

  • Departamento de Tecnologa Electrnica Ejercicio 5. Contadores

    Diseo digital con VHDL - 27/11/2008 5-9

    5.4. Contador manual Ahora vamos a realizar un contador ascendente/descendente que aumentar su cuenta cuando presionemos el pulsador BTN0 (UP) y que disminuir su cuenta cuando presionemos el pulsador BTN1 (DOWN). Cuando no se presionen estos pulsadores el contador permanecer quieto (no aumentar con el reloj de la placa como los de las prcticas anteriores). La cuenta ir de 0 a 7 (3 bits), y no se desbordar, esto es, si pulsamos el UP estando en siete se quedar fijo (no pasa a cero), y si le damos al DOWN estando en cero, se quedar en cero (no pasa a siete). El reset del circuito ir al pulsador BTN4. El diagrama de estados del contador se muestra en la figura 5.15.

    0 1 2 3 4 5 6 7

    P_UP P_UP P_UP P_UP P_UP P_UP P_UP P_UP

    P_DOWN P_DOWN P_DOWN P_DOWN P_DOWN P_DOWN P_DOWNP_DOWN

    00 11 22 33 44 55 66 77

    P_UP P_UP P_UP P_UP P_UP P_UP P_UP P_UP

    P_DOWN P_DOWN P_DOWN P_DOWN P_DOWN P_DOWN P_DOWNP_DOWN Figura 5.15: Diagrama de estados del contador ascendente/descendente que vamos a realizar

    Para que cada vez que presionemos los pulsadores slo aumente una cifra la cuenta, debemos realizar un detector de flanco para cada pulsador. Por eso, en la figura 5.15 las seales no son UP y DOWN sino P_UP y P_DOWN, para indicar que se ha convertido la entrada en un pulso y slo est activa durante un ciclo de reloj. Si te has olvidado de cmo se hace el detector de flanco, consulta el apartado 4.3.2. La cuenta la vamos a mostrar por el display de la derecha. El esquema del circuito se muestra en la figura 5.16. El bloque de la izquierda, podr estar formado por un proceso y varias sentencias concurrentes, para simplificar, como ya sabemos cmo se hace, se ha puesto en un slo bloque.

    Detecta_flanco

    P_DOWN

    ClkReset

    Clk

    BTN3

    BTN0BTN1

    UPDOWN

    P_UP

    ClkReset

    P_UPP_DOWN

    CUENTAPConta

    3

    CONV_7SEG

    6 SEG(6:0)

    Detecta_flanco

    P_DOWN

    ClkReset

    Clk

    BTN3

    BTN0BTN1

    UPDOWN

    P_UP

    ClkReset

    P_UPP_DOWN

    CUENTAPConta

    33

    CONV_7SEG

    66 SEG(6:0)

    Figura 5.16: Esquema del contador que implementaremos

    Intenta realizar el contador t slo (proceso PConta de la figura 5.16). Si no te sale, consulta el cdigo P_conta: Process (Reset, Clk) begin if Reset = '1' then conta '0'); elsif Clk'event and Clk='1' then if pulso_up = '1' then if conta /= 7 then conta

  • Departamento de Tecnologa Electrnica Ejercicio 5. Contadores

    Diseo digital con VHDL - 27/11/2008 5-10

    Si a un entero o natural no se le especifica el rango, se genera una seal de 32 bits, lo que en la mayora de los casos es un desperdicio de recursos.

    Los tipos integer y natural se pueden utilizar para realizar cuentas internas, pero para realizar cuentas que van a ser utilizadas por otros procesos o bloques, se recomienda utilizar los tipos vectoriales: unsigned y signed. Para representar nmeros es importante utilizar estos tipos en vez del tipo std_logic_vector, para distinguir si la representacin del nmero es en binario puro (sin signo) o en complemento a dos (con signo).

    Al usar los tipos unsigned y signed se recomienda utilizar la biblioteca NUMERIC_STD (ver cdigo 5-4). Multiplexar en el tiempo nos puede hacer ahorrar enormemente el nmero de puertos de salida (pines)

    necesarios. Distintas maneras de describir un circuito pueden hacer que consuma ms o menos recursos de la FPGA.

    La optimizacin del circuito pretende reducir el uso de recursos. Existen diversos objetivos en la optimizacin, la optimizacin puede estar orientada al rea, consumo, tiempos, ...