Clase - 6 - Código Secuencial en VHDL
Clase - 6 - Código Secuencial en VHDL
Clase - 6 - Código Secuencial en VHDL
Código VHDL
LIBRARY ieee;
USE ieee.std_logic_1164.all;
--------------------------------------
ENTITY dff IS
PORT (d, clk, rst: IN STD_LOGIC;
q: OUT STD_LOGIC);
END dff;
--------------------------------------
ARCHITECTURE behavior OF dff IS
BEGIN
PROCESS (clk, rst) BEGIN
IF (rst=’1’) THEN
q <= ’0’;
ELSIF (clk’EVENT AND clk=’1’) THEN
q <= d;
END IF;
END PROCESS;
END behavior;
SIGNAL VARIABLE
Declarada en PACKAGE, ENTITY o Declara en PROCESS.
ARCHITECTURE. Es local.
Es global. Actualización inmediata.
Actualización al finalizar el Asignación con :=
proceso.
Asignación com <=
Modifique el código anterior para usar tipo de dato STD LOGIC VECTOR
y UNSIGNED en lugar de INTEGER. Use tres enfoques: el primero con la
librerı́a numeric std; el segundo con la librerı́a std logic arith y el tercero
con la librerı́a std logic unsigned.
Código VHDL
CASE control IS
WHEN "00" => x<=a; y<=b;
WHEN "01" => x<=b; y<=c;
WHEN OTHERS => x<="0000"; y<="ZZZZ";
END CASE;
Código VHDL
WHEN value -- Un solo valor
WHEN value1 to value2 -- rango, para tipos enumerados
WHEN value1 | value2 |... -- valor 1 O valor 2
Código VHDL
--LIBRARY ieee;
--USE ieee.std_logic_1164.all;
----------------------------------------------
ENTITY dff IS
PORT (d, clk, rst: IN BIT;
q: OUT BIT);
END dff;
----------------------------------------------
ARCHITECTURE dff3 OF dff IS BEGIN
PROCESS (clk, rst) BEGIN
CASE rst IS
WHEN ’1’ => q<=’0’;
WHEN ’0’ =>
IF (clk’EVENT AND clk=’1’) THEN q <= d; END IF;
WHEN OTHERS => NULL; -- No necesario
END CASE;
END PROCESS;
END dff3;
Loop (bucle) repetido un número fijo de veces. Ambos lı́mites del rango
deben ser estáticos.
Código VHDL
FOR i IN 0 TO 5 LOOP
x(i) <= enable AND w(i+2);
y(0, i) <= w(i);
END LOOP;
sj = aj XOR bj XOR cj
cj+1 = (aj AND bj ) OR (aj AND cj ) OR (bj AND cj )
Código VHDL
LIBRARY ieee;
USE ieee.std_logic_1164.all;
----------------------------------------------
ENTITY adder IS
GENERIC (length : INTEGER := 4);
PORT ( a, b: IN STD_LOGIC_VECTOR (length-1 DOWNTO 0);
cin: IN STD_LOGIC;
s: OUT STD_LOGIC_VECTOR (length-1 DOWNTO 0);
cout: OUT STD_LOGIC);
END adder;
Código VHDL
ARCHITECTURE adder OF adder IS BEGIN
PROCESS (a, b, cin)
VARIABLE carry : STD_LOGIC_VECTOR (length DOWNTO 0);
BEGIN
carry(0) := cin;
FOR i IN 0 TO length-1 LOOP
s(i) <= a(i) XOR b(i) XOR carry(i);
carry(i+1) := (a(i) AND b(i)) OR (a(i) AND
carry(i)) OR (b(i) AND carry(i));
END LOOP;
cout <= carry(length);
END PROCESS;
END adder;
Código VHDL
---- With IF: --------------
IF (sel="00") THEN x<=a;
ELSIF (sel="01") THEN x<=b;
ELSIF (sel="10") THEN x<=c;
ELSE x<=d;
---- With CASE: ------------
CASE sel IS
WHEN "00" => x<=a;
WHEN "01" => x<=b;
WHEN "10" => x<=c;
WHEN OTHERS => x<=d;
END CASE;