Unidad de control
Descripción general
- Propósito: La unidad de control es el componente de orquestación de la arquitectura de computadora de 8 bits de DigiSim. Genera las señales de control necesarias para coordinar el contador de programa, la memoria (RAM), el registro de instrucción, la ALU, el registro de banderas y otros componentes para ejecutar un conjunto completo de instrucciones.
- Símbolo: La unidad de control se representa mediante un bloque rectangular con múltiples pines de entrada y salida para interactuar con los diversos componentes de la CPU.
- Rol en DigiSim.io: La unidad de control permite la creación de una computadora completa y funcional de 8 bits al secuenciar y controlar adecuadamente todos los componentes del sistema a través de un ciclo de búsqueda-decodificación-ejecución-almacenamiento.

Descripción funcional
Operación de máquina de estados
La unidad de control opera como una máquina de estados finitos de 4 estados que cicla a través de:
- FETCH (Búsqueda): Obtener la siguiente instrucción de memoria
- DECODE (Decodificación): Decodificar la instrucción e incrementar el contador de programa
- EXECUTE (Ejecución): Realizar la operación especificada por la instrucción
- STORE (Almacenamiento): Almacenar resultados y actualizar banderas según sea necesario
Entradas y salidas
Entradas (7 pines):
| Pin | Nombre del pin | Tipo | Descripción |
|---|---|---|---|
| 0 | CLK | Entrada | Reloj del sistema para operación síncrona |
| 1 | RST | Entrada | Señal de reinicio para inicializar la unidad de control |
| 2 | OP0 | Entrada | Bit 0 del código de operación del registro de instrucción |
| 3 | OP1 | Entrada | Bit 1 del código de operación del registro de instrucción |
| 4 | OP2 | Entrada | Bit 2 del código de operación del registro de instrucción |
| 5 | OP3 | Entrada | Bit 3 del código de operación del registro de instrucción |
| 6 | Z_FLAG | Entrada | Bandera de cero del registro de banderas para saltos condicionales |
Salidas (18 pines):
| Pin | Nombre del pin | Tipo | Descripción |
|---|---|---|---|
| 0 | PC_INC | Salida | Incrementar contador de programa |
| 1 | PC_LD | Salida | Cargar contador de programa (para saltos) |
| 2 | PC_OE | Salida | Habilitación de salida del contador de programa (al bus de direcciones) |
| 3 | MEM_RD | Salida | Habilitación de lectura de memoria |
| 4 | MEM_WR | Salida | Habilitación de escritura de memoria |
| 5 | RAM_OE | Salida | Habilitación de salida de RAM (al bus de datos) |
| 6 | IR_LD | Salida | Carga del registro de instrucción |
| 7 | IR_ADDR_OE | Salida | Habilitación de salida de dirección del IR (al bus de direcciones) |
| 8 | ALU_OP0 | Salida | Bit 0 del código de operación de la ALU |
| 9 | ALU_OP1 | Salida | Bit 1 del código de operación de la ALU |
| 10 | ALU_OP2 | Salida | Bit 2 del código de operación de la ALU |
| 11 | ALU_OE | Salida | Habilitación de salida de la ALU (al bus de datos) |
| 12 | ACC_LD | Salida | Carga del acumulador |
| 13 | ACC_OE | Salida | Habilitación de salida del acumulador (al bus de datos) |
| 14 | FLG_LD | Salida | Carga del registro de banderas |
| 15 | HALT | Salida | Indicador de detención del sistema |
| 16 | STATE0 | Salida | Bit de estado 0 (LSB de la codificación de estado de 2 bits) |
| 17 | STATE1 | Salida | Bit de estado 1 (MSB de la codificación de estado de 2 bits) |
Codificación de estados (STATE1:STATE0):
00→ FETCH (Búsqueda)01→ DECODE (Decodificación)10→ EXECUTE (Ejecución)11→ STORE (Almacenamiento)
Arquitectura del conjunto de instrucciones
La unidad de control soporta un conjunto de 16 instrucciones con códigos de operación de 4 bits:
| Opcode | Hex | Mnemónico | Descripción | Operación |
|---|---|---|---|---|
| 0000 | 0x0 | NOP | Sin operación | PC ← PC + 1 |
| 0001 | 0x1 | LDA addr | Cargar acumulador | ACC ← M[addr] |
| 0010 | 0x2 | STA addr | Almacenar acumulador | M[addr] ← ACC |
| 0011 | 0x3 | ADD addr | Sumar al acumulador | ACC ← ACC + M[addr] |
| 0100 | 0x4 | SUB addr | Restar del acumulador | ACC ← ACC - M[addr] |
| 0101 | 0x5 | AND addr | AND lógico | ACC ← ACC & M[addr] |
| 0110 | 0x6 | OR addr | OR lógico | ACC ← ACC | M[addr] |
| 0111 | 0x7 | XOR addr | XOR lógico | ACC ← ACC ^ M[addr] |
| 1000 | 0x8 | NOT | NOT lógico | ACC ← ~ACC |
| 1001 | 0x9 | SHL | Desplazamiento a la izquierda | ACC ← ACC << 1 |
| 1010 | 0xA | SHR | Desplazamiento a la derecha | ACC ← ACC >> 1 |
| 1011 | 0xB | JMP addr | Salto incondicional | PC ← addr |
| 1100 | 0xC | JZ addr | Salto si cero | if (Z=1) PC ← addr |
| 1101 | 0xD | JNZ addr | Salto si no cero | if (Z=0) PC ← addr |
| 1110 | 0xE | LDI | Carga inmediata | Reservado para futuro |
| 1111 | 0xF | HLT | Detener | Detener ejecución |
Formato de instrucción
| Posición de bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| Campo | OPCODE (4 bits) | OPERANDO (4 bits) | ||||||
| Descripción | Operación a realizar | Dirección de memoria/Valor |
Arquitectura de microcódigo
Generación de señales de control
La unidad de control usa un enfoque de ROM de microcódigo donde cada instrucción se descompone en micro-operaciones a través de los cuatro estados. Cada combinación de código de operación y estado produce un conjunto específico de señales de control.
Ejemplo: Instrucción LDA (Cargar acumulador)
Estado FETCH:
- PC_OE = 1 (PC controla el bus de direcciones)
- MEM_RD = 1 (Leer instrucción de memoria)
- IR_LD = 1 (Cargar instrucción en IR)
Estado DECODE:
- PC_INC = 1 (Incrementar PC a la siguiente instrucción)
Estado EXECUTE:
- IR_ADDR_OE = 1 (La dirección del IR controla el bus de direcciones)
- MEM_RD = 1 (Leer datos de la dirección de memoria)
Estado STORE:
- RAM_OE = 1 (RAM controla el bus de datos)
- ACC_LD = 1 (Cargar datos en el acumulador)
- FLG_LD = 1 (Actualizar banderas)
Control de bus y gestión de tres estados
La unidad de control gestiona cuidadosamente la contención de bus asegurando que solo un componente controle cada bus en cualquier momento:
- Bus de direcciones: Controlado por PC_OE o IR_ADDR_OE
- Bus de datos: Controlado por RAM_OE, ALU_OE o ACC_OE
Integración con otros componentes
Compatibilidad de componentes
La unidad de control está diseñada para funcionar sin problemas con los componentes existentes de DigiSim:
- ALU de 8 bits: Recibe códigos de operación (ALU_OP0-2) y proporciona resultados con banderas
- Contador de programa: Controlado mediante señales PC_INC, PC_LD y PC_OE
- RAM (256×8): Gestionada mediante señales MEM_RD, MEM_WR y RAM_OE
- Registro de instrucción: Cargado mediante IR_LD y proporciona separación de código de operación/dirección
- Registro de banderas: Actualizado mediante FLG_LD y leído para saltos condicionales (Z_FLAG)
- Acumulador: Controlado mediante señales ACC_LD y ACC_OE
Temporización de señales
La unidad de control asegura tiempos de establecimiento y mantenimiento adecuados para todos los componentes:
- Establecimiento de dirección: Las señales de dirección son estables antes de las operaciones de memoria
- Datos válidos: Los datos son válidos cuando las señales de carga están activas
- Sincronización de reloj: Todos los cambios de estado ocurren en flancos de subida del reloj
- Comportamiento de reinicio: Reinicio asíncrono inmediato a un estado conocido
Ejemplos de uso
Programa simple: Sumar dos números
; Sumar dos números almacenados en memoria
0x0: LDA 0x8 ; Cargar primer número de la dirección 0x8
0x1: ADD 0x9 ; Sumar segundo número de la dirección 0x9
0x2: STA 0xA ; Almacenar resultado en la dirección 0xA
0x3: HLT ; Detener ejecución
...
0x8: 0x05 ; Primer número (5)
0x9: 0x03 ; Segundo número (3)
0xA: 0x00 ; Ubicación del resultado
Ejemplo de bucle: Contar de 1 a 10
; Contar de 0 a 10
0x0: LDA 0x8 ; Cargar contador
0x1: ADD 0x9 ; Sumar 1
0x2: STA 0x8 ; Almacenar contador
0x3: SUB 0xA ; Restar 10
0x4: JNZ 0x0 ; Saltar atrás si no es cero
0x5: HLT ; Detener cuando termine
...
0x8: 0x00 ; Contador
0x9: 0x01 ; Constante 1
0xA: 0x0A ; Constante 10
Notas técnicas
Requisitos de reloj
- Frecuencia mínima: 1 Hz para observación educativa
- Frecuencia máxima: Limitada por los retardos de propagación de los componentes
- Ciclo de trabajo: 50% recomendado para márgenes de temporización óptimos
Comportamiento de reinicio
- Reinicio asíncrono: Establece inmediatamente el estado a FETCH
- Borrado de señales: Todas las señales de control se reinician al estado inactivo
- Recuperación de detención: Requiere reinicio para reanudar la ejecución
Rendimiento
- Todas las instrucciones: 4 ciclos de reloj (búsqueda-decodificación-ejecución-almacenamiento)
- Instrucciones por segundo: Frecuencia de reloj ÷ 4
- Ancho de banda de memoria: Una lectura o escritura por ciclo de instrucción