Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Seminarios VHDL PDF
Seminarios VHDL PDF
Introduccin
La entidad y la arquitectura
Tipos de datos
Los procesos
Circuitos combinacionales
Simular Sintetizar
0 ns 10 ns 20 ns
A
B
S
Microprocesador
Circuitos Circuitos
Combinacionales Secuenciales
Pensamos
en SW Pensamos
Mi diseo en HW
hardware
Algoritmos
de
pruebas
Banco de pruebas
VHDL: orgenes e historia
Introduccin
La entidad y la arquitectura
Tipos de datos
Los procesos
Circuitos combinacionales
MODO
TIPO mi_componente
rst
d[7:0] q[7:0]
clk
Estructura de un diseo VHDL
library ieee;
use ieee.std_logic_1164.all;
entity mi_componente is
port (
Declaraciones del
puerto ); Nombre de la entidad
end mi_componente;
Parte declarativa
begin
Nombre de la arquitectura
Cuerpo
end test;
Resumen: Entidad y Arquitecturas
Introduccin
La entidad y la arquitectura
Tipos de datos
Los procesos
Circuitos combinacionales
fsico
ENUMERATED: Enumeracin
Conjunto de valores definido por el usuario
Por ejemplo: TYPE estados IS (inicio, lento, rapido)
Tipos STD_LOGIC y STD_LOGIC_VECTOR
mi_componente
rst
d[7:0] q[7:0]
clk
Asignacin de seales en buses
Notacin:
1 bit : comilla simple (')
multiples bits: comilla doble (")
Tipos SIGNED y UNSIGNED
Las operaciones aritmticas estndares slo estn
definidas para los tipos signed y unsigned
Son similares a std_logic_vector.
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;
Conversiones de tipos (I)
VHDL es un lenguaje FUERTEMENTE TIPADO
std_logic_signed,
std_logic_unsigned, Si se quiere hacer un cdigo
VHDL portable, conviene
std_logic_arith
no usarlas
Conversiones de tipos (II)
Usaremos estos objetos como ejemplo:
stdv<=std_logic_vector(uns);
stdv<=std_logic_vector(sig);
uns := unsigned(stdv);
sig := signed(stdv);
Conversiones de tipos (III)
uns := to_unsigned(entero,8);
sig := to_signed(entero,8);
entero := to_integer(unsigned(stdv));
Definicin y uso de nuevos tipos
Las definiciones de tipos se deben hacer en la parte declarativa
de la arquitectura
Ejemplo 1. Definicin de un tipo como una enumeracin para
usarlo en un autmata:
TYPE estados IS (INACTIVO, OPERANDO, FINALIZAR);
SIGNAL mi_maquina : estados;
Uso: mi_maquina<=INACTIVO;
Uso: mi_memoria(0)<=xAA;
Operadores definidos en VHDL
Lgicos Adicin
and + suma
or, nor resta
xor, xnor & concatenacin de vectores
Relacionales Multiplicativos
= igual * multiplicacin
/= distinto / divisin
< menor rem resto
<= menor o igual mod mdulo
> mayor Signo (unarios)
>= mayor o igual +,
Miscelneos Desplazamiento (signed y
unsigned)
abs valor absoluto
shift_right, shift_left
** exponenciacin
not negacin (unario)
Ms sobre operadores
a <= "0011";
b <= shift_left(a,1); -- b ="0110"
b <= shift_right(a,1); -- b ="0001"
Lenguaje de Descripcin Hardware VHDL
Introduccin
La entidad y la arquitectura
Tipos de datos
Los procesos
Circuitos combinacionales
begin
En el cuerpo de la arquitectura
se modela el comportamiento
del circuito con asignaciones,
instanciaciones y PROCESOS
end UAM;
El proceso: el elemento de diseo principal
process(lista de seales)
...
parte declarativa (variables, procedimientos, tipos, etc)
...
begin
...
instrucciones que describen el comportamiento
...
end process;
Ejemplo: Descripcin de una puerta AND
A
S La lista de sensibilidad tiene
B 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
El proceso
no declara
S <= '1';
nada else
S <= '0';
end if; Se usa un if..then..else
end process; para describir la puerta
El problema de la concurrencia del HW
El HW es inherentemente concurrente,
los circuitos coexisten fsicamente en el tiempo
A
S
B Este HW no se puede modelar
en un lenguaje secuencial
C como C:
Q
D
S = A & B;
El chip tiene dos puertas que Q = C | D;
funcionan simultneamente
Ambas puertas funcionan al
mismo tiempo, no una antes
de la otra!
Concurrencia: Una posible solucin
A
S
B S <= A and B;
C Q <= C or D;
Q
D
A S !Q no toma el
valor correcto
B Q porque no se da
C tiempo para
S <= A and B; que se
Q <= S or C; actualize S!
architecture ...
...
begin
process(...)
...
end process; Los procesos se ejecutan
process(...) concurrentemente
...
end process;
end ...;
Dos procesos en paralelo como solucin
architecture uam of ejemplo is
...
begin
process(A,B)
begin
if A='1' and B='1' then
S <= '1';
else
S <= '0';
end if;
end process;
A S
B Q process(C,S)
C begin
if C='1' then
Q <= '1';
else
Q <= S;
end if;
end process;
t0 t1 t2 end uam;
Procesos: Recapitulando
Ejemplo: Un multiplexor
IF condicion_1 THEN
...
secuencia de instrucciones 1 process(A,B,S)
... begin
ELSIF condicion_2 THEN
... if S = '1' then
secuencia de instrucciones 2
... X <= A;
ELSIF condicion_3 THEN else
... X <= B;
secuencia de instrucciones 1 end if;
...
ELSE end process;
...
instrucciones por defecto
...
END IF; A
X
B
S
Instrucciones en procesos: CASE
Ejemplo: Una ALU sencilla
architecture uam of alu is
begin
CASE expresion IS
alu : process (op1, op2, cmd) is
WHEN caso_1 =>
begin
...
secuencia de instrucciones 1 case cmd is
... when "00" =>
WHEN caso_2 => res <= op1 + op2;
... when "01" =>
secuencia de instrucciones 2 res <= op1 op2;
... when "10" =>
res <= op1 and op2;
WHEN OTHERS => when "11" =>
... res <= op1 or op2;
instrucciones por defecto when others =>
... res <= "XXXXXXXX";
END CASE; end case;
end process alu;
op1 res
end architecture uam;
op2
cmd
Instrucciones en procesos: Bucle FOR
busca: process(valor)
begin
encontrado <= '0'; pos := 0;
Ejemplo: while valor /= tabla(pos) or pos < 100 loop
Bsqueda en una tabla pos := pos + 1;
end loop;
if pos < 100 then
encontrado <= '1';
end if; Aqu tambin se
end process; paraleliza el bucle
El proceso se
Las instrucciones dispara
se ejecutan hasta process inmediatamente
que se llega al wait, ...
y en ese punto se begin
suspende el
proceso ... Cuando se deja de
instrucciones secuenciales cumplir la
... condicin de
espera, la
wait... ejecucin contina
...
Al llegar al final, instrucciones secuenciales
se empieza otra ...
vez por el
principio end process;
Distintas clasulas wait
La que ms usaremos en las prcticas para hacer bancos de pruebas:
Suspender el proceso durante un tiempo:
Ej. wait for 10 ns;
Suspender el proceso hasta que ocurra una condicin:
Ej. wait until rising_edge(clk);
Finalizar un proceso en el banco de pruebas: wait;
No olvidar...
process(a,b,c)
...
variable v : std_logic;
...
begin
...
v := a and b or c;
...
end process;
Solucin con variables
process(A,B,C)
variable S : std_logic;
begin
A S S := A and B;
B Q if C='1' then
Q <= '1';
C else
Q <= S;
end if;
end process;
end uam;
Semntica de variables y seales
Seales Variables
global
local
Visibilidad (comunicacin entre
(dentro del proceso)
procesos)
se actualizan cuando
se actualizan
Comportamiento avanza el tiempo (se
inmediatamente
suspende el proceso)
49
Introduccin
La entidad y la arquitectura
Tipos de datos
Los procesos
Circuitos combinacionales
VHDL Circuitos secuenciales
Mquinas de estados
Triestados
Diseo jerrquico
Estilos de diseo
Verificacin con testbenches
process(a,b,sel)
begin Todas las entradas
deben estar en la
if sel='1' then lista de sensibilidad
y <= a;
Se debe asignar
siempre (en else
todos los casos) y <= b;
a la salida un
valor end if;
end process; A
Y
B
end uam;
Sel
El problema de la memoria implcita
CAUSA
las seales en VHDL tienen un estado actual y un estado futuro
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
Un problema con la memoria implcita
process (a)
begin
A S case a is
when "00" =>
00 1
res <= '1';
01 1
when "01" =>
10 0 res <= '1';
11 don't care when "10" =>
res <= '0';
end process;
CASE decode IS
WHEN "100" => key <= first;
WHEN "010" => key <= second;
WHEN "001" => key <= third;
WHEN OTHERS => key <= none;
END CASE;
Asignaciones concurrentes
process(a,b,c,d)
begin
s <= ((a + b) * c) and d;
end process;
Introduccin
La entidad y la arquitectura
Tipos de datos
Los procesos
Circuitos combinacionales
proceso sensible
tambin vale al reloj
rising_edge(clk
)
process (clk)
begin
if clk'event and clk='1' then
q <= d;
end if;
end process; cambia el reloj y
es ahora 1 ...
no hay else, hay un flanco de
queremos subida
inferir memoria
Flip-flop con reset asncrono y clock enable
process (clk,rst)
begin
if rst='1' then
q <= '0';
elsif clk'event and clk='1' then
if ce='1' then
q <= d;
end if;
end if;
end process;
CLK
process(rst,clk)
variable q_temp : std_logic_vector(7 downto 0);
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;
Metodologa: Diseo circuitos secuenciales
Introduccin
La entidad y la arquitectura
Tipos de datos
Los procesos
Circuitos combinacionales
Estado actual
Lgica Registros
Entradas estado sig. de estado
Diagrama de Estados:
PWAIT
RESET ack_out='1'
(async)
00 01 10
REQ
retry_out='1'
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
Ejemplo: Solucin 1
BEGIN
fsm: PROCESS (clock, reset)
BEGIN
IF reset = '1' THEN
wait_gen <= idle; -- asynchronous reset
END CASE;
END IF;
END PROCESS fsm;
END archmoore1;
Ejemplo: Solucion 2
BEGIN
fsm: PROCESS (clock, reset)
BEGIN
IF reset = '1' THEN
wait_gen <= idle;
retry_out <= '0';
ack_out <= '0';
END IF;
END PROCESS fsm;
END archmoore2;
Ejemplo: Solucin 3
BEGIN
CASE wait_gen IS
WHEN idle => IF req = '0' THEN wait_gen <= retry;
ELSE wait_gen <= idle;
END IF;
END IF;
END PROCESS fsm;
END archmoore3;
En FPGAs
reduce la lgica de clculo de estado siguiente
y por tanto, menos profundidad de lgica
permitiendo mquinas muy rpidas (>100MHz)
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
BEGIN
fsm: PROCESS (clock, reset)
BEGIN
IF reset = '1' THEN
wait_gen <= idle;
END CASE;
END IF;
-- Decodificacion de salidas
retry_out <= '1' WHEN (wait_gen = retry) ELSE '0';
ack_out <= '1' WHEN (wait_gen = ack) ELSE '0';
END archmoore4;
FSM de Mealy
Registros
de estado
Entradas Lgica Salidas
Diagrama de estados:
X0/01
RESET
(async)
1X/00
X1/10
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;
Introduccin
La entidad y la arquitectura
Tipos de datos
Los procesos
Circuitos combinacionales
PROCESS(in1)
BEGIN in1
senal <= in1;
END PROCESS; senal
senal <= in2; in2
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'
Con un proceso:
PROCESS (ena_a, a)
BEGIN
IF (sel_a = '0') THEN
t <= a;
ELSE t <= 'Z';
END PROCESS;
Seales bidireccionales
REG DATA
8 8
Introduccin
La entidad y la arquitectura
Tipos de datos
Los procesos
Circuitos combinacionales
a1.vhd
Permite reutilizar cdigo
b.vhd c.vhd
rbol de jerarquas
COMPONENTE SUPERIOR
top.vhd ( TOP )
COMPONENTES INFERIORES
a1.vhd a2.vhd
AT XT
Ejemplo de instanciacin de componentes
Y la podemos implementar a
partir de la conexin en serie de
ENTITY Top IS
los componentes mi_comp
PORT (
AT: IN std_logic;
Top XT: OUT std_logic);
END Top;
AT XT ENTITY mi_comp IS
A X A X PORT (
A: IN std_logic;
X: OUT std_logic);
mi_comp mi_comp END mi_comp;
Ejemplo de instanciacin de componentes
Component mi_comp
PORT (
AT S XT A: IN std_logic;
A X A X X: OUT std_logic);
Signal S : std_logic;
C1 C2
Begin
C1:mi_comp PORT MAP
(A=>AT, X=>S)
END test;
Lenguaje de Descripcin Hardware VHDL
Introduccin
La entidad y la arquitectura
Tipos de datos
Los procesos
Circuitos combinacionales
Archivos VHDL
Anlisis
libreras de trabajo
Elaboracin
Simulacin
Bancos de pruebas
Hay que hacer un banco de pruebas (testbench) para cada
componente diseado.
Pensamos
en SW Pensamos
Mi diseo en HW
hardware
Algoritmos
de
pruebas
Banco de pruebas
Como hacer un banco de pruebas (I)
1. Instanciar el diseo que vamos a verificar
Estmulos
Mi diseo
hardware
Algoritmos
Usuario de
Resultados
pruebas
Banco de pruebas
Como hacer un banco de pruebas (II)
Es un diseo jerrquico donde el banco de pruebas ocupa el
primer nivel
Estmulos
Mi diseo
hardware
Algoritmos
de
Resultados
pruebas
Banco de pruebas
Generando estmulos
El proceso de pruebas generar estmulos de manera
secuencial
WAIT FOR
Ejemplo: sumador (I)
process
begin A
A <= x01; + X
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;
Ejemplo: sumador (II)
ENTITY sumador IS PORT (
ENTITY sumador_tb IS A: IN std_logic_vector(7 downto 0);
END sumador_tb; B: IN std_logic_vector(7 downto 0);
X: OUT std_logic_vector(7 downto 0);
END sumador;
Elementos:
cA
A Entidad top-level: sumador_tb
Componente a probar: sumador
Proceso X
cB Proceso de pruebas
de
pruebas
B Cable cA
Cable cB
cX Cable cX
Ejemplo: sumador (III)
ENTITY sumador_tb IS
END sumador_tb;
Component sumador
PORT (
A: IN std_logic_vector(7 downto 0);
B: IN std_logic_vector(7 downto 0);
X: OUT std_logic_vector(7 downto 0));
Begin
--Cuerpo: en la pgina siguiente :-)
END test;
Ejemplo: sumador (IV)
begin
process
begin
cA <= x01;
cB <= x01;
WAIT FOR 10 ns;
ASSERT cX = x02 REPORT Falla SEVERITY FAILURE;
cA<= xFF;
cB<= x01;
WAIT FOR 10 ns;
ASSERT cX = x00 REPORT Falla SEVERITY FAILURE;
WAIT;
end process;
end test;
Ejemplo: sumador (V)
process
begin
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;
Vamos a ver algunos ejemplos
Lenguaje de Descripcin Hardware VHDL
Introduccin
La entidad y la arquitectura
Tipos de datos
Los procesos
Circuitos combinacionales