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.
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.
Comparador de igualdad de 4 bits
Salida alta cuando a es igual a b.
Decodificador 2 a 4
Salida one-hot para entrada de 2 bits.
Medio sumador
Dos entradas, dos salidas: implementa la suma y el acarreo desde cero.
Medio restador
Calcula a − b a un bit, con diff y borrow.
Votador mayoritario de 3 entradas
Devuelve la mayoría de tres entradas de un bit.
Multiplexor 2 a 1
Selecciona a o b según sel.
Multiplexor 4 a 1
Selecciona una de cuatro entradas con sel de 2 bits.
Compuerta NAND
NAND de dos entradas.
Compuerta NOR
NOR de dos entradas.
Compuerta NOT
Inversor de una entrada.
Compuerta OR
Compuerta OR de dos entradas.
Generador de paridad par
Entrada de 4 bits: salida 1 si hay un número impar de unos.
Compuerta XNOR
NOR exclusiva de dos entradas.
Compuerta XOR
OR exclusiva de dos entradas.
Codificador de prioridad 4 a 2
Codifica el bit activo de mayor índice en y (2 bits).
Sumador de 4 bits
a + b + cin de 4 bits → sum (4) y cout.
Divisor de reloj entre 4
Genera un reloj a clk/4.
Comparador mayor/igual/menor
a vs b sin signo de 4 bits — tres banderas.
Contador síncrono 4 bits
Incrementa q en cada flanco; reset asíncrono.
Detector de flanco ascendente
Pulso de un ciclo en cada transición 0→1 de d.
Sumador completo
a + b + cin → sum, cout.
Código Gray 3 bits
Convierte binario de 3 bits a código Gray.
Registro con load (4 bits)
Carga d en q cuando load=1 en flanco.
Mux 4 a 1 con habilitación
Salida 0 cuando en=0; si no, enruta por sel.
One-hot a binario
Convierte 4 bits one-hot a 2 bits binarios.
Registro de desplazamiento 8 bits
Desplaza a la izquierda con cada flanco; entrada serial din.
Flip-flop T
Alterna q cuando t=1 en flanco ascendente.
Registro toggle con enable
Alterna q cada ciclo cuando en=1.
Contador 4 bits asc./desc.
+1 si dir=1, −1 si dir=0; reset asíncrono.
ALU de 8 bits
ALU de 4 ops: add/sub/and/or según op (2 bits).
Árbitro round-robin (4)
Concede una de cuatro peticiones en prioridad rotatoria.
Paso de iteración CORDIC
Un paso CORDIC: x' = x ± y, y' = y ∓ x, según dir.
Acumulador CRC-8 serial
Actualiza CRC-8 con un bit por ciclo; reset a 0.
Antirrebote de botón
La salida cambia solo si la entrada se mantuvo N ciclos.
Banderas FIFO vacío/lleno
Cuenta push/pop en una cola de 4 — solo banderas.
Codificador Hamming(7,4)
Añade 3 bits de paridad a una palabra de 4 bits.
LFSR de 8 bits
LFSR de longitud máxima con taps 8,6,5,4. Reset a 0xFF.
Codificador Manchester
Por cada bit emite dos medio-bits — '01' o '10'.
Multiplicador 4 bits sin signo
a × b → producto de 8 bits. Combinacional.
Generador PWM (ciclo 4 bits)
Salida alta mientras un contador libre 4 bits sea menor que duty.
Maestro SPI (shift)
Genera sclk y desplaza MSB del registro a mosi.
Banderas de pila 4 palabras
Push/pop en pila profundidad 4 — full/empty.
FSM de semáforo
Semáforo de 3 estados: rojo → verde → amarillo.
FSM receptor UART
Idle → start → data → stop según rx serial.
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.
AND 3 entradas — falta una
La salida ignora c.
AND que es OR
Se escribió `or` en lugar de `and`.
Comparador con 1 bit ausente
Compara sólo 3 de 4 bits.
Decoder — línea ausente
Una salida nunca se activa.
Codificador — prioridad mal
El bit menor tiene precedencia sobre el mayor.
Igualdad con xor
`eq` se activa cuando difieren — debería ser xnor.
Sumador completo — corrige el acarreo
La suma está bien, el acarreo está mal.
Mux — por defecto '1'
Devuelve '1' cuando sel=1 en vez de b.
Mux — valor por defecto erróneo
sel=0 entrega b en lugar de a.
Mux 2:1 — sel invertido
sel elige la entrada equivocada. Corrígelo.
NOR via AND
Aplicó DeMorgan mal.
Inversor que es buffer
`y <= a` debería ser `not a`.
Paridad usando nand
Se usó nand en lugar de xor.
Medio sumador — sum y cout cambiados
sum está en cout y viceversa.
Sumador — extensión de signo
Rellena con ceros donde necesitaba signo.
ALU — operación ausente
`xor` decodifica a cero — corrige el case.
Reset asíncrono cableado síncrono
La lista de sensibilidad excluye reset.
Decodificador BCD — falta un dígito
El dígito 7 produce ceros.
Comparador — igual mal
`eq` siempre vale 0.
Contador — reset ignorado
El reset nunca pone a 0 el contador.
Divisor por 8 — debía ser 4
La comparación usa la constante mal.
Detector — flanco descendente
Pulsa en 1→0 en lugar de 0→1.
FSM — estado inalcanzable
Una guarda nunca se cumple.
Gray — dos bits cambian
Dos bits cambian en transiciones adyacentes.
Registro de carga — flanco erróneo
Carga en flanco descendente.
Mux 4:1 — sel de 1 bit
La mitad superior de entradas no se alcanza.
Shift register — dirección errónea
Debería desplazar a la izquierda y va a la derecha.
T-FF ignora enable
Alterna cada ciclo sin importar t.
Up/down — dir ignorado
Siempre cuenta hacia arriba.
ALU — bandera de overflow mal
Lee el bit 6 en vez del 7.
Árbitro — inanición de req3
La prioridad nunca rota a req3.
Booth — shift mal
Shift lógico en lugar de aritmético.
CORDIC — dirección invertida
Rota CW en lugar de CCW.
CRC — polinomio mal
Se usó 0x07 en vez de 0x1D.
Puntero FIFO — wrap mal
El wrap pierde una posición.
Hamming(7,4) — paridad cambiada
Dos bits de paridad están cambiados.
Handshake — condición de carrera
ack sube antes de que req sea estable.
LFSR — taps incorrectos
La secuencia es corta — corrige los taps.
Manchester — medios-bits cambiados
Codifica invertido 0/1.
Multiplicador — extensión mal
Extiende con signo un operando sin signo.
PWM — off-by-one
Ciclo de trabajo 1 corto.
SPI — flanco de muestreo mal
Muestrea en flanco ascendente en lugar del descendente.
Pila — pop off-by-one
Empty se afirma un ciclo tarde.
UART — start-bit perdido
FSM muestrea el start-bit a destiempo.
Implementa la pieza faltante
El esqueleto está armado; falta un bloque. Impleméntalo.
Cuerpo AND — completa
Implementa la única asignación.
Buffer tri-estado — completa
Salida a si en=1, si no 'Z'.
Comparador (eq) — completa
Implementa la línea de igualdad.
Contador 4 bits — completa el hueco
El esqueleto está listo; escribe la línea de incremento.
Decoder Y0 — completa
Calcula la línea y(0).
Medio sumador — escribe cout
sum está dada; escribe cout.
Medio sumador — escribe sum
cout está dado; escribe sum.
Mux 2:1 — completa
Implementa la asignación de y.
NAND — completa
Una asignación.
NOR — completa
Una asignación.
Cuerpo NOT — completa
Implementa el inversor.
Cuerpo OR — completa
Una sola asignación.
Paridad — completa
Implementa la expresión de paridad.
XNOR — completa
Una asignación.
Cuerpo XOR — completa
Una sola asignación.
Cadena de acarreo — completa
Conecta c1 entre los dos sumadores.
BCD dígito 5 — completa
Da el patrón 7-segmentos para 5.
Divisor — línea de toggle
Alterna clk_out al desbordar contador.
Comparador gt — completa
Implementa la línea mayor que.
Contador wrap — completa
Implementa el caso de wrap.
Pulso de flanco — completa
Calcula pulse desde d_curr y d_prev.
Transición FSM — completa
Elige el siguiente estado.
Siguiente Gray — completa
Calcula el siguiente valor Gray.
Load register — rama
Implementa la rama load=1.
Bloque 4:1 — completa
Implementa la selección 4:1.
Codificador prioridad — default
Cubre el caso todo-cero.
Shift register — bit fill
Elige el bit entrante (din o '0').
T-FF toggle — completa
Calcula q siguiente dado t y q actual.
Realimentación toggle
Calcula q desde q actual cuando en=1.
Up/down — lógica dir
Elige ±1 según dir.
ALU shift — completa
Implementa shift izquierda en sh bits.
Rotación de árbitro
Elige el siguiente grant en round-robin.
Paso Booth
Suma/resta según bits Booth.
CORDIC paso (x)
Implementa x' = x + dir*y.
Actualizar CRC
Implementa paso CRC.
Puntero lectura FIFO
Incrementa el puntero al hacer pop si no está vacío.
Síndrome Hamming
Calcula el síndrome de 3 bits.
Tap LFSR
Calcula el bit de realimentación.
Transición Manchester
Emite el par de medios bits.
Comparador PWM
Compara contador contra duty.
Token round-robin
Rota el token cada ciclo.
SPI selección de flanco
Muestrea solo en flanco descendente.
Pop de pila
Decrementa sp en pop si no vacío.
Tabla FSM — completa
Implementa la tabla de transición.
Punto de muestreo UART
Pulso al medio del bit.