¿Cómo escribimos código para verificar si el año es bisiesto o no en Verilog, sin usar el operador de módulo?

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:

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

No estoy muy familiarizado con Verilog, pero aquí hay algunas formas de identificar los años bisiestos sin usar una función de módulo.

En primer lugar, supongamos (o prueba) que el año está en el rango 1901-2099.

(a) Un año bisiesto expresado como un número binario tendrá 00 como los dos últimos dígitos. Asi que:

es un año bisiesto si año & (no 4) == 0

(b) Si tiene una función disponible para truncar un número real a un entero, esto funciona:

x = trunc (año / 4)
es un año bisiesto si x * 4 == año

(c) Si tiene operadores de turno (no turno circular), que estoy seguro de que Verilog tiene entonces:

x = año >> 2
es un año bisiesto si (x << 2) == año

Si la suposición acerca de que el rango es 1901-2099 es falsa, necesitará algo de lógica adicional para eliminar 1900, 1800, 1700 y 2100, 2200, 2300, etc.

Si no le importan los años <1901 o> 2099, podría ver si los dos últimos bits son 00.

More Interesting

¿Es cierto que al menos uno de los dos términos en [math] Rad (p) - 1, Rad (p) + 1 [/ math] es un número primo, donde [math] Rad (p) [/ math] es el producto de todos los números primos menores o iguales que [math] p [/ math]?

¿Cómo se prueba algo (desde cero) que es NP-hard?

¿Cuáles son algunos temas imprescindibles en matemáticas discretas y probabilidad de programación competitiva?

¿Qué conceptos matemáticos difíciles se pueden entender fácilmente mediante la programación?

¿P = NP?

¿Qué especialidad de pregrado debo elegir si quiero aplicar inteligencia artificial a los campos médicos?

¿Cuáles serían las implicaciones para el campo de la teoría de la complejidad si se encontrara un algoritmo de tiempo polinomial alto para un problema NP-difícil?

¿Alguien necesita ser bueno en matemáticas para ser un buen programador de computadoras?

¿No fue [math] flag [B] [/ math] modificado por thread [math] B [/ math] antes de [math] read_ {B} (flag [A] == false) [/ math]? ¿Por qué es una contradicción?

¿Se puede producir música usando las matemáticas? En caso afirmativo, ¿cómo?

¿Cómo verificamos la inexistencia de un camino hamiltoniano?

¿Qué tan necesario es una comprensión profunda de las matemáticas en la programación?

¿Qué tan bien un título en matemáticas aplicadas prepararía a alguien para la ciencia de datos?

¿Qué métodos de análisis deberían usarse cuando el nivel de la variable dependiente es mucho mayor que el número de variable independiente?

¿Qué es un decodificador Viterbi?