Lab6 G7

Universidad Nacional de San Agustín Facultad de Ingeniería de Producción y Servicios Escuela Profesional de Ingeniería E

Views 124 Downloads 3 File size 509KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Universidad Nacional de San Agustín Facultad de Ingeniería de Producción y Servicios Escuela Profesional de Ingeniería Electrónica (EPIE)

Microelectronica

PRÁCTICA 06

7 de agosto del 2020 Ingeniero a cargo PhD. Alexander Hilario Tacuri Integrantes -Carrillo Taco Gonzalo Quinta

CUI: 20150579

-Gonzalez Coronel Obeth Milag

CUI: 20161838

-Mamani Villanueva Jhojan Felipe CUI: 20160383 -Valdivia Lajo Izler Friss

CUI: 20153275

Índice 1. Objetivos

2

2. Desarrollo de la práctica

2

3. Flujo de diseño

3

MICROELECTRONICA-2020A

1.

Práctica 06

7 de agosto del 2020

Objetivos Describir maquinas de estado finito en VHDL. Implementar un sistema digital: Unidad de ruta de datos y de control

2.

Desarrollo de la práctica Problema: Dado dos números unsigned A y B, diseñe un circuito que produce el cociente Q y el residuo R. El algoritmo que implementa la división tradicional es:

Figura 1: Algoritmo División

Una arquitectura iterativa es mostrada en la siguiente Figura para A con 6 bits y B con 4 bits. El registro R guarda el residuo. En este diseño, una operación de division comienza cuando E = 1 (Donde los valores A y B son capturados). Entonces, a cada ciclo del reloj se ejecuta i) Desplazamiento en el siguiente bit de A o ii) Desplazamiento en el siguiente bit de A y restamos B. La señal done es creada para indicar que la operación ha sido completada y el resultado aparece en Q y R. El contador de modulo 6 incluye una entrada síncrona sclr que limpia el contador cuando E = sclr = 1 y una salida zC que es activada cuando el contador llega a 5. Lef t shit register: Note que uno de los registros de desplazamiento incluye una entrada síncrona sclr que limpia la salida de los registros cuando E = sclr = 1 Cada componente secuencial tiene las entradas resetn y clock. Este circuito es un ejemplo de un sistema digital: incluye un circuito de ruta de datos y un circuito de control (FSM). El circuito de ruta de datos es hecho de componentes combinacionales y secuenciales.

2

MICROELECTRONICA-2020A

3.

Práctica 06

7 de agosto del 2020

Flujo de diseño Cree un nuevo proyecto Vivado. Seleccione el dispositivo FPGA Artix-7 Luego de ejecutar y abrir el programa Vivado, procedemos a crear un nuevo proyecto; para esta practica, el nombre del proyecto sera Labo 6

Figura 2: Entorno de Vivado. Crear nuevo proyecto

3

MICROELECTRONICA-2020A

Práctica 06

7 de agosto del 2020

Figura 3: Seleccionando FPGA Escriba el código VHDL para el circuito dado: Crear archivos separados para i) Contador modulo 6, ii) Registro de desplazamiento, iii) Registro de desplazamiento con entrada sclr, iv) Registro, v) Sumador, vi) decodificador de 7 segmentos y vii) Archivo principal. Para la realización de este proyecto, se utilizó el conocimiento adquirido a lo largo del curso de Microelectrónica, desde lo mas básico como lo es el Contador Modulo 6 en el cual se utilizo la librería IEEE.STD_LOGIC_unsigned.ALL para poder implementar las operaciones lógicas aritméticas como suma y la resta. En los Registros de desplazamiento, se puso en practica el uso de las listas de sensibilidad de los process que se aprendió con los documentos dispuestos y se aplicaron a los trabajos de laboratorio anteriores. Por ultimo, se implemento una FSM la cual se puede decir que es el cerebro del proyecto, ya que es el que gestiona las señales enviadas por los componentes descritos en la Figura.

I)

contador Modulo 6

4

MICROELECTRONICA-2020A

1 2 3

Práctica 06

7 de agosto del 2020

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_unsigned.ALL;

4 5 6 7 8 9 10 11 12

entity counter is Port ( E: in std_logic; clk: in std_logic; sclr: in std_logic; zc:out std_logic ); end counter;

13 14 15 16 17 18 19 20

