Arquitectura y Simulación de un Sistema de Cerradura Digital usando VHDL

Fundamentos de VHDL en el Diseño de Hardware

VHDL (VHSIC Hardware Description Language) es un lenguaje estándar utilizado para modelar, simular y sintetizar circuitos digitales. A diferencia de los lenguajes de software tradicionales, VHDL describe la concurrencia y el flujo de datos a nivel de hardware, permitiendo a los ingenieros definir la arquitectura de sistemas complejos como FPGAs y ASICs. Su estructura se basa en entidades (interfaces) y arquitecturas (implementación interna), facilitando un diseño jerárquico y modular.

Diseño Arquitectónico de la Cerradura Electrónica

Un sistema de cierre digital seguro requiere una integración robusta de múltiples subsistemas. La arquitectura general se segmenta en los siguientes bloques funcionales:

  • Interfaz de Entrada: Captura y acondiciona las señales físicas de los pulsadores o teclados matriciales.
  • Motor de Validación: Ejecuta algoritmos de comparación y desenmascaramiento de credenciales.
  • Monitor de Seguridad: Rastrea intentos fallidos y gestiona los protocolos de bloqueo.
  • Controlador FSM: Orquesta las transiciones de estado globales del sistema.

Los requisitos de diseño exigen latencias mínimas en la rsepuesta del actuador, inmunidad al ruido eléctrico en las entradas y resistencia ante ataques de fuerza bruta mediante el bloqueo temporal del sistema.

Implementación de Subsistemas Críticos

Acondicionamiento de Señales y Antirrebote

Las señales provenientes de interruptores mecánicos presentan rebotes (bouncing) que pueden interpretarse como múltiples pulsaciones. Para mitigar esto, se implementa un filtro digital basado en un contador de estabilidad dentro de una máquina de estados.

type estado_filtro is (REPOSO, MUESTREO, VALIDO);
signal estado_actual, estado_siguiente : estado_filtro;
signal contador_tiempo : integer range 0 to 50000 := 0; -- Ajustado para ~1ms a 50MHz

process(clk_sys)
begin
    if rising_edge(clk_sys) then
        estado_actual <= estado_siguiente;
        case estado_actual is
            when REPOSO =>
                if señal_bruta = '1' then
                    estado_siguiente <= MUESTREO;
                    contador_tiempo <= 0;
                else
                    estado_siguiente <= REPOSO;
                end if;
            when MUESTREO =>
                if señal_bruta = '0' then
                    estado_siguiente <= REPOSO;
                elsif contador_tiempo = 50000 then
                    estado_siguiente <= VALIDO;
                else
                    contador_tiempo <= contador_tiempo + 1;
                    estado_siguiente <= MUESTREO;
                end if;
            when VALIDO =>
                if señal_bruta = '0' then
                    estado_siguiente <= REPOSO;
                else
                    estado_siguiente <= VALIDO;
                end if;
        end case;
    end if;
end process;

Ofuscación y Comparación de Credenciales

Almacenar claves en texto plano en la memoria del FPGA es una vulnerabilidad. Se aplica una ofuscación ligera mediante operaciones lógicas bitwise antes de la comparación, utilizando asignaciones concurrentes para optimizar los recursos de lógica combinacional.

signal clave_cifrada : std_logic_vector(15 downto 0) := x"B4E2";
signal entrada_teclado : std_logic_vector(15 downto 0);
signal clave_procesada : std_logic_vector(15 downto 0);
signal acceso_autorizado : std_logic;

-- Desenmascaramiento mediante XOR
clave_procesada <= entrada_teclado xor x"5A5A"; 

-- Evaluación concurrente de igualdad
acceso_autorizado <= '1' when clave_procesada = clave_cifrada else '0';

Gestión de Intentos Fallidos

Para prevenir la enumeración de claves, se despliega un contador que monitoriza las autenticaciones erróneas. Al superar un umbral predefinido, el sistema activa una señal de bloqueo hardware.

signal intentos_erroneos : integer range 0 to 4 := 0;
constant LIMITE_BLOQUEO : integer := 4;
signal bloqueo_activo : std_logic := '0';

process(clk_sys, rst_n)
begin
    if rst_n = '0' then
        intentos_erroneos <= 0;
        bloqueo_activo <= '0';
    elsif rising_edge(clk_sys) then
        if acceso_autorizado = '1' then
            intentos_erroneos <= 0;
            bloqueo_activo <= '0';
        elsif pulso_validacion = '1' and acceso_autorizado = '0' then
            if intentos_erroneos < LIMITE_BLOQUEO then
                intentos_erroneos <= intentos_erroneos + 1;
            else
                bloqueo_activo <= '1';
            end if;
        end if;
    end if;
