Kmila
Práctica

Ejercicios de práctica

Resuelve problemas reales de diseño digital contra casos de prueba ocultos. Tres modalidades, tres dificultades, una onda que debe coincidir.

Dificultad
Modalidad
01 · Desde cero

Construye desde cero

Lee la especificación, escribe el cuerpo de la entidad y pruébalo contra los casos.

Compuerta AND

Compuerta AND de dos entradas.

Fácil

Comparador de igualdad de 4 bits

Salida alta cuando a es igual a b.

Fácil

Decodificador 2 a 4

Salida one-hot para entrada de 2 bits.

Fácil

Medio sumador

Dos entradas, dos salidas: implementa la suma y el acarreo desde cero.

Fácil

Medio restador

Calcula a − b a un bit, con diff y borrow.

Fácil

Votador mayoritario de 3 entradas

Devuelve la mayoría de tres entradas de un bit.

Fácil

Multiplexor 2 a 1

Selecciona a o b según sel.

Fácil

Multiplexor 4 a 1

Selecciona una de cuatro entradas con sel de 2 bits.

Fácil

Compuerta NAND

NAND de dos entradas.

Fácil

Compuerta NOR

NOR de dos entradas.

Fácil

Compuerta NOT

Inversor de una entrada.

Fácil

Compuerta OR

Compuerta OR de dos entradas.

Fácil

Generador de paridad par

Entrada de 4 bits: salida 1 si hay un número impar de unos.

Fácil

Compuerta XNOR

NOR exclusiva de dos entradas.

Fácil

Compuerta XOR

OR exclusiva de dos entradas.

Fácil

Codificador de prioridad 4 a 2

Codifica el bit activo de mayor índice en y (2 bits).

Medio

Sumador de 4 bits

a + b + cin de 4 bits → sum (4) y cout.

Medio

Divisor de reloj entre 4

Genera un reloj a clk/4.

Medio

Comparador mayor/igual/menor

a vs b sin signo de 4 bits — tres banderas.

Medio

Contador síncrono 4 bits

Incrementa q en cada flanco; reset asíncrono.

Medio

Detector de flanco ascendente

Pulso de un ciclo en cada transición 0→1 de d.

Medio

Sumador completo

a + b + cin → sum, cout.

Medio

Código Gray 3 bits

Convierte binario de 3 bits a código Gray.

Medio

Registro con load (4 bits)

Carga d en q cuando load=1 en flanco.

Medio

Mux 4 a 1 con habilitación

Salida 0 cuando en=0; si no, enruta por sel.

Medio

One-hot a binario

Convierte 4 bits one-hot a 2 bits binarios.

Medio

Registro de desplazamiento 8 bits

Desplaza a la izquierda con cada flanco; entrada serial din.

Medio

Flip-flop T

Alterna q cuando t=1 en flanco ascendente.

Medio

Registro toggle con enable

Alterna q cada ciclo cuando en=1.

Medio

Contador 4 bits asc./desc.

+1 si dir=1, −1 si dir=0; reset asíncrono.

Medio

ALU de 8 bits

ALU de 4 ops: add/sub/and/or según op (2 bits).

Difícil

Árbitro round-robin (4)

Concede una de cuatro peticiones en prioridad rotatoria.

Difícil

Paso de iteración CORDIC

Un paso CORDIC: x' = x ± y, y' = y ∓ x, según dir.

Difícil

Acumulador CRC-8 serial

Actualiza CRC-8 con un bit por ciclo; reset a 0.

Difícil

Antirrebote de botón

La salida cambia solo si la entrada se mantuvo N ciclos.

Difícil

Banderas FIFO vacío/lleno

Cuenta push/pop en una cola de 4 — solo banderas.

Difícil

Codificador Hamming(7,4)

Añade 3 bits de paridad a una palabra de 4 bits.

Difícil

LFSR de 8 bits

LFSR de longitud máxima con taps 8,6,5,4. Reset a 0xFF.

Difícil

Codificador Manchester

Por cada bit emite dos medio-bits — '01' o '10'.

Difícil

