← Volver al blogLógica combinacional

Decodificadores y codificadores: control de una pantalla de 7 segmentos

Los decodificadores traducen binario a salidas one-hot o de segmentos; los codificadores hacen lo contrario. Construye un controlador BCD a 7 segmentos y aprende sobre codificadores de prioridad.

DennyDenny
13 min de lectura
Chalkboard feature illustration for “Decodificadores y codificadores: control de una pantalla de 7 segmentos”

Resumen: Un decodificador binario activo en alto de n bits asigna un código a una de 2n2^n salidas; las variantes activas en bajo invierten la convención. Un codificador simple supone una entrada one-hot, mientras que uno de prioridad define un ganador cuando hay varias activas. Un bloque BCD a siete segmentos es un conversor de códigos, no un decodificador one-hot, porque varios segmentos pueden estar activos a la vez.

Los decodificadores y codificadores traducen entre índices binarios compactos y conjuntos de señales más amplios. Aparecen en la selección de direcciones, el control de instrucciones, la codificación de eventos, la lógica de displays y muchas otras interfaces. Sus nombres describen la dirección lógica, pero una interfaz completa también necesita una polaridad, un comportamiento de habilitación y una política para entradas no válidas o simultáneas.

En esta guía construiremos un controlador BCD a 7 segmentos funcional a partir de expresiones booleanas, entenderemos la diferencia entre displays de ánodo común y cátodo común, estudiaremos los codificadores de prioridad y su función en la gestión de interrupciones y construiremos estos circuitos en digisim.io.

¿Qué es un decodificador?

Un decodificador binario es un circuito combinacional que asigna una entrada de nn bits a una salida seleccionada entre un máximo de 2n2^n. En el ejemplo activo en alto siguiente, la salida seleccionada está en nivel ALTO y las demás en nivel BAJO. Los circuitos integrados decodificadores reales suelen incluir habilitaciones y pueden usar salidas activas en bajo; en ese caso, la línea seleccionada está en nivel BAJO.

Lección sobre un decodificador de 2 a 4

Un decodificador de 2 a 4: la entrada de 2 bits selecciona cuál de las 4 salidas está en nivel ALTO. La entrada 10 (el 2 binario) activa la salida Y2Y_2.

El decodificador de 2 a 4: tabla de verdad y expresiones booleanas

A1A_1A0A_0Y0Y_0Y1Y_1Y2Y_2Y3Y_3
001000
010100
100010
110001

Cada salida es una combinación AND única de las variables de entrada (complementadas o no):

Y0=A1‾⋅A0‾Y_0 = \overline{A_1} \cdot \overline{A_0} Y1=A1‾⋅A0Y_1 = \overline{A_1} \cdot A_0 Y2=A1⋅A0‾Y_2 = A_1 \cdot \overline{A_0} Y3=A1⋅A0Y_3 = A_1 \cdot A_0

El esquema canónico de suma de productos usa dos inversiones y cuatro términos AND de dos entradas. Un ASIC o FPGA sintetizado puede asignar la misma función a celdas o tablas de consulta diferentes.

Escalado a decodificadores mayores

Un decodificador de 3 a 8 sigue el mismo patrón booleano con ocho minterms. En general, una forma directa de suma de productos tiene un minterm por salida. Es una construcción didáctica, no un requisito universal sobre el número de puertas físicas; los decodificadores grandes suelen ser jerárquicos.

La pantalla de 7 segmentos

Una pantalla de 7 segmentos muestra dígitos decimales mediante siete segmentos LED dispuestos con forma de 8. Cada segmento se etiqueta de la a a la g:

 ━━━━━ (a)
│     │
(f)   (b)
│     │
 ━━━━━ (g)
│     │
(e)   (c)
│     │
 ━━━━━ (d)

Para mostrar cualquier dígito del 0 al 9, encendemos selectivamente la combinación adecuada de segmentos. Por ejemplo, el dígito «7» necesita que los segmentos a, b y c estén encendidos, mientras d, e, f y g permanecen apagados.