architecture Behavioral of counter is signal Qs: std_logic_vector(3 downto 0); begin u1: process(clk) begin if (sclr='1') then Qs≤"0000";

21 22 23 24 25 26 27 28

29

II )

elsif( E='1' and clk'event and clk = '1') then Qs≤Qs+1; else Qs≤Qs; end if; end process; zc≤not(Qs(3)) and Qs(2) and Qs(1) and Qs(0);----- para que ... sea 7 end Behavioral;

Registro de Desplazamiento 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_unsigned.all; entity left_shift_register is Port ( clk: in std_logic; dataA: in std_logic_vector(5 downto 0); s_L: in std_logic; E: in std_logic; w: in std_logic; A: out std_logic_vector(5 downto 0) ); end left_shift_register; architecture Behavioral of left_shift_register is signal As:std_logic_vector(5 downto 0); begin u1: process(clk) begin if (E='0') then As≤As; elsif ( rising_edge(clk) and s_L = '1') then As≤dataA;

5

MICROELECTRONICA-2020A

23 24 25 26 27 28

III )

Práctica 06

elsif ( rising_edge(clk) and s_L = '0' As≤ As(4 downto 0)&w; end if; end process; A≤As; end Behavioral;

7 de agosto del 2020

) then

Registro de desplazamiento con entrada sclr 1 2

library IEEE; use IEEE.STD_LOGIC_1164.ALL;

3 4 5 6 7 8 9 10 11 12

entity left_shift_register2 is Port ( w: in std_logic; clk: in std_logic; dataR: in std_logic_vector(3 downto 0); sclr: in std_logic; s_L: in std_logic; E: in std_logic;

13 14 15 16

R: inout std_logic_vector(3 downto 0) ); end left_shift_register2;

17 18

architecture Behavioral of left_shift_register2 is

19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

IV )

begin u1: process(clk,sclr,s_L) begin if (E='0') then R≤R; elsif (sclr='1') then R≤"0000"; elsif (rising_edge(clk) and s_L='1') then R≤dataR; elsif ( rising_edge(clk) and s_L = '0') then R(3 downto 0)≤ R(2 downto 0)& w; end if; end process; end Behavioral;

Registro 1 2

library IEEE; use IEEE.STD_LOGIC_1164.ALL;

3 4 5 6 7 8 9

entity register_B is Port ( clk: in std_logic; E:in std_logic; dataB:in std_logic_vector(3 downto 0); B:out std_logic_vector(3 downto 0)

6

MICROELECTRONICA-2020A

10 11

Práctica 06

); end register_B;

12 13

architecture Behavioral of register_B is

14 15 16 17 18 19 20 21 22

V)

begin process(clk,E) begin if E='1' then B≤dataB; end if; end process; end Behavioral;

Sumador 1 2 3

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;

4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

VI )

entity sumador5 is Port ( b: in std_logic_vector(4 downto 0); a: in std_logic_vector(4 downto 0); cin: in std_logic; cout: out std_logic; R: out std_logic_vector(4 downto 0) ); end sumador5; architecture Behavioral of sumador5 is signal suma: std_logic_vector(5 downto 0); signal suma1: std_logic_vector(5 downto 0); signal Ac: std_logic_vector(5 downto 0); signal Bc: std_logic_vector(5 downto 0); signal cinc: std_logic_vector(5 downto 0); begin cinc≤"00000"&cin; Ac≤'0'&a; Bc≤'0'&b; suma1≤Ac+Bc; suma≤suma1+cinc; cout≤suma(5); R≤suma(4 downto 0); end Behavioral;

FSM 1 2 3 4 5 6

library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity FSM is Port ( clk: in std_logic; cout: in std_logic;

7

7 de agosto del 2020

MICROELECTRONICA-2020A

7 8 9

Práctica 06

E: in std_logic; zC: in std_logic; clr: in std_logic;

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

LAB: out std_logic; EA: out std_logic; EC: out std_logic; sclrC: out std_logic; sclrR: out std_logic; LR: out std_logic; ER: out std_logic; done: out std_logic ); end FSM; architecture Behavioral of FSM is type estados is (wt,s0,s1,s2,s3,final); signal estado: estados; begin u1: process(clk,estado) begin case (estado) is when wt=> EA≤'0'; LAB≤'0'; EC≤'0'; sclrC≤'1'; done≤'0'; sclrR≤'1'; ER≤'1'; LR≤'0'; when s0=> EA≤'1'; LAB≤'1'; EC≤'1'; sclrC≤'0'; done≤'0'; sclrR≤'1'; LR≤'0'; ER≤'1'; when s1=> EA≤'1'; LAB≤'1'; EC≤'1'; sclrC≤'0'; done≤'0'; sclrR≤'1'; LR≤'0'; ER≤'1'; when s2=> EA≤'1'; LAB≤'0'; EC≤'1'; sclrC≤'0'; done≤'0'; sclrR≤'0'; LR≤'1'; ER≤'1';

