Espero que esto funcione….
/ * los años bisiestos son todos los años divisibles por 4,
excepto que los años divisibles por 100 no son años bisiestos,
pero los años divisibles por 400 son años bisiestos.
Codificando el año:
- ¿Realmente necesito una sólida formación en matemáticas para comenzar a aprender programación?
- ¿Es la máquina de Turing la abstracción más influyente de este siglo y el pasado?
- Dado un conjunto de n rectángulos alineados en el eje en el plano, ¿qué tan grande es el subconjunto más grande de estos rectángulos que contienen un punto común en O (n ^ 3) y luego en el orden O (nlogn)?
- Cómo obtener una sólida base matemática
- ¿Qué significa definir una variable en matemáticas?
binario? fácil para divisible por 4,
pero difícil para 100 y 400 (no potencias de 2)
BCD? fácil para 100,
pero más difícil para 4, ¿qué pasa con 400?
Partes:
construir un circuito que determine si el año es divisible por 4
construir un circuito que determine si el año es divisible por 100
construir un circuito que determine si el año es divisible por 400
combine los resultados de los tres pasos anteriores para obtener el indicador de año bisiesto
Referencia:
Diseño lógico contemporáneo Randy H. Katz 2nd ed Capítulo 5
* /
salto de módulo (/ * AUTOARG * /
// Salidas
leap_year_flag,
// Entradas
año
);
input [15: 0] año; // años en 4 dígitos bcd
salida leap_year_flag;
cable div_by_100, div_by_400;
reg div_by4;
/ * Circuito divisible por 4
Solo es necesario mirar los dos dígitos de orden inferior del año
todos los años que terminan en 00, 04, 08, 12, 16, 20, etc. son divisibles por 4
si el dígito de las decenas es par, entonces divisible por 4 si el dígito de uno es 0, 4 u 8
si el dígito de las decenas es impar, entonces divisible por 4 si el dígito de las unidades es 2 o 6.
Se traduce en la siguiente expresión booleana
* /
siempre @ (/ * AS * / año)
if (año [4]) comienza // el dígito de decenas es impar
div_by4 = (año [3: 0] == 4’h2) | (año [3: 0] == 4’h6);
fin más comienza
div_by4 = (año [3: 0] == 4’h0) | (año [3: 0] == 4’h4) | (año [3: 0] == 4’h8);
fin
/ *
Divisible por 100 solo requiere verificar que todos los bits de dos dígitos de orden inferior sean todos 0:
* /
asignar div_by_100 = (año [7: 4] == 4’h0) y (año [3: 0] == 4’h0);
/ *
Divisible-by-400 combina el divisible-by-4
(aplicado a los miles y cientos dígitos)
y circuitos divisibles por 100
* /
asignar div_by_400 = div_by_100 & div_by4;
asignar leap_year_flag = div_by4 & (~ div_by_100) | div_by_400;
endmodule // salto