Cátodo común frente a ánodo común

Hay dos configuraciones físicas para las pantallas de 7 segmentos, y la distinción importa al diseñar el circuito controlador:

  • Cátodo común: todos los LED de los segmentos comparten una conexión común a tierra (cátodo). Un segmento se enciende cuando su ánodo recibe un nivel ALTO. En esta configuración, las salidas del decodificador son activas en alto: un 1 lógico enciende un segmento.
  • Ánodo común: todos los LED de los segmentos comparten una conexión común a la alimentación positiva (ánodo). Un segmento se enciende cuando su cátodo se lleva a nivel BAJO. En esta configuración, las salidas del decodificador deben ser activas en bajo: un 0 lógico enciende un segmento.

El componente lógico de siete segmentos de DigiSim usa órdenes de segmento activas en alto. En una pantalla física, la polaridad de salida es solo una parte de la interfaz: incluye limitación de corriente, confirma si el controlador puede suministrar o absorber la corriente necesaria y respeta los límites de potencia de cada segmento y del encapsulado.

Idea clave: no es un decodificador simple

Un decodificador de 7 segmentos es fundamentalmente distinto de un decodificador binario estándar. Un decodificador de 4 a 16 activa exactamente UNA salida cada vez. Un decodificador de 7 segmentos activa VARIOS segmentos simultáneamente (el dígito «8» enciende los 7 segmentos). Es un circuito lógico combinacional con 7 funciones de salida independientes, todas derivadas de la misma entrada BCD de 4 bits.

BCD a 7 segmentos: tabla de verdad

El BCD (decimal codificado en binario) usa 4 bits para representar los dígitos del 0 al 9. El decodificador asigna a cada dígito el patrón de segmentos apropiado:

DígitoDDCCBBAAabcdefg
000001111110
100010110000
200101101101
300111111001
401000110011
501011011011
601101011111
701111110000
810001111111
910011111011

Los valores BCD del 10 al 15 están fuera del código de dígitos decimales. Sus patrones de display dependen del diseño: define una pantalla en blanco, un símbolo de error, los caracteres hexadecimales A–F o un comportamiento indiferente según el contrato del sistema.

Derivación de expresiones booleanas para las salidas

Cada uno de los siete segmentos tiene su propia función booleana de las cuatro entradas BCD DD, CC, BB y AA. Para deducir estas expresiones, observamos qué dígitos iluminan cada segmento y escribimos la suma de productos (o usamos mapas de Karnaugh para minimizarla).

Segmento a (horizontal superior)

El segmento a está ENCENDIDO para los dígitos 0, 2, 3, 5, 6, 7, 8 y 9, y APAGADO para los dígitos 1 y 4. Estos son los minterms donde a=1a=1:

a=D‾ C‾ B‾ A‾+D‾ C‾ B A‾+D‾ C‾ B A+D‾ C B‾ A+D‾ C B A‾+D‾ C B A+D C‾ B‾ A‾+D C‾ B‾ Aa = \overline{D}\,\overline{C}\,\overline{B}\,\overline{A} + \overline{D}\,\overline{C}\,B\,\overline{A} + \overline{D}\,\overline{C}\,B\,A + \overline{D}\,C\,\overline{B}\,A + \overline{D}\,C\,B\,\overline{A} + \overline{D}\,C\,B\,A + D\,\overline{C}\,\overline{B}\,\overline{A} + D\,\overline{C}\,\overline{B}\,A

Tras minimizar con un mapa de Karnaugh (tratando las entradas BCD 10-15 como indiferentes), se simplifica a:

a=D+B+(A⋅C)+(A‾⋅C‾)a = D + B + (A \cdot C) + (\overline{A} \cdot \overline{C})

O, de forma equivalente: a=D+B+A⊕C‾a = D + B + \overline{A \oplus C} (la XNOR de AA y CC).

Segmento g (horizontal central)

El segmento g está ENCENDIDO para los dígitos 2, 3, 4, 5, 6, 8 y 9, y APAGADO para los dígitos 0, 1 y 7. La expresión minimizada es:

g=D+(B⊕C)+(B⋅A‾)g = D + (B \oplus C) + (B \cdot \overline{A})

O, desarrollada: g=D+(B⋅C‾)+(B‾⋅C)+(B⋅A‾)g = D + (B \cdot \overline{C}) + (\overline{B} \cdot C) + (B \cdot \overline{A}).

Segmento d (horizontal inferior)

El segmento d está ENCENDIDO para los dígitos 0, 2, 3, 5, 6, 8 y 9, y APAGADO para los dígitos 1, 4 y 7. La expresión minimizada es:

d=D+(C‾⋅A‾)+(C‾⋅B)+(B⋅A‾)+(C⋅B‾⋅A)d = D + (\overline{C} \cdot \overline{A}) + (\overline{C} \cdot B) + (B \cdot \overline{A}) + (C \cdot \overline{B} \cdot A)

Los cuatro segmentos restantes (b, c, e y f) siguen el mismo proceso: enumera los minterms, decide la política para entradas no válidas, representa el resultado en un mapa de Karnaugh y extrae una expresión minimizada. Los controladores comerciales de la familia 74x47/48 implementan un comportamiento BCD a segmentos especificado, pero sus redes internas no tienen por qué coincidir con estas ecuaciones concretas.

Gestión de entradas BCD no válidas

BCD solo usa valores de entrada del 0 al 9, pero una entrada de 4 bits puede representar valores del 10 al 15. ¿Qué debe mostrar la pantalla para estas entradas no válidas? Hay tres enfoques habituales:

  1. Dejar la pantalla en blanco: todos los segmentos apagados. Proporciona un resultado definido, pero puede ocultar un fallo aguas arriba si otro diagnóstico no lo notifica.
  2. Tratamiento indiferente: tratar las entradas 10–15 como libertades de optimización. Esto puede simplificar la lógica, pero los patrones resultantes no están especificados y solo son aceptables cuando esas entradas no pueden importar en la pantalla.
  3. Mostrar dígitos hexadecimales: en displays hexadecimales, las entradas 10-15 se asignan a las letras A a F, lo que requiere patrones de segmentos adicionales.

Las expresiones anteriores usan el enfoque indiferente. La guía específica de BCD a siete segmentos deduce las siete funciones y explica cuándo es segura esa suposición.

Construcción de un controlador de 7 segmentos en digisim.io

Sigue estos pasos para construir un controlador de display funcional:

  1. Coloca las entradas BCD. Añade cuatro componentes INPUT_SWITCH y etiquétalos DD, CC, BB y AA.
  2. Genera los complementos. Coloca cuatro puertas NOT para producir D‾\overline{D}, C‾\overline{C}, B‾\overline{B} y A‾\overline{A}.
  3. Construye la lógica de segmentos. Para cada segmento (de a a g), implementa su expresión booleana con puertas AND y OR. Empieza por el segmento a usando la expresión minimizada anterior.
  4. Conecta la pantalla. Coloca un componente SEVEN_SEGMENT_DISPLAY y conecta cada salida de segmento a la entrada correspondiente de la pantalla.
  5. Prueba sistemáticamente. Conmuta las entradas por todos los valores BCD de 0000 a 1001 y verifica que aparezca el dígito correcto para cada entrada.

Como atajo, usa el componente DIGIT_DISPLAY. Para el ejercicio a nivel de puertas, prueba los diez dígitos válidos y los seis códigos no válidos, en lugar de detenerte tras un único ejemplo visible.

¿Qué es un codificador?

Un codificador realiza la operación inversa de un decodificador. Toma 2n2^n líneas de entrada (de las que como máximo una debe estar activa) y produce un código binario de nn bits que identifica qué entrada está activa.

FunciónDecodificadorCodificador
DirecciónCódigo binario a one-hotOne-hot a código binario
Entradann bits2n2^n líneas
Salida2n2^n líneasnn bits
EjemploDirección a selección de chip de memoriaTecla de teclado a código de escaneo