8

7 de agosto del 2020

MICROELECTRONICA-2020A

64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81

Práctica 06

7 de agosto del 2020

when s3=> EA≤'1'; LAB≤'0'; EC≤'1'; sclrC≤'0'; done≤'0'; sclrR≤'0'; LR≤'0'; ER≤'1'; when final=> EA≤'0'; LAB≤'1'; EC≤'1'; sclrC≤'0'; done≤'1'; sclrR≤'0'; ER≤'0'; LR≤'1';

82 83 84

end case; end process;

85 86 87 88 89 90 91 92 93 94 95 96

u2: process(clk,clr,estado) begin if clr='1' then estado≤wt; elsif rising_edge(clk) then case(estado) is when wt=> if(E='1') then estado≤s0; end if; when others=>

97 98 99 100 101 102

end case; elsif falling_edge(clk) then case(estado) is when s0=> estado≤s1;

103 104

when s1=> if (cout='1') then estado≤s2; elsif (cout='0') then estado≤s3; elsif (Zc='1') then estado≤final; end if;

105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120

when s2=> if (cout='1'and Zc='0') then estado≤s2; elsif (cout='0'and Zc='0') then estado≤s3; elsif (Zc='1') then estado≤final; end if;

9

MICROELECTRONICA-2020A

121 122 123 124 125 126 127 128 129 130 131 132 133 134 135

Práctica 06

7 de agosto del 2020

when s3=> if (cout='1' and Zc='0') then estado≤s2; elsif (cout='0'and Zc='0') then estado≤s3; elsif (Zc='1') then estado≤final; end if; when final=> if (clr='0') then estado≤final; elsif (clr='1') then estado≤wt; end if; when others=>

136 137

end case;

138 139 140 141

VII )

end if; end process; end Behavioral;

Archivo Principal 1 2

library IEEE; use IEEE.STD_LOGIC_1164.ALL;

3 4 5 6 7 8 9 10 11 12 13 14 15

entity circuito_digital is Port ( Rst:in std_logic; clk: in std_logic; E:in std_logic; portA: in std_logic_vector(5 downto 0); portB: in std_logic_vector(3 downto 0); Q:inout std_logic_vector(5 downto 0); R:inout std_logic_vector(3 downto 0); done: out std_logic ); end circuito_digital;

16 17 18 19 20 21 22 23 24 25

architecture Behavioral of circuito_digital is ---------------------FSM----------------------------component FSM Port ( clk: in std_logic; cout: in std_logic; E: in std_logic; zC: in std_logic; clr: in std_logic;

26 27 28 29 30 31 32

LAB: out std_logic; EA: out std_logic; EC: out std_logic; sclrC: out std_logic; sclrR: out std_logic; LR: out std_logic;

10

MICROELECTRONICA-2020A

33 34 35 36 37 38 39 40 41 42 43 44

Práctica 06

ER: out std_logic; done: out std_logic ); end component; component counter Port ( E: in std_logic; clk: in std_logic; sclr: in std_logic; zc:out std_logic ); end component;

45 46 47 48 49 50 51 52 53 54

component sumador5 Port ( b: in std_logic_vector(4 downto 0); a: in std_logic_vector(4 downto 0); cin: in std_logic; cout: out std_logic; R: out std_logic_vector(4 downto 0) ); end component;

55 56 57 58 59 60 61 62 63

component register_B Port ( clk: in std_logic; E:in std_logic; dataB:in std_logic_vector(3 downto 0); B:out std_logic_vector(3 downto 0) ); end component;

64 65 66 67 68 69 70 71 72

component left_shift_register2 Port ( w: in std_logic; clk: in std_logic; dataR: in std_logic_vector(3 downto 0); sclr: in std_logic; s_L: in std_logic; E: in std_logic;

73 74 75 76

R: inout std_logic_vector(3 downto 0) ); end component;

