Práctica2 VLSI

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 11

Universidad Nacional Autónoma de México

Facultad de Ingeniería

Diseño digital VLSI

Práctica 2: Diseño de registros de


corrimiento en cascada

Sánchez Cano Alan

Grupo: 3

1
Contenido
Parte básica. ........................................................................................................................................................................ 3
Código: ........................................................................................................................................................................... 3
Parte complementaria. ........................................................................................................................................................ 5
Primera actividad complementaria: ................................................................................................................................ 5
Códigos: .......................................................................................................................................................................... 5
Segunda actividad complementaria: ............................................................................................................................... 8
Código: ........................................................................................................................................................................... 8
Conclusión. ....................................................................................................................................................................... 11

2
Parte básica.
Como ya se observó en la primera práctica, el código que se nos presenta funciona de manera
correcta en las tarjetas con los displays de 7 segmentos conectados de forma multiplexada, se
realizaron las modificaciones al mismo ya que en mi caso tengo la tarjeta DE10 lite y esta
tarjeta presenta los displays con conexión directa. También se observa que el código original
contiene más displays de los que la tarjeta DE10 lite cuenta. A continuación el código:

Código:

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

entity corri is
Port( reloj : in std_logic;
display1, display2, display3, display4,display5,
display6 : buffer std_logic_vector (6 downto 0));
end corri;

architecture bhv of corri is


signal segundo : std_logic;
signal Q : std_logic_vector(3 downto 0):="0000";

begin

divisor : process(reloj)
variable CUENTA: std_logic_vector(27 downto 0) := X"0000000";
begin
if rising_edge (reloj) then
if CUENTA =X"48009E0" then
cuenta := X"0000000";
else
cuenta := cuenta+1;
end if;
end if;
segundo <=CUENTA(22);
end process;

contador : process (segundo)


begin
if rising_edge (segundo) then
3
Q <= Q + 1;
end if;
end process;

With Q select
display1 <= "0000110" when "0000", --E
"0101011" when "0001", --n
"1111111" when "0010", --espacio
"1000111" when "0011", --L
"0001000" when "0100", --A
"1111111" when "0101", --espacio
"1000000" when "0110", --O
"1000111" when "0111", --L
"0001000" when "1000", --A
"1111111" when others; --espacios

FF1 :process (segundo)


begin
if rising_edge(segundo) then
display2 <= display1;
end if;
end process;

FF2 : process (segundo)


begin
if rising_edge (segundo) then
display3 <= display2;
end if;
end process;

FF3 : process(segundo)
begin
if rising_edge (segundo) then
display4 <= display3;
end if;
end process;

FF4 : process(segundo)
begin
if rising_edge (segundo) then
display5 <= display4;
end if;
end process;
4
FF5 : process(segundo)
begin
if rising_edge (segundo) then
display6 <= display5;
end if;
end process;

end bhv;
Parte complementaria.

Primera actividad complementaria:

Se nos pide la realización del multiplexado para mandar las señales a 4 displays de 7
segmentos. La estructura es la siguiente:

Para ello se realizaron dos códigos, uno para la estructura pedida y el otro para ponerlo a
prueba mediante un port map. Estos códigos se realizaron sin perder de vista la cuestión del
uso de la tarjeta DE10 lite y el tema de los displays de 7 segmentos.

Códigos:

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

entity Mux4disp is
Port(clk: in std_logic;
D0: in std_logic_vector(6 downto 0);
D1: in std_logic_vector(6 downto 0);
D2: in std_logic_vector(6 downto 0);
D3: in std_logic_vector(6 downto 0);
AN: out std_logic_vector(3 downto 0);
5
L: out std_logic_vector(6 downto 0));
end Mux4disp;

architecture bhv of Mux4disp is


signal rapido : std_logic;
signal Qs : std_logic_vector(3 downto 0);
signal Qr : std_logic_vector(1 downto 0);

begin

divisor: process (clk)


variable CUENTA: STD_LOGIC_VECTOR(27 downto 0) :=
X"0000000";
begin
if rising_edge (clk) then
if CUENTA = X"48009E0" then
CUENTA := X"0000000";
else
CUENTA := CUENTA + 1;
end if;
end if;
rapido <= CUENTA (26);
end process;

contrapid: process (rapido)


variable CUENTA: STD_LOGIC_VECTOR(1 downto 0) := "00";
begin
if rising_edge (rapido) then
CUENTA := CUENTA + 1;
end if;
Qr <= CUENTA;
end process;

selectDisplay: process (Qr)


