16 / 37 · Concepto
Contadores modulares, saturación y pulsos de fin
Diseñe la política del máximo y el ciclo exacto de la señal de fin de cuenta.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
Tres políticas distintas al superar el rango
Con el mismo registroRegistro Circuito que almacena varios bits de estado. Los registros síncronos de este curso capturan la entrada especificada en el flanco de reloj. Más información de N bits, la especificación decide si retornar, saturar o indicar error al llegar al máximo.
En ocho bits, pasar de 255 a 0 y permanecer en 255 son funciones distintas. Un acumulador que maneje positivos y negativos requiere además rango signed y saturación en ambos límites.
Cada columna siguiente registra un flanco ascendenteFlanco ascendente Instante en que el reloj pasa de 0 a 1. Se distingue del nivel alto, que abarca todo el intervalo con CLK=1. Más información; entradas previas y estados «después» posteriores. La alineación ordena muestras, no representa propagación físicaRetardo de propagación Tiempo desde un cambio de entrada hasta que la salida se estabiliza en el valor correcto. La equivalencia lógica y el comportamiento temporal son propiedades distintas. Más información. Con count=8, reset=0, enable=1 iniciales, módulo 10, retorno de cuatro bits y saturación de cuatro bits producen trayectorias diferentes.
Ver los datos de la forma de onda
| Señal | Forma de onda | Valores del bus |
|---|---|---|
| flanco | 234523452 | E0 → E1 → E2 → E3 → E4 → E5 → E6 → E7 → E8 |
| mod10 después | 234523452 | 9 → 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7 |
| wrap4 después | 234523452 | 9 → 10 → 11 → 12 → 13 → 14 → 15 → 0 → 1 |
| sat4 después | 2345234.. | 9 → 10 → 11 → 12 → 13 → 14 → 15 |
Compare el último estado del módulo M
Para un pulso cada diez incrementos, use estados 0–9 y cuente solo flancos habilitados. Puede registrar pulse con el significado «en este flanco se consumió 9 y se volvió a 0».
always_ff @(posedge clk) begin
if (rst) begin
count <= 4'd0;
pulse <= 1'b0;
end else begin
pulse <= 1'b0;
if (en) begin
if (count == 4'd9) begin
count <= 4'd0;
pulse <= 1'b1;
end else count <= count + 4'd1;
end
end
endLa asignación predeterminada devuelve pulse a 0 en el próximo flanco. En cambio, una salida count==9 puede durar varios ciclos si enable=0 detiene el contador. Distinga estado terminal de evento de finalización.
Desde dónde se cuenta el periodo
Tras reset y desde count=0, hacen falta diez flancos con enable=1 para el primer pulse. Más que llamar al primer flanco 0 o 1, importa definir de forma consistente entradas, estados y salidas.
El control siguiente es módulo 16. Desde 1110, un flanco da 1111 y el siguiente, 0000. Deténgalo en 1111 con enable=0. Conservación y saturación pueden mostrar el mismo valor, pero difieren al reanudar. Compare qué valor debería tener un contador saturante en esas condiciones.
El reset síncrono tiene prioridad sobre enable. Con enable=0, se conserva el valor almacenado. q=1110; q_next = (q + 1) mod 16
Inténtalo tú
Con count=9 y pulse=0, pasan dos flancos con en=0 y otro con en=1. ¿Qué ocurre con count y pulse?
Leer la explicación
Durante los dos flancos detenidos se mantienen count=9 y pulse=0. En el tercero pasan a count=0 y pulse=1. En el flanco siguiente, la asignación predeterminada devuelve pulse a 0.