Multiplicador 4 bits sin signo

a × b → producto de 8 bits. Combinacional.

Difícil

Generador PWM (ciclo 4 bits)

Salida alta mientras un contador libre 4 bits sea menor que duty.

Difícil

Maestro SPI (shift)

Genera sclk y desplaza MSB del registro a mosi.

Difícil

Banderas de pila 4 palabras

Push/pop en pila profundidad 4 — full/empty.

Difícil

FSM de semáforo

Semáforo de 3 estados: rojo → verde → amarillo.

Difícil

FSM receptor UART

Idle → start → data → stop según rx serial.

Difícil
02 · Corrige el error

Encuentra y corrige el error

Un diseño casi funcional con un defecto plantado — encuéntralo y parchéalo.

Suma 2 bits — sin cadena de acarreo

Se pierde el acarreo entre bits.

Fácil

AND 3 entradas — falta una

La salida ignora c.

Fácil

AND que es OR

Se escribió `or` en lugar de `and`.

Fácil

Comparador con 1 bit ausente

Compara sólo 3 de 4 bits.

Fácil

Decoder — línea ausente

Una salida nunca se activa.

Fácil

Codificador — prioridad mal

El bit menor tiene precedencia sobre el mayor.

Fácil

Igualdad con xor

`eq` se activa cuando difieren — debería ser xnor.

Fácil

Sumador completo — corrige el acarreo

La suma está bien, el acarreo está mal.

Fácil

Mux — por defecto '1'

Devuelve '1' cuando sel=1 en vez de b.

Fácil

Mux — valor por defecto erróneo

sel=0 entrega b en lugar de a.

Fácil

Mux 2:1 — sel invertido

sel elige la entrada equivocada. Corrígelo.

Fácil

NOR via AND

Aplicó DeMorgan mal.

Fácil

Inversor que es buffer

`y <= a` debería ser `not a`.

Fácil

Paridad usando nand

Se usó nand en lugar de xor.

Fácil

Medio sumador — sum y cout cambiados

sum está en cout y viceversa.

Fácil

Sumador — extensión de signo

Rellena con ceros donde necesitaba signo.

Medio

ALU — operación ausente

`xor` decodifica a cero — corrige el case.

Medio

Reset asíncrono cableado síncrono

La lista de sensibilidad excluye reset.

Medio

Decodificador BCD — falta un dígito

El dígito 7 produce ceros.

Medio

Comparador — igual mal

`eq` siempre vale 0.

Medio

Contador — reset ignorado

El reset nunca pone a 0 el contador.

Medio

Divisor por 8 — debía ser 4

La comparación usa la constante mal.

Medio

Detector — flanco descendente

Pulsa en 1→0 en lugar de 0→1.

Medio

FSM — estado inalcanzable

Una guarda nunca se cumple.

Medio

Gray — dos bits cambian

Dos bits cambian en transiciones adyacentes.

Medio

Registro de carga — flanco erróneo

Carga en flanco descendente.

Medio

Mux 4:1 — sel de 1 bit

La mitad superior de entradas no se alcanza.

Medio

Shift register — dirección errónea

Debería desplazar a la izquierda y va a la derecha.

Medio

T-FF ignora enable

Alterna cada ciclo sin importar t.

Medio

Up/down — dir ignorado

Siempre cuenta hacia arriba.

Medio

ALU — bandera de overflow mal

Lee el bit 6 en vez del 7.

Difícil

Árbitro — inanición de req3

La prioridad nunca rota a req3.

Difícil

Booth — shift mal

Shift lógico en lugar de aritmético.

Difícil

CORDIC — dirección invertida

Rota CW en lugar de CCW.

Difícil

CRC — polinomio mal

Se usó 0x07 en vez de 0x1D.

Difícil

Puntero FIFO — wrap mal

El wrap pierde una posición.

Difícil

Hamming(7,4) — paridad cambiada

Dos bits de paridad están cambiados.

Difícil

Handshake — condición de carrera

ack sube antes de que req sea estable.

Difícil

LFSR — taps incorrectos

