Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% encontró este documento útil (0 votos)
180 vistas17 páginas

Programación en VHDL

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1/ 17

Programacin en VHDL

Ejemplos
Sumador
Programacin en VHDL/Ejemplos/Sumador
Ejemplos/Multiplexor Sumador Ejemplos/Contador


El objetivo es crear un sumador que dadas dos entradas de datos devuelva la suma de
estos.
Entradas:
a: operando 1.
b: operando 2.
Salidas:
salida: suma de las entradas.

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;

ENTITY sum IS
PORT (a : IN std_logic_vector(3 DOWNTO 0);
b : IN std_logic_vector(3 DOWNTO 0);
salida : OUT std_logic_vector(4 DOWNTO 0));
END sum;

ARCHITECTURE synth OF sum IS
BEGIN

PROCESS (a, b) IS
BEGIN
salida <= std_logic_vector(UNSIGNED(a) + UNSIGNED(b));
END PROCESS;
END synth;




Programacin en VHDL
Ejemplos
Contador
Programacin en VHDL/Ejemplos/Contador
Ejemplos/Sumador Contador Ejemplos/Biestable-Latch


El objetivo es crear un contador con reset asncrono, seal de habilitacin y salida con un
nmero de bits configurable, con la siguiente definicin de interfaz:
Entradas:
reset: Reset del sistema.
clk: Reloj del sistema.
enable: Activacin-Desactivacin del contador.
Salidas:
count: Salida del contador.

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;
USE IEEE.NUMERIC_STD.all;

ENTITY count IS
GENERIC (width:POSITIVE:=8);
PORT (clk : IN std_logic;
reset : IN std_logic;
enable: IN std_logic;
count : OUT std_logic_vector(width-1 DOWNTO 0)
);
END count;

ARCHITECTURE arch1 OF count IS
SIGNAL cnt : UNSIGNED(width-1 DOWNTO 0);

BEGIN

pSeq : PROCESS (clk, reset) IS
BEGIN
IF reset = '1' THEN
cnt <= (others => '0');
ELSIF clk'event AND clk='1' THEN
IF enable='1' THEN
cnt <= cnt + 1;
END IF;
END IF;
END PROCESS;

count <= std_logic_vector(cnt);

END arch1;



Biestable-Latch
Programacin en VHDL/Ejemplos/Biestable-Latch
Ejemplos/Contador Biestable-Latch Ejemplos/Mquinas de estados


El objetivo es crear un dispositivo capaz de reproducir en cada tic de reloj la entrada en la
salida. Para ello ser necesario diponer del reloj y reset del sistema.
Entradas:
rst: Reset del sistema.
clk: Reloj del sistema.
a: Entrada de datos.
Salidas:
b: Salida de datos.

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;

ENTITY biestable IS
PORT (clk : IN std_logic;
rst : IN std_logic;
a : IN std_logic_vector(31 DOWNTO 0);
b: OUT std_logic_vector(31 DOWNTO 0));
END biestable;

ARCHITECTURE synth OF biestable IS
BEGIN

pSeq : PROCESS (clk, rst) IS
BEGIN
IF rst = '1' THEN
b <= (others => '0');
ELSIF clk='1' AND clk'event THEN
b <= a;
END IF;
END PROCESS;

END synth;

Tambin es posible realizar esta operacin a travs de una seal de activacion (enable),
pero a este tipo de diseos se les denomina latch. En este caso no har falta la seal de
reloj, pero s el reset.
Entradas:
rst: Reset del sistema.
en: Enable de almacenamiento.
a: Entrada de datos.
Salidas:
b: Salida de datos.

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;

ENTITY latch IS
PORT (en : IN std_logic;
rst : IN std_logic;
a : IN std_logic_vector(31 DOWNTO 0);
b: OUT std_logic_vector(31 DOWNTO 0));
END latch;

ARCHITECTURE synth OF latch IS
BEGIN

pSeq : PROCESS (en, rst) IS
BEGIN
IF rst = '1' THEN
b <= (others => '0');
ELSIF en = '1' THEN
b <= a;
END IF;
END PROCESS;

END synth;


ALU
Programacin en VHDL/Ejemplos/ALU
Ejemplos/Mquinas de estados ALU


El objetivo es crear un dispositivo capaz de realizar cualquier operacin dependiendo del
valor de una seal de entrada, adems se dispondr de dos entradas de datos.
Entradas:
a: Entrada de datos 1.
b: Entrada de datos 2.
proceso: Entrada de la operacin.
Salidas:
c: Salida de datos.

