Wednesday, February 17, 2010

AHDL: Introducción

AHDL es un lenguaje de descripción hardware de alto nivel (propio de Altera) , diseñado para diseñar lógica combinacional compleja, tablas de verdad y diagramas de estados. Yo soy más de VHDL o Verilog, pero como AHDL le interesa a mi hermano, pues a continuación va un breve resumen:
Antes que nada, tenemos que saber que AHDL es un lenguaje concurrente, es decir, todo lo que se evalúa en la sección lógica (la lógica a ejecutar) se evalúa al mismo tiempo.
El lenguaje AHDL ofrece la posibilidad de integrar varias secciones distintas dentro de un mismo código. Están las secciones imprescindibles como la sección de subdiseño (se describen los puertos de entrada/salida y sus nombres) y la sección lógica (operaciones), y luego las opcionales como la declaración de constantes, de funciones, de variables, etcétera.


En primer lugar, declararemos las entradas/salidas en el apartado de subdesign:
SUBDESIGN comb1
{
     a0, a1    :INPUT;      %declaramos los pines de entrada%
     a2[7..0] :INPUT;      %entrada de 8 bits%
     s0, s1    :OUTPUT;  %declaramos los pines de salida%
     s2[15..0] :OUTPUT;  %salida16 bits%
     b0         :BIDIR;       %pines bidireccionales
}
Una vez hecho esto, podemos declarar constantes:
CONSTANT IO_ADDRESS=H"FF30"; %H" especifica valor en hexadecimal %
CONSTANTIO_ADDRESS=B"0010"; %B" especifica valor en binario%
Agrupar variables:
{
    a2[7..0]=s2[15..8]; %el bit 7 de a2 se asocia al bit 15 de s2, el 6 al 14, etc%
    a2[2..0]=inter; %asociamos los bits 2,1 y 0 de a2 a la variable inter
}
Poner opciones:
OPTIONS
    bit0=MSB; %asociamos el bit más significativo a bit0%
    bit0=LSB; %asociamos el bit menos significativo a bit0%
Y añadir nodos (variables intermedias)
VARIABLE
   Inter: NODE; %definimos variable para uso interno%
Una vez hecho esto, podemos pasar a la sección lógica:
BEGIN
     ..Instrucciones
END;
Las instrucciones pueden ser puertas lógicas: s0=a1&a2; %and% , s0=a1#a2; %or% , s0=!a1 %not%, etc..
Condicionales: IF .... ELSIF... ENDIF;
De selección: CASE a2[] IS
                                  WHEN B"00000010" => s1=1; %por ejemplo%
                                  ....
                     END CASE;
O también tablas de verdad:
TABLE
    %bits entrada=> bits salida%
     a2[]              => b2[];
     B"0000001" => B"1111111111111111";
     B"0000010" => B"1100000011111111"; %según tabla de verdad a implementar%
    ....
ENDTABLE;
Y a continuación, os dejo un ejemplo de una máquina de dos estados (s0 y s1), que es un sumador módulo 2
SUBDESIGN estados
{
     clock, reset, in    :INPUT;
     out                     :OUTPUT;
}
VARIABLE
   ss = MACHINE WITH STATES (s0, s1, s2, s3) %máquina de estados%
BEGIN
  ss.clock=clock;
  ss.reset=reset;
TABLE
  ss,    in  => ss,     out   %estado actual, entrada => siguiente estado, salida
  s0,   0   => s0,     0     %0 + 0 = 0 (devuelvo 0 y me quedo en el estado 0)
  s0,   1  =>  s1,     1     %0 + 1= 1 (devuelvo 1 y paso al estado 1)
  s1,   0  =>  s1,     0     %1 + 0= 1 (devuelvo 1 y el contador sigue a 1)
  s1,   1  =>  s1,     1     %1 + 1= 0 (devuelvo 0 y paso al estado 0)
ENDTABLE;
END;

1 comment:

  1. Muy buen post! explicacion corta y practica.
    No hay se encuentra mucho de este material asi.
    ojala haya mas... Saludos

    ReplyDelete