Seminarios VHDL
Seminarios VHDL
Seminarios VHDL
Arquitectura y tecnologa de Computadores (Informtica) Fundamentos de Computadores (Teleco) Juan Gonzlez (juan.gonzalez@uam.es)
VHDL
Simular
0 ns 10 ns 20 ns
Sintetizar
A B S
Comprobar que tienen la funcionalidad deseada Crear un circuito que funciona como el modelo FPGAs EDCD (Informtica,3) DCSE (Teleco, 4)
SISTEMAS DIGITALES
Microprocesador
MUX
ALU
DECOD
REG
CONT
MEM
AUT
Circuitos Combinacionales
Circuitos Secuenciales
Puertas lgicas
Biestables
VHDL: HW + ALGORITMOS
Con VHDL modelamos el HARDWARE Pero VHDL permite tambin programar ALGORITMOS (Software)
Pensamos en HW
Banco de pruebas
En 1987 el trabajo fue cedido al IEEE, y a partir de ese momento es un estndar abierto.
VHDL: Evolucin
1980: El departamento de defensa de los EEUU funda el proyecto para crear un HDL estndar dentro del programa VHSIC 1981: Woods Hole Workshop, reunin inicial entre el Gobierno, Universidades e Industria 1983: Se concedi a Intermetrics, IBM y Texas Instruments el contrato para desarrollar VHDL 1985: Versin 7.2 de dominio pblico. 1987: El IEEE lo ratifica como su estndar 1076 (VHDL-87) 1993: El lenguaje VHDL fue revisado y ampliado, pasando a ser estndar 1076 93 (VHDL-93) 2000: ltima modificacin de VHDL
La entidad y la arquitectura
Tipos de datos Los procesos Circuitos combinacionales Circuitos secuenciales Mquinas de estados Triestados Diseo jerrquico Estilos de diseo Verificacin con testbenches
VHDL
Entidad y arquitectura Una unidad hardware se visualiza como una caja negra
El interfaz de la caja negra esta completamente definida. El interior esta oculto.
IN
OUT
Una seal que sale fuera de la seal y no es usada internamente. La seal no puede ser leda dentro de la entidad.
INOUT
MODO
TIPO rst
mi_componente
d[7:0] clk
q[7:0]
Nombre de la entidad
Parte declarativa
begin
Cuerpo
Nombre de la arquitectura
end test;
15
Tipos de datos
VHDL
Los procesos Circuitos combinacionales Circuitos secuenciales Mquinas de estados Triestados Diseo jerrquico Estilos de diseo Verificacin con testbenches
tipos
TIPO es la definicin de los valores posibles que puede tomar un objeto Los tipos predefinidos son:
Escalares: integer floating point enumerated physical Compuestos: array record Punteros: access Archivos: file
file
access
escalares
compuestos real
entero fsico
array record
enumerados
ENUMERATED: Enumeracin
Conjunto de valores definido por el usuario Por ejemplo: TYPE estados IS (inicio, lento, rapido)
LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY mi_componente IS PORT ( clk, rst: IN std_logic; d: IN std_logic_vector(7 DOWNTO 0); q: OUT std_logic_vector(7 DOWNTO 0)); END mi_componente;
mi_componente
Ejemplo de uso:
Definimos una variable de tipo unsigned, para implementar un contador:
VARIABLE contador: unsigned(7 downto 0);
Incrementamos la variable en 1:
contador:=contador + 1;
Uso:
mi_maquina<=INACTIVO;
Uso:
mi_memoria(0)<=xAA;
Relacionales
= /= < <= > >= igual distinto menor menor o igual mayor mayor o igual
Multiplicativos
* / rem mod
Signo (unarios)
+,
Miscelneos
abs valor absoluto ** exponenciacin not negacin (unario)
Ms sobre operadores
No todos los operadores estn definidos para todos los tipos El operador de concatenacin se utiliza muy a menudo
signal a: std_logic_vector( 3 downto 0); signal b: std_logic_vector( 3 downto 0); signal c: std_logic_vector( 7 downto 0); a <= "0011"; b <= "1010"; c <= a & b; -- c ="00111010"
Las funciones shift_right() y shift_left() permiten hacer desplazamientos, pero solo para los tipos unsigned y signed
signal a: signal b: unsigned( 3 downto 0); unsigned( 3 downto 0);
Los procesos
VHDL
Circuitos combinacionales Circuitos secuenciales Mquinas de estados Triestados Diseo jerrquico Estilos de diseo Verificacin con testbenches
begin
En el cuerpo de la arquitectura se modela el comportamiento del circuito con asignaciones, instanciaciones y PROCESOS
end UAM;
process(lista de seales) ... parte declarativa (variables, procedimientos, tipos, etc) ... begin ... instrucciones que describen el comportamiento ... end process;
A B
La lista de sensibilidad tiene las seales A, B porque cualquier cambio en las entradas puede variar el estado de la puerta
process(A,B) begin if A='1' and B='1' then S <= '1'; else S <= '0'; Se usa un if..then..else end if; para describir la puerta end process;
Este HW no se puede modelar en un lenguaje secuencial como C: S = A & B; Q = C | D; Ambas puertas funcionan al mismo tiempo, no una antes de la otra!
De esta manera la aunque una instruccin se ejecuta despus de la otra, como las dos se evalan en el mismo instante, desde el punto de vista de la modelizacin del circuito ambas puertas estn funcionando simultneamente Esta es la solucin por la que opta VHDL (y Verilog)
Necesidad de la concurrencia
Sin embargo, esta solucin ya no vale con este circuito: A B C S Q S <= A and B;
!Q no toma el valor correcto porque no se da tiempo para que se actualize S!
Q <= S or C; Por qu? No hay que olvidar que se trata de modelizar circuitos reales, no virtuales, y las seales necesitan que transcurra el tiempo para tomar un valor:
La solucin de VHDL
VHDL (y en general, todos los HDLs) solucionan este problema dando soporte explicito a la concurrencia En VHDL, una arquitectura puede tener tantos procesos como queramos, y todos se ejecutan concurrentemente
architecture ... ... begin process(...) ... end process; process(...) ... end process; end ...;
A B C
S Q
process(C,S) begin if C='1' then Q <= '1'; else Q <= S; end if; end process; end uam;
t0
t1
t2
Procesos: Recapitulando
Los procesos se disparan (su cdigo se ejecuta) cuando cambia alguna de las seales en su lista de sensibilidad Las instrucciones dentro del proceso se ejecutan secuencialmente, una detrs de otra, pero sin dar lugar a que avance el tiempo durante su ejecucin El tiempo slo avanza cuando se llega al final del proceso Las seales modelan hilos del circuito, y como tales, slo pueden cambiar de valor si se deja que avance el tiempo Una arquitectura puede tener tantos procesos como queramos, y todos se van a ejecutar en paralelo Esta es la manera que tiene VHDL de expresar la concurrencia inherente al hardware
IF condicion_1 THEN ... secuencia de instrucciones 1 ... ELSIF condicion_2 THEN ... secuencia de instrucciones 2 ... ELSIF condicion_3 THEN ... secuencia de instrucciones 1 ... ELSE ... instrucciones por defecto ... END IF;
A B S
CASE expresion IS WHEN caso_1 => ... secuencia de instrucciones 1 ... WHEN caso_2 => ... secuencia de instrucciones 2 ... WHEN OTHERS => ... instrucciones por defecto ... END CASE;
alu : process (op1, op2, cmd) is begin case cmd is when "00" => res <= op1 + op2; when "01" => res <= op1 op2; when "10" => res <= op1 and op2; when "11" => res <= op1 or op2; when others => res <= "XXXXXXXX"; end case; end process alu;
op1
res
op2 cmd
Ejemplo: Decodificador de 3 a 8
paraleliza
architecture uam of buscar is begin busca: process(valor) begin encontrado <= '0'; pos := 0; while valor /= tabla(pos) or pos < 100 loop pos := pos + 1; end loop; if pos < 100 then encontrado <= '1'; end if; Aqu tambin se end process; paraleliza el bucle end architecture uam;
process(lista de seales) ... begin ... instrucciones secuenciales ... end process;
El proceso se dispara inmediatamente
Las instrucciones se ejecutan hasta que se llega al wait, y en ese punto se suspende el proceso
process ... begin ... instrucciones secuenciales ... wait... ... instrucciones secuenciales ... end process;
Las variables
A la hora de modelar un circuito nos puede venir bien un tener un objeto cuyo valor se actualice inmediatamente
sin tener que esperar a que avance el tiempo, como en las seales
El problema de la actualizacin de la seal S tiene muy fcil solucin con una variable
architecture uam of ejemplo is ... begin process(A,B,C) variable S : std_logic; begin S := A and B; if C='1' then Q <= '1'; else Q <= S; end if; end process; end uam;
A B C
S Q
Utilidad
Visibilidad
Comportamiento
49
VHDL
Circuitos combinacionales
Circuitos secuenciales Mquinas de estados Triestados Diseo jerrquico Estilos de diseo Verificacin con testbenches
A B Sel
EFECTOS
En un proceso, si el valor futuro de una seal no puede ser determinado, se mantiene el valor actual. Se sintetiza un latch para mantener su estado actual
VENTAJAS
Simplifica la creacion de elementos de memoria
DESVENTAJAS
Pueden generarse latches no deseados,p.ej. cuando todas las opciones de una sentencia condicional no estn especificadas
A 00 01 10 11
S 1 1 0 don't care
Solucin es incorrecta, por no poner el caso "11" no significa "don't care", simplemente est guardando el valor anterior, est generando un latch
"100" => key <= first; "010" => key <= second; "001" => key <= third; OTHERS => key <= none;
Asignaciones concurrentes
Las asignaciones concurrentes son asignaciones de valores a seales, fuera de proceso, que permiten modelar de una manera muy compacta lgica combinacional
Funcionan como procesos (son procesos implcitos) y se ejecutan concurrentemente con el resto de procesos y asignaciones
Se pueden utilizar todos los operadores que queramos, tanto los predefinidos como los que importemos de las libreras
Por su ejecucin en cascada es similar al IF..THEN..ELSE Pueden generarse problemas de memoria implcita si no se pone el ltimo else
Por su ejecucin en paralelo (balanceada) es similar a un CASE Se pueden dar problemas de memoria implcita si no se pone el ltimo when others
VHDL
Circuitos secuenciales
Mquinas de estados Triestados Diseo jerrquico Estilos de diseo Verificacin con testbenches
process (clk) begin if clk'event and clk='1' then q <= d; end if; cambia el reloj y end process;
es ahora 1 ... hay un flanco de subida
Otro circuito fundamental. El reset debe estar en la lista de sensibilidad porque es asncrono, tiene efecto independientemente del reloj. En los circuitos secuenciales, la lista de sensibilidad debe estar compuesta como mucho por el reloj y el reset (si es asncrono).
CLK
begin if rst='1' then q_temp:="00000000"; elsif rising_edge(clk) then if ce='1' then if load='1' then q_temp:=din; else q_temp:=q_temp(6 downto 0) & sin; end if; end if; end if; q<=q_temp; end process;
Lgica Comb.
EstFuturo registro
Estado
Utilizacin de subtipos:
Definicion de Estados
architecture uam of ejemplo is type t_estado is (E0, E1, E2, E3); signal Estado, EstFuturo : t_estado; signal in1, in2, in3 : std_logic; signal out1, out2 : std_logic; signal CK, reset : std_logic; ...
Utilizacin de subtipos:
Definicion de Estados
Utilizacin de subtipos:
Definicion de Estados
registro: process(reset,clk) begin if reset='1' then Estado <= E0; elsif rising_edge(clk)then Estado <= EstFuturo; end if; end process registro;
VHDL
Mquinas de estados
Triestados Diseo jerrquico Estilos de diseo Verificacin con testbenches
69
70
Entradas
Registros de estado
Lgica de salida
Salidas
71
Entradas
Registros de estado
Estado actual
Lgica de salida
Registros de salida
Salidas
72
Nota: Los dos bits del estado son utilizados como salida
Entradas
Registros de estado
Salidas
73
PWAIT
ACK 10
retry_out='1'
74
LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY maq IS PORT ( clock, reset: IN std_logic; req, pwait: IN std_logic; retry_out, ack_out: OUT std_logic); END maq;
75
Ejemplo: Solucin 1
Salidas combinacionales decodificadas a partir de los estados
ARCHITECTURE archmoore1 OF maq IS TYPE fsm_states IS (idle, retry, ack); SIGNAL wait_gen : fsm_states; BEGIN fsm: PROCESS (clock, reset) BEGIN IF reset = '1' THEN wait_gen <= idle; -- asynchronous reset ELSIF clock'EVENT AND clock = '1' THEN CASE wait_gen IS WHEN idle => IF req = '0' THEN wait_gen <= retry; ELSE wait_gen <= idle; END IF;
76
77
Ejemplo: Solucion 2
Salidas registradas decodificadas desde el valor de los estados
ARCHITECTURE archmoore2 OF maq IS TYPE fsm_states IS (idle, retry, ack); SIGNAL wait_gen: fsm_states; BEGIN fsm: PROCESS (clock, reset) BEGIN IF reset = '1' THEN wait_gen <= idle; retry_out <= '0'; ack_out <= '0'; ELSIF clock'EVENT AND clock = '1' THEN retry_out <= '0'; -- asignacion por defecto
78
WHEN retry
=>
WHEN ack
=>
WHEN OTHERS => END CASE; END IF; END PROCESS fsm; END archmoore2;
79
Ejemplo: Solucin 3
Salidas codificadas en el valor de los estados
ARCHITECTURE archmoore3 OF maq IS SIGNAL wait_gen: CONSTANT idle: CONSTANT retry: CONSTANT ack: BEGIN fsm: PROCESS (clock, reset) BEGIN IF reset = '1' THEN wait_gen <= idle; ELSIF clock'EVENT AND clock = '1' THEN std_logic_vector(1 std_logic_vector(1 std_logic_vector(1 std_logic_vector(1 DOWNTO DOWNTO DOWNTO DOWNTO 0); 0) := "00"; 0) := "01"; 0) := "10";
80
81
En CPLDs
reduce el nmero de trminos producto eliminando, si los hubiera, expasiones de productos, y mejorando por tanto la velocidad pero usa muchas ms macroceldas, y el beneficio nunca es tan evidente como en FPGAs
82
83
WHEN ack
=>
WHEN OTHERS => END CASE; END IF; END PROCESS fsm;
-- Decodificacion de salidas retry_out <= '1' WHEN (wait_gen = retry) ELSE '0'; ack_out <= '1' WHEN (wait_gen = ack) ELSE '0'; END archmoore4;
84
Codificacin One-Hot
Logica de siguiente estado mas sencilla Mejora la velocidad Necesita mas registros
85
FSM de Mealy
Las salidas cambian por un cambio de estado o por un cambio en el valor de las entradas
Hay que tener mucho cuidado con las entradas asncronas
Registros de estado
Entradas
Lgica
Salidas
86
1X/00 X1/10
87
Ejemplo: Solucin
ARCHITECTURE archmealy1 OF maq IS TYPE fsm_states IS (idle, retry); SIGNAL wait_gen: fsm_states; BEGIN fsm: PROCESS (clock, reset) BEGIN IF reset = '1' THEN wait_gen <= idle; ELSIF clock'EVENT AND clock = '1' THEN CASE wait_gen IS WHEN idle => IF req = '0' THEN wait_gen <= retry; ELSE wait_gen <= idle; END IF; WHEN retry => IF pwait = '1' THEN wait_gen <= idle; ELSE wait_gen <= retry; END IF; WHEN OTHERS => wait_gen <= idle; END CASE; END IF; END PROCESS fsm; retry_out <= '1' WHEN (wait_gen = retry AND pwait='0') OR (wait_gen = idle AND req='0') ELSE '0'; ack_out <= '1' WHEN (wait_gen = retry AND pwait='1') ELSE '0'; END archmealy1;
88
VHDL
Triestados
Diseo jerrquico Estilos de diseo Verificacin con testbenches
89
PROCESS(in1) BEGIN senal <= in1; END PROCESS; senal <= in2;
90
Inferencia de triestado
Cuando se quiere que un driver de una seal se quede en alta impedancia, se le asigna a la seal el valor 'Z'
Slo vale si para el tipo std_logic
Igual que ocurre en la realidad, el estado de la seal lo fijar el driver que no est en alta impedancia
'0'
senal <= in1 WHEN ena='1' ELSE 'Z'; PROCESS(in1) BEGIN senal <= '0'; END PROCESS;
in1
'0'
'0'
91
Con un proceso:
PROCESS (ena_a, a) BEGIN IF (sel_a = '0') THEN t <= a; ELSE t <= 'Z'; END PROCESS;
92
Seales bidireccionales
En este caso la seal tiene drivers externos, fuera de la entidad
ENTITY bufoe IS PORT ( x: IN std_logic; oe: IN std_logic; y: INOUT std_logic; yfb: OUT std_logic); END bufoe; ARCHITECTURE simple OF bufoe IS BEGIN y <= x WHEN oe='1' ELSE 'Z'; yfb <= y; END simple;
oe x yfb y
93
REG
8
DATA
8
LOAD
CLOCK OE
ENTITY ejbidir IS PORT ( load,clock,oe: IN std_logic; data: INOUT std_logic); END ejbidir; ARCHITECTURE simple OF ejbidir IS SIGNAL reg: std_logic_vector(7 downto 0); BEGIN data<=reg WHEN oe='1' ELSE "ZZZZZZZZZ"; PROCESS(clk) BEGIN IF rising_edge(clk) THEN reg<=data; END IF; END PROCESS; END simple;
VHDL
Diseo jerrquico
Estilos de diseo Verificacin con testbenches
Diseo jerrquico
Componentes pequeos son utilizados como elementos de otros ms grandes Permite reutilizar cdigo Diseos ms legibles y portables
a2.vhd
b.vhd
c.vhd
rbol de jerarquas
top.vhd
a.vhd
b.vhd
c.vhd
a1.vhd
a2.vhd
COMPONENTES INFERIORES
AT
XT
ENTITY Top IS PORT ( AT: IN std_logic; XT: OUT std_logic); END Top;
AT A X
XT
mi_comp
mi_comp
AT A C1 X
XT
C2
Begin C1:mi_comp PORT MAP (A=>AT, X=>S) C2:mi_comp PORT MAP (A=>S, X=>XT) END test;
VHDL
Pasos de la simulacin
Archivos VHDL
Bancos de pruebas
Hay que hacer un banco de pruebas (testbench) para cada componente diseado. La simulacin de un componente consiste en:
Generar unos estmulos Observar los resultados Pensamos en SW Algoritmos de pruebas Mi diseo hardware
Pensamos en HW
Banco de pruebas
Mi diseo hardware
Resultados
Banco de pruebas
Mi diseo hardware
Resultados
Banco de pruebas
Generando estmulos
El proceso de pruebas generar estmulos de manera secuencial Se asignan valores a las entradas Se espera un tiempo a obtener la respuesta Ej. Sumador de 8 bits
A <= x03; B <= x02; WAIT FOR 20 ns; A<= xAA; B<= x20; WAIT FOR 30 ns;
A B
Dar valores a las entradas del sumador Esperar un tiempo (el proceso se suspende)
ASSERT (resultado=esperado)
WAIT FOR
process begin A A <= x01; B <= x01; B WAIT FOR 10 ns; ASSERT X = x02 REPORT Falla SEVERITY FAILURE; A<= xFF; B<= x01; WAIT FOR 10 ns; ASSERT X = x00 REPORT Falla SEVERITY FAILURE; WAIT; end process;
Elementos: cA
Proceso de pruebas
A X B cX
cB
Entidad top-level: sumador_tb Componente a probar: sumador Proceso de pruebas Cable cA Cable cB Cable cX
Signal cA : std_logic_vector(7 downto 0); Signal cB : std_logic_vector(7 downto 0); Signal cX : std_logic_vector(7 downto 0); Begin --Cuerpo: en la pgina siguiente :-) END test;
process begin for i in 1 to 255 loop for j in 1 to 255 loop cA <= std_logic_vector(to_unsigned(i,8)); cB <= std_logic_vector(to_unsigned(j,8)); WAIT FOR 10 ns; ASSERT cX = std_logic_vector(to_unsigned(i+j,8)) REPORT Falla SEVERITY FAILURE; end loop; end loop; end process;
VHDL