La secuencia es corta — corrige los taps.

Difícil

Manchester — medios-bits cambiados

Codifica invertido 0/1.

Difícil

Multiplicador — extensión mal

Extiende con signo un operando sin signo.

Difícil

PWM — off-by-one

Ciclo de trabajo 1 corto.

Difícil

SPI — flanco de muestreo mal

Muestrea en flanco ascendente en lugar del descendente.

Difícil

Pila — pop off-by-one

Empty se afirma un ciclo tarde.

Difícil

UART — start-bit perdido

FSM muestrea el start-bit a destiempo.

Difícil
03 · Completa el hueco

Implementa la pieza faltante

El esqueleto está armado; falta un bloque. Impleméntalo.

Cuerpo AND — completa

Implementa la única asignación.

Fácil

Buffer tri-estado — completa

Salida a si en=1, si no 'Z'.

Fácil

Comparador (eq) — completa

Implementa la línea de igualdad.

Fácil

Contador 4 bits — completa el hueco

El esqueleto está listo; escribe la línea de incremento.

Fácil

Decoder Y0 — completa

Calcula la línea y(0).

Fácil

Medio sumador — escribe cout

sum está dada; escribe cout.

Fácil

Medio sumador — escribe sum

cout está dado; escribe sum.

Fácil

Mux 2:1 — completa

Implementa la asignación de y.

Fácil

NAND — completa

Una asignación.

Fácil

NOR — completa

Una asignación.

Fácil

Cuerpo NOT — completa

Implementa el inversor.

Fácil

Cuerpo OR — completa

Una sola asignación.

Fácil

Paridad — completa

Implementa la expresión de paridad.

Fácil

XNOR — completa

Una asignación.

Fácil

Cuerpo XOR — completa

Una sola asignación.

Fácil

Cadena de acarreo — completa

Conecta c1 entre los dos sumadores.

Medio

BCD dígito 5 — completa

Da el patrón 7-segmentos para 5.

Medio

Divisor — línea de toggle

Alterna clk_out al desbordar contador.

Medio

Comparador gt — completa

Implementa la línea mayor que.

Medio

Contador wrap — completa

Implementa el caso de wrap.

Medio

Pulso de flanco — completa

Calcula pulse desde d_curr y d_prev.

Medio

Transición FSM — completa

Elige el siguiente estado.

Medio

Siguiente Gray — completa

Calcula el siguiente valor Gray.

Medio

Load register — rama

Implementa la rama load=1.

Medio

Bloque 4:1 — completa

Implementa la selección 4:1.

Medio

Codificador prioridad — default

Cubre el caso todo-cero.

Medio

Shift register — bit fill

Elige el bit entrante (din o '0').

Medio

T-FF toggle — completa

Calcula q siguiente dado t y q actual.

Medio

Realimentación toggle

Calcula q desde q actual cuando en=1.

Medio

Up/down — lógica dir

Elige ±1 según dir.

Medio

ALU shift — completa

Implementa shift izquierda en sh bits.

Difícil

Rotación de árbitro

Elige el siguiente grant en round-robin.

Difícil

Paso Booth

Suma/resta según bits Booth.

Difícil

CORDIC paso (x)

Implementa x' = x + dir*y.

Difícil

Actualizar CRC

Implementa paso CRC.

Difícil

Puntero lectura FIFO

Incrementa el puntero al hacer pop si no está vacío.

Difícil

Síndrome Hamming

Calcula el síndrome de 3 bits.

Difícil

Tap LFSR

Calcula el bit de realimentación.

Difícil

Transición Manchester

Emite el par de medios bits.

Difícil

Comparador PWM

Compara contador contra duty.

Difícil

Token round-robin

Rota el token cada ciclo.

Difícil

SPI selección de flanco

Muestrea solo en flanco descendente.

Difícil

Pop de pila

Decrementa sp en pop si no vacío.

Difícil

Tabla FSM — completa

Implementa la tabla de transición.

Difícil

Punto de muestreo UART

Pulso al medio del bit.

Difícil
Ocurrió un error no controlado. Recargar 🗙