77 78 79 80 81 82 83 84 85 86

component left_shift_register Port ( clk: in std_logic; dataA: in std_logic_vector(5 downto 0); s_L: in std_logic; E: in std_logic; w: in std_logic; A: inout std_logic_vector(5 downto 0) );

87 88 89

end component ; signal cout:std_logic;

11

7 de agosto del 2020

MICROELECTRONICA-2020A

90

Práctica 06

7 de agosto del 2020

signal zC:std_logic;

91 92 93

signal LAB: std_logic; signal EA: std_logic;

94 95 96

signal EC: std_logic; signal sclrC: std_logic;

97 98 99 100 101

signal sclrR: std_logic; signal LR: std_logic; signal ER: std_logic;

102 103 104

signal BB: std_logic_vector(3 downto 0); signal BBp: std_logic_vector(4 downto 0);

105 106 107

signal Y: std_logic_vector(4 downto 0); signal Re: std_logic_vector(4 downto 0);

108 109

signal Reme: std_logic_vector(3 downto 0);

110 111 112

113 114

115

116

117 118

119 120

121

begin U1: FSM port map (clk=>clk,cout=>cout, E=>E, zC=>zC, ... clr=>Rst, LAB=>LAB, EA=>EA, EC=>EC, sclrC=>sclrC, sclrR=>sclrR, LR=>LR , ER=>ER, done=>done); U2: counter port map (E=>EC, clk=>clk, sclr=>sclrC, ... zc=>zc) ; U3: left_shift_register port map ( clk=>clk, ... dataA=>portA,s_L=>lab ,E=>EA, w=>cout, A=>Q); U4: register_b port map (clk=>clk, E=>LAB, dataB=>portB, ... B=>BB); BBp≤not('0'&BB); u5: sumador5 port map (b=>BBP, a=>Y, ... cin=>'1',cout=>cout,R=>Re); Reme≤Re(3 downto 0); u6: left_shift_register2 port map ( w=>Q(5), clk=>clk, ... dataR=>Reme, sclr=> sclrR, s_L=>LR, E=>ER,R=>R); Y≤R&Q(5);

122 123

end Behavioral;

Escriba el test-bench VHDL para probar los siguientes casos: - DataA = 010011 (19), DataB = 0100 (4) - DataA = 100111 (39), DataB = 1000 (8) - DataA = 110011 (51), DataB = 1110 (14) - DataA = 111100 (60), DataB = 1101 (13) - DataA = 011100 (28), DataB = 1001 (9) - DataA = 110101 (53), DataB = 0011 (3)

12

MICROELECTRONICA-2020A

I)

Práctica 06

7 de agosto del 2020

código Test Bench 1 2 3 4 5

library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity TB_sistema_digital is -- Port ( ); end TB_sistema_digital;

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54

architecture Behavioral of TB_sistema_digital is component circuito_digital Port ( Rst:in std_logic; clk: in std_logic; E:in std_logic; portA: in std_logic_vector(5 downto 0); portB: in std_logic_vector(3 downto 0); Q:inout std_logic_vector(5 downto 0); R:inout std_logic_vector(3 downto 0); done: out std_logic ); end component; signal Rst: std_logic; signal clk: std_logic:='0'; signal E: std_logic; signal portA: std_logic_vector(5 downto 0); signal portB: std_logic_vector(3 downto 0); signal Q: std_logic_vector(5 downto 0); signal R: std_logic_vector(3 downto 0); signal done: std_logic; begin DUT: circuito_digital port map (Rst=>Rst, clk=>clk, E=>E, portA=>portA, portB=>portB, Q=>Q, R=>R, done=>done); process (clk) begin clk≤not clk after 5 ns; end process; process begin Rst≤'1'; E≤'0'; portA≤"010011"; portB≤"0100"; wait for 15 ns; E≤'1'; Rst≤'0'; wait for 30 ns; E≤'0'; wait for 95 ns; ----------------------------------------------

13

MICROELECTRONICA-2020A

55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

Práctica 06

Rst≤'1'; E≤'0'; portA≤"100111"; portB≤"1000"; wait for 15 ns; E≤'1'; Rst≤'0'; wait for 30 ns; E≤'0'; wait for 95 ns; ----------------------------------------Rst≤'1'; E≤'0'; portA≤"011100"; portB≤"1001"; wait for 15 ns; E≤'1'; Rst≤'0'; wait for 30 ns; E≤'0'; wait for 95 ns; ---------------------------------wait; end process; end Behavioral;