Codificador sencillo de 4 a 2

Un codificador básico de 4 a 2 tiene 4 entradas (D3D_3, D2D_2, D1D_1, D0D_0) y 2 salidas (Y1Y_1, Y0Y_0). Las expresiones booleanas son:

Y1=D2+D3Y_1 = D_2 + D_3 Y0=D1+D3Y_0 = D_1 + D_3

Esto solo funciona correctamente si exactamente una entrada está activa cada vez. Si varias entradas están activas simultáneamente, la salida se vuelve ambigua.

Codificadores de prioridad

En los sistemas reales, varias entradas pueden estar activas simultáneamente. Un codificador de prioridad resuelve esta ambigüedad codificando solo la entrada activa de mayor prioridad (normalmente la de índice más alto).

D3D_3D2D_2D1D_1D0D_0Y1Y_1Y0Y_0VálidaEntrada codificada
0000XX0Ninguna
0001001D0D_0
001X011D1D_1
01XX101D2D_2
1XXX111D3D_3 (prioridad máxima)

Las entradas X significan «indiferente». Las entradas de menor prioridad se ignoran cuando hay una entrada de mayor prioridad activa. La salida Válida indica si hay alguna entrada activa, algo importante para la lógica posterior que debe distinguir entre «la entrada 0 está activa» y «no hay ninguna entrada activa».

Codificador de prioridad en la gestión de interrupciones

Una de las aplicaciones más importantes de los codificadores de prioridad está en los controladores de interrupciones. En un sistema con microprocesador, varios dispositivos de hardware (teclado, tarjeta de red, temporizador, unidad de disco) pueden solicitar simultáneamente la atención de la CPU activando líneas de solicitud de interrupción.

Un codificador de prioridad puede identificar la solicitud elegible de mayor rango y producir su índice. Un controlador de interrupciones completo además registra eventos pendientes, aplica máscaras y el estado de prioridad, entrega un identificador o vector de interrupción definido por el protocolo, sigue el servicio y conserva las solicitudes no seleccionadas. Un codificador sin estado no puede mantener pendientes por sí solo las solicitudes de menor prioridad.

El Intel 8259A es un ejemplo histórico de controlador que combina las funciones de solicitud, máscara, servicio en curso, resolución de prioridad y generación de vectores. Reducir todo el dispositivo a un codificador de ocho entradas omite esas funciones con estado.

Construcción de un decodificador de 3 a 8 en digisim.io

Estos son los pasos para construir un decodificador completo de 3 a 8:

  1. Coloca las entradas. Añade tres componentes INPUT_SWITCH etiquetados A2A_2, A1A_1 y A0A_0.
  2. Genera los complementos. Coloca tres puertas NOT para A2‾\overline{A_2}, A1‾\overline{A_1} y A0‾\overline{A_0}.
  3. Construye la matriz AND. Coloca ocho puertas AND de 3 entradas. Cada puerta recibe una combinación única de entradas originales y complementadas:
    • Y0=A2‾⋅A1‾⋅A0‾Y_0 = \overline{A_2} \cdot \overline{A_1} \cdot \overline{A_0}
    • Y1=A2‾⋅A1‾⋅A0Y_1 = \overline{A_2} \cdot \overline{A_1} \cdot A_0
    • Y2=A2‾⋅A1⋅A0‾Y_2 = \overline{A_2} \cdot A_1 \cdot \overline{A_0}
    • …continuing through…
    • Y7=A2⋅A1⋅A0Y_7 = A_2 \cdot A_1 \cdot A_0
  4. Añade las salidas. Conecta cada salida AND a un OUTPUT_LIGHT. Al conmutar las entradas, exactamente una luz debería estar encendida cada vez.
  5. Añade una línea de habilitación (opcional). Haz AND de cada salida con una señal de habilitación para crear un decodificador habilitado, que puede usarse para decodificar direcciones de memoria.

Aplicaciones

Decodificación de direcciones de memoria