variable CUENTA: std_logic_vector(1 downto 0) :="00";
begin

case Qr is
when "00" =>
AN <= "0001";
L <= D0;
when "01" =>
6
AN <= "0010";
L <= D1;
when "10" =>
AN <= "0100";
L <= D2;
when others =>
AN <= "1000";
L <= D3;
end case;
end process;

end bhv;

El código que se utilizó para hacer la prueba en la tarjeta es el siguiente:

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

entity UseMux4disp is
Port (clk : in std_logic;
AN: inout std_logic_vector(3 downto 0);
L: out std_logic_vector(6 downto 0));
end UseMux4disp;

architecture bhv of UseMux4disp is

component Mux4Disp is
Port(
clk : in std_logic;
D0: in std_logic_vector(6 downto 0);
D1: in std_logic_vector(6 downto 0);
D2: in std_logic_vector(6 downto 0);
D3: in std_logic_vector(6 downto 0);
AN: out std_logic_vector(3 downto 0);
L: out std_logic_vector(6 downto 0));
end component;

begin
Mux: Mux4Disp port map (
clk => clk,
D0 => "0001001", --0
7
D1 => "1000000", --1
D2 => "1000111", --2
D3 => "0100000", --3
AN => AN,
L => L);
end bhv;

Segunda actividad complementaria:

Para finalizar, se nos pide la modificación de la parte básica para que dada la señal lógica ‘1’
muestre un mensaje y para ‘0’ otro. En este caso se muestra mi número de cuenta para sw =
‘0’ y parte de mi nombre completo cuando es ‘1’ (alan cano). Esto se logró mediante un if
else.

Código:

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

entity complemen2 is
Port( reloj : in std_logic;
sw: in std_logic;
display1, display2, display3, display4,display5,
display6 : buffer std_logic_vector (6 downto 0)
);
end complemen2;

architecture bhv of complemen2 is


signal segundo : std_logic;
signal Q : std_logic_vector(3 downto 0):="0000";

begin

divisor : process(reloj)
variable CUENTA: std_logic_vector(27 downto 0) := X"0000000";
begin
if rising_edge (reloj) then
if CUENTA =X"48009E0" then
cuenta := X"0000000";
else
cuenta := cuenta+1;
8
end if;
end if;
segundo <=CUENTA( 22);
end process;

contador : process (segundo)


begin
if rising_edge (segundo) then
Q <= Q +1;
end if;
end process;

selectDisplay: process (sw, Q)


begin
if sw ='0' then
case Q is
when "0000" => display1 <= "0110000"; --3
when "0001" => display1 <= "1001111"; --1
when "0010" => display1 <= "0000010"; --6
when "0011" => display1 <= "1000000"; --0
when "0100" => display1 <= "0110000"; --3
when "0101" => display1 <= "0010000"; --9
when "0110" => display1 <= "1000000"; --0
when "0111" => display1 <= "0000010"; --6
when "1000" => display1 <= "0000000"; --8
when others => display1 <= "1111111"; --espacios
end case;

else
case Q is
when "0000" => display1 <= "0100000"; --a
when "0001" => display1 <= "1000111"; --l
when "0010" => display1 <= "0100000"; --a
when "0011" => display1 <= "1001000"; --n
when "0100" => display1 <= "1111111"; --espacio
when "0101" => display1 <= "1000110"; --c
when "0110" => display1 <= "0100000"; --a
when "0111" => display1 <= "1001000"; --n
when "1000" => display1 <= "1000000"; --o
when others => display1 <= "1111111"; --espacios
end case;

end if;
9
end process;

FF1 :process (segundo)


begin
if rising_edge(segundo) then
display2 <= display1;
end if;
end process;

FF2 : process (segundo)


begin
if rising_edge (segundo) then
display3 <= display2;
end if;
end process;

FF3 : process(segundo)
begin
if rising_edge (segundo) then
display4 <= display3;
end if;
end process;

FF4 : process(segundo)
begin
if rising_edge (segundo) then
display5 <= display4;
end if;
end process;

FF5 : process(segundo)
begin
if rising_edge (segundo) then
display6 <= display5;
end if;
end process;

end bhv;

10
Conclusión.

En esta práctica no me costó mucho trabajo su realización ya que no observé que tomará
tantos parámetros como en la primera práctica, por lo tanto, se realizó en la misma clase
todos los códigos. La práctica sigue reforzando conceptos vistos en la materia antecesora y el
diseño de bloques funcionales va quedando de manera correcta.

11

También podría gustarte