ABEL-HDL - Valores predeterminados / restablecidos

0

Tengo como tarea escolar hacer un reloj & calendario en un HDL. Como fuente tengo un oscilador de 10 MHz, que logré "reducir la velocidad" a 1 Hz, como quiero. Tengo contadores asíncronos por segundos, minutos, ... hasta años. Hasta ahora parece que puedo "encadenarlos" correctamente, por lo que el tiempo 12:59:59 cambia a 13:00:00 como se anticipó. Los valores se muestran en ocho pantallas de siete segmentos. Hasta ahora todo parece funcionar bastante bien. (Estoy trabajando solo con el tiempo hasta que empiece a funcionar, el calendario vendrá más tarde).

A lo que ahora estoy atascado es a los valores predeterminados. Tengo un botón que cuando se presiona muestra mis valores deseados, PERO no puedo forzar el cambio de los valores internos para usar esos "valores de restablecimiento". ES DECIR. Los relojes después de algunos conteos llegan a, por ejemplo. 01:22:15 , presiono el botón de reinicio, 23:59:50 (valores predeterminados deseados) muestra y cuando suelto el botón, el tiempo salta de nuevo a 01:22:15 y cuenta con esto. Me gustaría contar después del lanzamiento del botón con 23:59:50 .

No tengo ideas y ser nuevo en esta programación de bajo nivel tampoco ayuda. Aquí está parte de mi código. Se reduce a solo unos segundos, ya que el resto de la lógica es igual, pero si alguien lo solicita, lo agregaré.

Si puede decirme dónde he cometido un error (probablemente bastante básico), estaría muy agradecido.

Gracias de antemano por cualquier idea / sugerencia / ayuda / ....

EDIT : está en ABEL-HDL.

Archivo principal:

// for ispLSI1048E50LQ
MODULE Clocks

title 'Clocks'

Declarations
//Sub-module prototypes...
    acitac_0_59_s    interface ([CLOCK, RESET]                                 -> [P3..P0, Q3..Q0]);

//Sub-module instantiations - divider 10 MHz to 1 MHz
    adiv1         functional_block asyn_counter_10;                     //   1 MHz, asynchronous counters/dividers
    adiv2         functional_block asyn_counter_10;                     // 100 kHz
    adiv3         functional_block asyn_counter_10;                     //  10 kHz
    adiv4         functional_block asyn_counter_10;                     //   1 kHz
    adiv5         functional_block asyn_counter_10;                     // 100  Hz
    adiv6         functional_block asyn_counter_10;                     //  10  Hz
    adiv7         functional_block asyn_counter_10;                     //   1  Hz

//Sub-module instantiation - counter of seconds
    acSeconds     functional_block acitac_0_59_s;

//Bus to right ispLSI1032
    Rb0,  Rb1,  Rb2,  Rb3,  Rb4,  Rb5,  Rb6,  Rb7      PIN 96, 95, 94, 93, 92, 91, 90, 89 ISTYPE 'reg';   // to LED display

//Output toward 7-seg display
    RN0 = [ Rb3.. Rb0];  //Units
    RN1 = [ Rb7.. Rb4];  //Tents

    RESET PIN 66;
    CLOCK PIN 15;        // clock input - 10 MHz oscilator

    SD0, SD1, SD2, SD3, SJ0, SJ1, SJ2, SJ3                                                NODE;
    Seconds =                       [ SD3.. SD0  SJ3.. SJ0];

    Low   = 0;
    High  = 1;
    True  = 0;
    False = 1;

Equations
//Divider
    adiv1.CLOCK = CLOCK;            // 10 MHz
    adiv2.CLOCK = !adiv1.Q3;        //  1 MHz
    adiv3.CLOCK = !adiv2.Q3;        //100 kHz
    adiv4.CLOCK = !adiv3.Q3;        // 10 kHz
    adiv5.CLOCK = !adiv4.Q3;        //  1 kHz
    adiv6.CLOCK = !adiv5.Q3;        //100  Hz
    adiv7.CLOCK = !adiv6.Q3;        //  1  Hz

    adiv1.RESET = Low;
    adiv2.RESET = Low;
    adiv3.RESET = Low;
    adiv4.RESET = Low;
    adiv5.RESET = Low;
    adiv6.RESET = Low;
    adiv7.RESET = Low;

//Counter
    acSeconds.RESET = RESET;

    RN0.clk = CLOCK;
    RN1.clk = CLOCK;

    when (RESET == True) then {
        //xx:yy:50
        Seconds[7..4] = 5;
        Seconds[3..0] = 0;

        acSeconds.CLOCK = Low;

        RN1 := Seconds[7..4];
        RN0 := Seconds[3..0];

    } else {
        acSeconds.CLOCK = !adiv7.Q3;

        Seconds[7..4] = acSeconds.[Q3..Q0];
        Seconds[3..0] = acSeconds.[P3..P0];

        RN1 := Seconds[7..4];
        RN0 := Seconds[3..0];
    }
END Clocks

(Supongo que tengo que cambiar Seconds[7..4] = 5; en algo como acSeconds.[Q3..Q0] = 5; pero esto falla y parece que no puedo solucionar esto)

Módulo (la versión original no tiene la parte RESET == True pero con *.ar = RESET )

module acitac_0_59_s

title 'Counter asynchronous 0 to 59'

Declarations

    CLOCK   PIN;
    RESET   PIN; 
    P0, P1, P2, P3    PIN    ISTYPE 'reg';
    Q0, Q1, Q2, Q3    PIN    ISTYPE 'reg';

    outTents = [Q3..Q0];
    outUnits = [P3..P0];

    True  = 0;
    False = 1;

Equations
    outTents.clk = CLOCK;
    outUnits.clk = CLOCK;

    when (RESET == True) then {
        outTents := 5;
        outUnits := 0;
    } else {
        when ((outTents == 5) & (outUnits == 9)) then {
            outTents := 0;
            outUnits := 0;
        } else when (outUnits == 9) then {
            outTents := outTents + 1;
            outUnits := 0;
        } else {
            outTents := outTents;
            outUnits := outUnits + 1;
        }
    }    
end     acitac_0_59_s
    
pregunta Rao

0 respuestas

Lea otras preguntas en las etiquetas