En los sistemas de procesador, los decodificadores ayudan a seleccionar qué destino de memoria o E/S responde a una dirección. Un decodificador de 2 a 4 conectado a dos bits superiores de dirección puede dividir un espacio en cuatro regiones iguales de potencias de dos. Para otros mapas se necesitan bits de dirección y calificadores de acceso adicionales. Si los destinos comparten un bus triestado, la lógica de control del bus debe garantizar que como máximo una salida esté habilitada; muchas interconexiones modernas en chip usan respuestas multiplexadas en lugar de cableado triestado interno.

Codificación de teclado

Una matriz de teclas explorada produce observaciones de filas y columnas. Un codificador de prioridad puede reducir intencionadamente varias líneas de columna activas a un índice, pero pierde las demás teclas simultáneas. Los diseños que necesitan rollover de varias teclas conservan y procesan el estado completo de la matriz. El ghosting eléctrico, la eliminación del rebote de contactos, la generación de códigos de escaneo y la prioridad son aspectos distintos.

Sistemas de display

La conversión de BCD a siete segmentos aparece en relojes, medidores, electrodomésticos y marcadores. En un display multiplexado, varias posiciones de dígito pueden compartir el control de segmentos. El controlador presenta un patrón y habilita su dígito correspondiente, y después avanza. Elige las frecuencias de refresco de trama completa y de cada dígito según los límites de parpadeo, cámara, brillo, ciclo de trabajo y dispositivo; no existe un umbral universal de 1 kHz. Inserta un intervalo de apagado si los retardos del controlador y de selección del dígito pudieran producir segmentos fantasma.

Decodificación de instrucciones en CPU

En una CPU didáctica pequeña, un opcode de 4 bits puede alimentar un decodificador de 4 a 16 cuya línea seleccionada contribuye a los controles de la ALU, los registros y la memoria durante el ciclo de búsqueda-decodificación-ejecución. La decodificación real de instrucciones puede ser jerárquica, dirigida por tablas, microcodificada o distribuida, y las señales de control normalmente combinan la información del opcode con el estado temporal y otros campos de la instrucción.

Temporización y riesgos

Las salidas combinacionales no cambian simultáneamente. Cuando cambian varios bits de entrada, un decodificador de minterms puede seleccionar brevemente la salida anterior, ninguna salida o —en hardware físico— una salida no deseada, porque los caminos complementados y no complementados tienen retardos diferentes. Una red de siete segmentos puede mostrar momentáneamente un patrón de transición.

Usa entradas o salidas registradas cuando el consumidor muestree de forma síncrona. En un display multiplexado, apaga durante el cambio de dígito o patrón si el ghosting importa. Para selecciones de chip y habilitaciones de escritura, analiza los hazards y cumple los requisitos temporales del dispositivo objetivo en lugar de confiar únicamente en una tabla de verdad estática.

Pruébalo por tu cuenta

  1. Construye un decodificador de 2 a 4 usando cuatro términos AND con las inversiones adecuadas. Verifica que exactamente una salida esté en nivel ALTO para cada combinación de entrada habilitada y que ninguna esté activa mientras está deshabilitado.
  2. Conecta una pantalla de 7 segmentos implementando desde cero las expresiones booleanas de al menos los segmentos a y g; después conecta las salidas a un SEVEN_SEGMENT_DISPLAY.
  3. Crea un codificador de 4 a 2 que codifique cuál de 4 botones está pulsado en un código binario de 2 bits.
  4. Añade lógica de prioridad al codificador para que, cuando se pulsen dos botones simultáneamente, gane el botón de número más alto.
  5. Construye un contador BCD completo con display conectando un COUNTER al decodificador de 7 segmentos y observa cómo cuenta automáticamente del 0 al 9.

Continúa con contadores y máquinas de estados para alimentar el decodificador con una entrada de conteo, o abre la referencia del componente puerta AND, el bloque fundamental de cada salida del decodificador. Los multiplexores resuelven el problema inverso de encaminamiento; consulta la guía de multiplexores.

Referencias

Convierte la idea en un circuito funcional.