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