Realice el Functional Simulation. Al simular los codigos mostrados, se obtienen la siguiente gráfica.

Figura 4: Diagrama de tiempos

14

7 de agosto del 2020

MICROELECTRONICA-2020A

Práctica 06

7 de agosto del 2020

Figura 5: Visualización de diagrama de tiempo para una división matemática

En la Figura 5 se muestra el trabajo realizado por el código implementado, los valores de A y B (PortA y PortB respectivamente) son cargados, Q es el cociente de la división y R el residuo. En la variable a se puede observar el desplazamiento y posterior carga de la suma realizada en el modulo Sumador. Se observa un contador del 1 al 7 en la señal Qs cuya finalidad es que se procesen los 6 datos del numero de entrada PortA y en el ultimo conteo, enviar las respuestas (Q y R) a los puertos de salida. Asignar entradas y salidas.

Figura 6: FPGA con los puertos implementados

15

MICROELECTRONICA-2020A

Práctica 06

7 de agosto del 2020

El archivo .XDC generado se muestra a continuación en el cual se puede apreciar los puertos de salida, entrada y escalares designados para este laboratorio. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property set_property

IOSTANDARD LVCMOS33 [get_ports {portA[5]}] IOSTANDARD LVCMOS33 [get_ports {portA[4]}] IOSTANDARD LVCMOS33 [get_ports {portA[3]}] IOSTANDARD LVCMOS33 [get_ports {portA[2]}] IOSTANDARD LVCMOS33 [get_ports {portA[1]}] IOSTANDARD LVCMOS33 [get_ports {portA[0]}] IOSTANDARD LVCMOS33 [get_ports {portB[3]}] IOSTANDARD LVCMOS33 [get_ports {portB[2]}] IOSTANDARD LVCMOS33 [get_ports {portB[1]}] IOSTANDARD LVCMOS33 [get_ports {portB[0]}] IOSTANDARD LVCMOS33 [get_ports {R[3]}] IOSTANDARD LVCMOS33 [get_ports {R[2]}] IOSTANDARD LVCMOS33 [get_ports {R[1]}] IOSTANDARD LVCMOS33 [get_ports {R[0]}] IOSTANDARD LVCMOS33 [get_ports {Q[5]}] IOSTANDARD LVCMOS33 [get_ports {Q[4]}] IOSTANDARD LVCMOS33 [get_ports {Q[3]}] IOSTANDARD LVCMOS33 [get_ports {Q[2]}] IOSTANDARD LVCMOS33 [get_ports {Q[1]}] IOSTANDARD LVCMOS33 [get_ports {Q[0]}] PACKAGE_PIN T17 [get_ports {portA[5]}] PACKAGE_PIN T18 [get_ports {portA[4]}] PACKAGE_PIN U17 [get_ports {portA[3]}] PACKAGE_PIN U18 [get_ports {portA[2]}] PACKAGE_PIN V16 [get_ports {portA[1]}] PACKAGE_PIN V17 [get_ports {portA[0]}] PACKAGE_PIN U19 [get_ports {portB[3]}] PACKAGE_PIN V19 [get_ports {portB[2]}] PACKAGE_PIN W18 [get_ports {portB[1]}] PACKAGE_PIN W19 [get_ports {portB[0]}] PACKAGE_PIN W14 [get_ports {Q[5]}] PACKAGE_PIN U15 [get_ports {Q[4]}] PACKAGE_PIN U16 [get_ports {Q[3]}] PACKAGE_PIN V13 [get_ports {Q[2]}] PACKAGE_PIN V14 [get_ports {Q[1]}] PACKAGE_PIN U14 [get_ports {Q[0]}] PACKAGE_PIN W17 [get_ports {R[3]}] PACKAGE_PIN V15 [get_ports {R[2]}] PACKAGE_PIN W15 [get_ports {R[1]}] PACKAGE_PIN W13 [get_ports {R[0]}] PACKAGE_PIN M18 [get_ports clk] PACKAGE_PIN V2 [get_ports done] PACKAGE_PIN V3 [get_ports E] PACKAGE_PIN V5 [get_ports Rst]

16