end process;

Máquina de Estados Finitos (FSM) y Sincronización

Lógica de Transición de Estados

El comportamiento secuencial global se dicta mediante una FSM de dos procesos, separando la lógica de transición de la actualización de estado para evitar inferencias de latches y mejorar la frecuencia máxima de operación (Fmax).

type t_estado_sistema is (S_IDLE, S_EVAL, S_UNLOCK, S_LOCKOUT);
signal estado_presente, estado_futuro : t_estado_sistema;

process(clk_sys, rst_n)
begin
    if rst_n = '0' then
        estado_presente <= S_IDLE;
    elsif rising_edge(clk_sys) then
        estado_presente <= estado_futuro;
    end if;
end process;

process(estado_presente, inicio_ingreso, acceso_autorizado, bloqueo_activo)
begin
    estado_futuro <= estado_presente;
    case estado_presente is
        when S_IDLE =>
            if inicio_ingreso = '1' then
                estado_futuro <= S_EVAL;
            end if;
        when S_EVAL =>
            if bloqueo_activo = '1' then
                estado_futuro <= S_LOCKOUT;
            elsif acceso_autorizado = '1' then
                estado_futuro <= S_UNLOCK;
            else
                estado_futuro <= S_IDLE;
            end if;
        when S_UNLOCK =>
            estado_futuro <= S_IDLE;
        when S_LOCKOUT =>
            estado_futuro <= S_IDLE; -- Retorno tras temporizador externo
    end case;
end process;

Metaestabilidad y Sincronización de Entradas

Las señales asíncronas externas deben pasar por una cadena de flip-flops para prevenir la metaestabilidad. Este proceso asegura que las señales se alineen con el dominio de reloj del sistema.

signal ff_sync1, ff_sync2 : std_logic;

process(clk_sys)
begin
    if rising_edge(clk_sys) then
        ff_sync1 <= entrada_asincrona;
        ff_sync2 <= ff_sync1;
    end if;
end process;
-- ff_sync2 es la señal segura para usar en la lógica interna

Paradigmas de Código y Estructuras Generativas

Concurrencia vs. Secuencialidad

En VHDL, las asignaciones a señales dentro de un process son secuenciales desde la perspectiva de la ejecución del código, pero los procesos en sí mismos operan de manera concurrente. Por el contrario, las variables (variable) se actualizan instantáneamente y su alcance está restringido al proceso donde se declaran, siendo útiles para algoritmos complejos o cálculos intermedios.

Instanciación Paramétrica con Generate

Las sentencias generate permiten escalar el hardware dinámicamente durante la fase de elaboración, evitando la duplicación manual de código para buses o bancos de memoria.

gen_registros: for i in 0 to 3 generate
    signal buffer_local : std_logic_vector(7 downto 0);
begin
    process(clk_sys)
    begin
        if rising_edge(clk_sys) then
            if enable_bus(i) = '1' then
                buffer_local <= data_bus(8*(i+1)-1 downto 8*i);
            end if;
        end if;
    end process;
end generate;

Entorno de Verificación y Testbench

La validación del diseño requiere un entorno de simulación (Testbench) que no es sintetizable. Este entorno debe instanciar el Diseño Bajo Prueba (DUT) y generar estímulos que cubran tanto el flujo nominal como las condiciones de borde.

Un testbench robusto para este sistema debe incluir:

  • Generación de un reloj de referencia con un periodo definido.
  • Secuencias de inyección de claves correctas e incorrectas para validar la FSM y el contador de errores.
  • Modelado de ruido en las entradas para verificar la eficacia del filtro antirrebote.
  • Aserciones (assert) automáticas que comparen las salidas del DUT con los valores esperados en cada ciclo de reloj.

El análisis de formas de onda en herramientas como ModelSim o GHDL permite identificar violaciones de setup/hold y condiciones de carrera. Asimismo, las métricas de cobertura de código aseguran que todas las ramas de la FSM y las condiciones de los multiplexores hayan sido evaluadas durante la simulación, garantizando la fiabilidad del hardware antes de su síntesis final.

Etiquetas: VHDL FPGA Digital Design FSM Testbench

Publicado el 7-24 06:03