Mi solicitud tiene una sección estándar de conteo de fallas hasta un número determinado y luego reiniciar el contador. Mi amigo experimentado me dice que al usar fichas reales, es común incrementar el contador en el flanco ascendente del reloj y restablecer el contador en el borde descendente. De esa manera, el diseñador tiene mucho tiempo para hacer lo que debe hacerse antes de que llegue el próximo reloj.
Pero nunca ha usado un CPLD y me pregunto si esto cambia las reglas. O si su información es técnicamente razonable pero no es prácticamente necesaria.
Mi diseño tiene algo como
always @(posedge clock) begin (increment the clock) end
always @(negedge clock) begin (reset the counter conditionally) end
No estoy entrenado en ingeniería eléctrica, solo leo y me meto. Pero no puedo dejar que descanse cuando siento que no tengo un cierto entendimiento (nivel n00b) de lo que está pasando.
Acabo de leer un ejemplo de un curso universitario en el que al instructor no le importó cuándo se restableció el contador. Su diseño era algo así como:
always @(posedge clock) begin
counter = counter + 1;
if (counter == some_number) counter = 0;
end
Esto me lleva a creer que estoy sobre ingeniería, el instructor está instruyendo no está construyendo una aplicación industrial, o el proceso de síntesis maneja esas cosas.
Por supuesto que podría probarlo en el simulador o introducirlo en el CPLD. Eventualmente, esto conducirá una máquina poderosa y tiene que funcionar cada vez. No puedo tener un caso extremo donde la máquina se comporte mal.
EDITAR - más contexto. Si bien puede que no importe con respecto a la respuesta, estoy contando los pulsos generados por un codificador conectado a un eje giratorio. Tengo que contarlos a todos, y no puedo perder ninguno.
EDIT 2: ejemplo de un bucle que incrementa un contador, luego, en alguna condición, lo cambia.
module slow_count(
input clk,
output reg [3:0] count
);
reg[19:0] snooze = 0;
always @(posedge clk) begin
snooze = snooze + 1; // Set the counter
if (snooze == 1000000) begin
snooze = 0; // And change it here
count = count + 1;
if (count == 10) count = 0;
end
end
endmodule