LIBRARY ieee;
USE IEEE.STD_LOGIC_1164.all;
USE IEEE.NUMERIC_STD.all

ENTITY alu IS
PORT(op1 : IN std_logic_vector(7 DOWNTO 0);--entrada 1
op2 : IN std_logic_vector(7 DOWNTO 0);--entrada 2
proceso : IN std_logic_vector(3 DOWNTO 0);--que hara la
alu
res : OUT std_logic_vector(15 DOWNTO 0));
END alu;

ARCHITECTURE synth OF alu IS
SIGNAL a,b:UNSIGNED(op1'range);
SIGNAL c:UNSIGNED(res'range);
BEGIN
PROCESS (a, b, proceso)
BEGIN
CASE proceso IS
WHEN "0000" => c <= RESIZE((a + b),c'length);
WHEN "0001" => c <= RESIZE((a - b),c'length);
WHEN "0010" =>
........
WHEN OTHERS => null;
END CASE;
END PROCESS;

a <= UNSIGNED(op1);
b <= UNSIGNED(op2);
res <= std_logic_vector(c);

END synth;


Multiplexor
Programacin en VHDL/Ejemplos/Multiplexor
Ejemplos/Puerta triestado Multiplexor Ejemplos/Sumador


El objetivo es crear un sistema que devuelva un valor dependiente de otra seal de
entrada, la cual ser la encargada de seleccionar la salida. Adems se definirn varias
entradas de datos que actuarn como salidas. Cuando la seal de seleccin este a cero no
se producir ninguna salida, es decir el valor ser cero.
Entradas:
a, b, c: entradas de datos.
sel: seal que indica la seal que va a ser devuelta.
Salidas:
salida: salida de datos.

library IEEE;
use IEEE.STD_LOGIC_1164.all;

ENTITY mux IS
PORT(a : IN std_logic_vector(3 DOWNTO 0);
b : IN std_logic_vector(3 DOWNTO 0);
c : IN std_logic_vector(3 DOWNTO 0);
sel : IN std_logic_vector(1 DOWNTO 0);
salida : OUT std_logic_vector(3 DOWNTO 0));
END mux;

ARCHITECTURE synth OF mux IS
BEGIN

PROCESS (sel, a, b, c) IS
BEGIN
CASE sel IS
WHEN "00" => salida <= (others => '0');
WHEN "01" => salida <= a;
WHEN "10" => salida <= b;
WHEN "11" => salida <= c;
WHEN OTHERS => salida <= (others => '0');
END CASE;
END PROCESS;
END synth;


Puerta triestado
Programacin en VHDL/Ejemplos/Puerta triestado
Ejemplos Puerta triestado Ejemplos/Multiplexor


El objetivo es crear una puerta que tenga una seal de operacin la cual, a estado alto,
habilite la salida, por lo tanto el valor de la entrada pasar a la salida. Cuando la seal de
operacin est a nivel bajo la puerta no sacar una seal, es decir, estar en alta
impedancia.
Entradas:
entrada: entrada de datos.
op: seal que indica el modo de funcionar de la puerta.
Salidas:
salida: salida de datos.

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY triestado IS
PORT(op, entrada: IN std_logic;
salida: OUT std_logic);
END triestado;

ARCHITECTURE synth OF triestado IS
BEGIN
PROCESS(entrada,op)
BEGIN
IF op='1' THEN
salida <= entrada;
ELSE
salida <= 'Z';
END IF;
END PROCESS;
END ARCHITECTURE synth;



Bancos de pruebas
Programacin en VHDL/Bancos de pruebas
Otros conceptos Bancos de pruebas Ejemplos

Contenido
1 Retrasos
2 Niveles lgicos
3 Notificaciones
4 Descripcin de un banco de pruebas
o 4.1 Mtodo tabular
o 4.2 Uso de ficheros (vectores de test)
o 4.3 Metodologa algortmica
En VHDL es posible describir modelos para la simulacin. Estos modelos no tienen
demasiadas restricciones, necesitando unicamente un intrprete de las instrucciones
VHDL. En cambio, en la sntesis se aaden una cantidad de restricciones como pueden
ser aquellas que tienen que ver con las del tiempo, ya que no es posible aplicar retardos a
la hora de disear un circuito.
Retrasos[editar]
El retraso es uno de los elementos ms importantes de la simulacin, puesto que el
comportamiento de un circuito puede cambiar dependiendo del cambio de las diferentes
seales. Cuando se realiza una asignacin se produce de forma inmediata, puesto que no
se ha especificado ningn retraso. Este comportamiento puede ser alterado mediante la
opcinAFTER cuando se asigna un valor a una seal. Su sintaxis corresponde a la
siguiente lnea.
seal <= valor AFTER tiempo;
Donde tiempo es un valor de tiempo indicado en us, ns, ms, ... Un ejemplo puede ser el
siguiente.

rst <= '0' AFTER 15 ns;

Pero esta sentencia es mucho ms compleja, por ejemplo se puede asignar inicialmente
un valor y modificarlo posteriormente o incluso que sea modificado cada cierto tiempo.

signal clk : std_logic := '0';
....
rst <= '1', '0' AFTER 15 ns; -- Inicialmente rst=1, despues de
15 ns rst=0
clk <= not clk AFTER 5 ns; -- Cada 5 ns clk cambia de valor

Tambin es posible introducir una espera entre dos sentencias mediante la palabra
reservada WAIT. La sintxis de esta operacin e ms compleja que la anterior.
WAIT [ON lista | UNTIL condicion | FOR tiempo];
Lista corresponde a una lista de sensibilidad de seales, es decir, se permanecer en
espera hasta que se produzca un cambio en alguna de las seales de la
lista. Condicin se trata de una espera indeterminada hasta que la condicin sea
verdadera. Por ltimo, el tiempo es un valor definido en una unidad de tiempo. A
continuacin se muestra un ejemplo de las tres esperas posibles.

-- WAIT ON
stop <= '1';
WAIT ON semaforo; -- Hasta que semaforo no cambie se
permanecer en el WAIT
stop <= '0';

....

-- WAIT UNTIL
ack <= '1';
WAIT UNTIL clk'event and clk = '1'; -- Hasta que no exista un
evento de clk y sea uno se permanece en WAIT
ack <= '0';

....

-- WAIT FOR
start <= '0';
WAIT FOR 50 ns; -- Se espera 50 ns
start <= '1';

Niveles lgicos[editar]
Normalmente existen tres niveles lgicos: 0, 1 y X, donde ste ltimo se refiere a un valor
desconocido (puede estar a alto o bajo nivel, no se sabe cul de los dos).
Tambin existen las llamadas fuerzas. S equivale a la salida obtenida de una conexin a
alimentacin o a tierra a travs de un transistor. R es idntico al anterior, pero su obtencin
es a travs de una resistencia. Z tambin es igual a las anteriores, pero esta vez es
cuando la seal es obtenida mediante una alta impedancia. Por ltimo, se encuentra I, que
indica que no se sabe qu fuerza existe en el bus.
El tipo std_logic ampla estas fuerzas, incluyendo U y -. La primera indica que una seal no
ha sido inicializada y la segunda que no importa el valor que se ponga.
Notificaciones[editar]
En la simulacin de circuitos es interesante el uso de las notificaciones, gracias a ellas se
pueden advertir que seales han sido activadas o incluso comprobar si una seal ha
tomado un valor determinado. El uso de notificaciones se realiza mediante ASSERT,
seguida de una condicin como elemento de activacin. La sentencia puede utilizarse
tanto en entornos concurrentes como en serie.
ASSERT <condicin>
[REPORT <expresin>]
[SEVERITY <expresin>];
Si la condicin no se cumple aparecer en la pantalla del simulador el mensaje que se ha
especificado y el nivel de gravedad, ambos son opcionales y en el caso de no indicar
ningn mensaje aparecer "Assertion Violation". Los diferentes niveles de gravedad
pueden ser (de menor a mayor): note, warning, error (por defecto) y failure. Dependiendo
del nivel de gravedad la simulacin puede detenerse.
A continuacin se muestran una serie de ejemplos de esta sentencia.

ASSERT adrr = X"00001111";
....
ASSERT addr = X"10101010" REPORT "Direccion Erronea";
....
ASSERT addr > X"00001000" and addr < X"00002000" REPORT
"Direccion correcta" SEVERITY note;
....
ASSERT addr < X"00001000" and addr > X"00002000" REPORT
"Direccion incorrecta" SEVERITY warning;

Descripcin de un banco de pruebas[editar]
Una de las partes ms importantes en el diseo de cualquier sistema son las pruebas para
la verificacin del funcionamiento de un sistema. Con las metodologas tradicionales la
verificacin slo era posible tras su implementacin fsica, lo que se traduca en un alto
riesgo y coste adicional. Lo ms sencillo es cambiar las entradas para ver cmo son las
salidas, en una herramienta de simulacin, siempre que su diseo sea sencillo, en caso
contrario lo ms cmodo sera crear un banco de pruebas.
Un banco de pruebas es una entidad sin puertos, cuya estructura contiene un componente
que corresponde al circuito que se desea simular y la alteracin de las diferentes seales
de entrada a dicho componente, para poder abarcar un mayor nmero de casos de
prueba. Es recomendable realizar la descripcin del banco de pruebas de un sistema a la
vez que se describe su diseo. Las siguientes lneas muestra la sintaxis de un banco de
pruebas.
ENTITY nombre_test IS
END nombre_test;
ARCHITECTURE test OF nombre_test IS
-- Declaraciones
BEGIN
-- Cuerpo de las pruebas
END test;
A continuacin se muestran las diferentes metodologas que se pueden llevar a cabo para
la realizacin de un banco de pruebas. Para su explicacin se utilizar un ejemplo de un
diseo muy sencillo, donde un vector es rotado un bit hacia la izquierda o derecha
dependiendo de la entrada met, su entidad corresponde al siguiente trozo de cdigo.

ENTITY round IS
clk, rst, met : IN std_logic;
e : IN std_logic_vector(3 DOWNTO 0);
s : OUT std_logic_vector(3 DOWNTO 0)
END round;

Mtodo tabular[editar]
Para verificar la funcionalidad de un diseo se debe elaborar una tabla con las entradas y
las respuestas que se esperan a dichas entradas. Todo ello se deber relacionar mediante
cdigo VHDL. Las siguientes lneas muestran un ejemplo con el diseo que se expuso
anteriormente.

USE work.round;

ENTITY test_round IS
END test_round;

ARCHITECTURE test OF test_round IS
SIGNAL clk, rst, met : std_logic;
SIGNAL e, s : std_logic_vector(3 DOWNTO 0);
TYPE type_test IS RECORD
clk, rst, met : std_logic;
e, s : std_logic_vector(3 DOWNTO 0);
END RECORD;
TYPE lista_test IS ARRAY (0 TO 6) OF type_test;
CONSTANT tabla_test : lista_test :=(
(clk=>'0', rst =>'1', met=>'0', e=>"0000", s=>"0000"),
(clk=>'1', rst =>'0', met=>'0', e=>"0000", s=>"0000"),
(clk=>'1', rst =>'0', met=>'0', e=>"0001", s=>"0010"),
(clk=>'1', rst =>'0', met=>'0', e=>"1010", s=>"0101"),
(clk=>'1', rst =>'0', met=>'1', e=>"0000", s=>"0000"),
(clk=>'1', rst =>'0', met=>'1', e=>"0001", s=>"1000"),
(clk=>'1', rst =>'0', met=>'1', e=>"1001", s=>"1100"));
BEGIN
r : ENTITY work.round
PORT MAP(clk => clk, rst => rst, met => met, e => e, s =>
s);

PROCESS
VARIABLE vector : type_test;
VARIABLE errores : boolean := false;
BEGIN
FOR i IN 0 TO 6 LOOP
vector := tabla_test(i);
clk<=vector.clk; rst<=vector.rst; met<=vector.met;
e<=vector.e;
WAIT FOR 20 ns;
IF s /= vector.s THEN
ASSERT false REPORT "Salida incorrecta" SEVERITY
error;
errores:=true;
END IF;
END LOOP;
ASSERT errores REPORT "Test OK" SEVERITY note;
WAIT;
END PROCESS;
END test;

Uso de ficheros (vectores de test)[editar]
En el caso anterior los casos de prueba y el cdigo de simulacin permanecan juntos,
pero es posible separarlos de forma que, por un lado se encuentren las pruebas y por otro
el cdigo. Esto es posible ya que VHDL dispone de paquetes de entradas/salida para la
lectura/escritura en ficheros de texto, como ya se comento el paquete textio dispone de los
subprogramas necesarios para el acceso a dichos ficheros.
Supnganse los casos de prueba desarrollados en el caso anterior, en el siguiente fichero
de texto se han escrito los vectores de prueba:
clk rst met e s
0 1 0 0000 0000
1 0 0 0001 0010
1 0 0 1010 0101
1 0 1 0000 0000
1 0 1 0001 1000
1 0 1 1001 1100
A continuacin se muestra el cdigo relacionado con la simulacin, en l se incluye el
acceso al fichero anterior que contiene los diferentes vectores de test.

USE std.textio.ALL; -- No es necesario porque se incluye por
defecto
USE work.round;

ENTITY test_round IS
END test_round;

ARCHITECTURE test OF test_round IS
SIGNAL clk, rst, met : std_logic;
SIGNAL e, s : std_logic_vector(3 DOWNTO 0);
BEGIN
r : ENTITY work.round
PORT MAP(clk => clk, rst => rst, met => met, e => e, s =>
s);

PROCESS
FILE vector_test : text OPEN read_mode IS "test.txt";
VARIABLE errores : boolean := false;
VARIABLE vector : line;
VARIABLE clk_tmp, rst_tmp, met_tmp : std_logic;
VARIABLE e_tmp, s_tmp : std_logic_vector(3 DOWNTO 0);
BEGIN
readline(vector_test,vector); -- Lee los nombres (la
primera linea)
WHILE NOT endfile(vector_test) LOOP
readline(vector_test,vector);
read(vector,clk_tmp);
read(vector,rst_tmp);
read(vector,met_tmp);
read(vector,e_tmp);
read(vector,s_tmp);
clk <= clk_tmp; rst <= rst_tmp; met <= met_tmp; e <=
e_tmp;
WAIT FOR 20 ns;
IF s_tmp /= s THEN
ASSERT false REPORT "Salida incorrecta" SEVERITY
error;
errores:=true;
END IF;
END LOOP;
file_close(vector_test);
ASSERT errores REPORT "Test OK" SEVERITY note;
WAIT;
END PROCESS;
END test;

Metodologa algortmica[editar]
Existe otro tipo de test, los cuales se basan en realizar algoritmos para cubrir el mayor
nmero de casos posibles. A continuacin se muestra un ejemplo, el cual aplica esta
metodologa.

USE work.round;

ENTITY test_round IS
END test_round;

ARCHITECTURE test OF test_round IS
SIGNAL clk : std_logic := '0';
SIGNAL rst, met : std_logic;
SIGNAL e, s : std_logic_vector(3 DOWNTO 0);
BEGIN
clk <= NOT clk after 10 ns;

r : ENTITY work.round
PORT MAP(clk => clk, rst => rst, met => met, e => e, s =>
s);

PROCESS
BEGIN
rst <= '1'; met <= '0'; e <= "0000";
WAIT FOR 20 ns;
ASSERT (s="0000") REPORT "Error en reset" SEVERITY error;

rst <= '0';

e <= "0000";
WAIT FOR 20 ns;
ASSERT (s="0000") REPORT "Error desplazamiento izquierda"
SEVERITY error;

e <= "0001";
WAIT FOR 20 ns;
ASSERT (s="0010") REPORT "Error desplazamiento izquierda"
SEVERITY error;

e <= "1010";
WAIT FOR 20 ns;
ASSERT (s="0101") REPORT "Error desplazamiento izquierda"
SEVERITY error;

met <= '1';

e <= "0000";
WAIT FOR 20 ns;
ASSERT (s="0000") REPORT "Error desplazamiento derecha"
SEVERITY error;

e <= "0001";
WAIT FOR 20 ns;
ASSERT (s="1000") REPORT "Error desplazamiento derecha"
SEVERITY error;

e <= "1001";
WAIT FOR 20 ns;
ASSERT (s="1100") REPORT "Error desplazamiento derecha"
SEVERITY error;

ASSERT false REPORT "Test Finalizado" SEVERITY note;
WAIT;
END PROCESS;
END test;




Contador de 7 bits --

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;

Entity contador is
Port(clk : in std_logic;
X : inout
std_logic_vector(2 downto
0):="000");
End contador;

Architecture flujo of contador is
begin
process (clk)
begin
if (clk'event and clk = '0')
then
X <= X + 1;
end if;
end process;
end flujo;



Library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

Entity div_50MHz is
port
(
osc_50MHz: in std_logic;
clk : buffer std_logic:='0'
);
end div_50MHz;

Architecture flujo of div_50MHz is
signal conteo: integer range 0 to
25000000;
begin
process(osc_50MHz)
begin
if(osc_50MHz' event and
osc_50MHz='1')then
conteo<=conteo +1;
if(conteo=25000000)then
conteo<=0;
clk<=not(clk);
end if;
end if;
end process;
end flujo;

También podría gustarte