Você está na página 1de 23

UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ

DEPARTAMENTO ACADÊMICO DE ELETRÔNICA


BACHARELADO EM ENGENHARIA ELETRÔNICA
PROJETO DE CIRCUITOS INTEGRADOS SEMIDEDICADOS

Relatório de Projeto

Projeto 01 – Projeto de Circuitos Combinacionais

Elaboração:
Gustavo Vinicius Pelisser de Souza
Lucas Ribeiro

CAMPO MOURÃO
PERÍODO LETIVO <2022/1>
1. Problema

O problema do projeto 01 da disciplina de projetos integrados é criar, por meio da


linguagem de descrição de hardware, um divisor de 4 bits por sucessivas subtrações, ou
seja, utilizar o conceito primário da divisão. As próximas sessões trataram do
desenvolvimento do hardware utilizando o conceito de projeto hierárquico.

2. Arquitetura de Hardware

Os quadros 00, 01, 02, 03, 04 abaixo mostram a entidades de hardware utilizadas
para a construção do projeto completo, com bloco de subtração completo, bloco com a
subtração com as entradas de 4 bits, bloco comparador e blocos multiplexadores para
seleção do sinal desejado.

Quadro 00 – Entidade do subtrator completo


ENTITY fullsub IS
PORT (A,B, BorrowIn: IN bit;
S, BorrowOut: OUT bit);
END ENTITY;

ARCHITECTURE comportamento OF fullsub IS


BEGIN
S <= (A xor B) xor BorrowIn;
BorrowOut <= ((B and BorrowIn) or (not A and BorrowIn) or
(B and not A));

END ARCHITECTURE;

Quadro 01 – Entidade do subtrator de 4 bits


ENTITY subtrator4bits IS
PORT (AS,BS, BorrowIn: in bit_vector(3 DOWNTO 0);
SS, BorrowOut: out bit_vector(3
DOWNTO 0));
END ENTITY;

ARCHITECTURE comportamento OF subtrator4bits IS

COMPONENT fullsub IS
PORT (A,B, BorrowIn: IN bit;
S, BorrowOut: OUT bit);
END COMPONENT;

SIGNAL BORROW: bit_vector(3 DOWNTO 0);

BEGIN

sub0: fullsub PORT MAP(

A => AS(0),
B => BS(0),
BorrowIn => '0',
S => SS(0),
BorrowOut => BORROW(0)

);

sub1: fullsub PORT MAP(

A => AS(1),
B => BS(1),
BorrowIn => BORROW(0),
S => SS(1),
BorrowOut => BORROW(1)

);

sub2: fullsub PORT MAP(

A => AS(2),
B => BS(2),
BorrowIn => BORROW(1),
S => SS(2),
BorrowOut => BORROW(2)

);

sub3: fullsub PORT MAP(

A => AS(3),
B => BS(3),
BorrowIn => BORROW(2),
S => SS(3),
BorrowOut => BORROW(3)

);

END ARCHITECTURE;

Quadro 02 – Entidade do comparador


LIBRARY ieee;
USE ieee.numeric_std.all;
use ieee.std_logic_1164.all;

ENTITY AmaiorB IS
PORT( A, B: bit_vector(3 DOWNTO 0);
MAIOR: OUT bit);
END ENTITY;
ARCHITECTURE comportamento OF AmaiorB IS
BEGIN

MAIOR <= (((not B(3)) and A(3)) OR ((A(3) XNOR B(3)) and ((not
B(2)) and A(2))) OR ((A(3) XNOR B(3)) and (A(2) XNOR B(2)) and
((not B(1)) and A(1))) OR ((A(3) XNOR B(3)) and (A(2) XNOR B(2))
and (A(1) xnor B(1)) and (not B(0) and A(0)))) OR ((A(3) xnor B(3))
and (A(2) xnor B(2)) and (A(1) xnor B(1)) and (A(0) xnor B(0))) when
(A > "0000" and B > "0000") ELSE '0';

END ARCHITECTURE;

Quadro 03 – Entidade do Multiplexador do


quosciente
LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_signed.all;
use ieee.std_logic_unsigned.all;

ENTITY MuxQuosciente IS
PORT(Selecionador: IN bit; Resultado_Anterior: IN
std_logic_vector (3 downto 0);
Quosciente: OUT std_logic_vector (3 downto 0));
END ENTITY;

ARCHITECTURE comportamento OF MuxQuosciente IS

BEGIN

Quosciente <= Resultado_Anterior WHEN Selecionador = '0'


ELSE std_logic_vector(unsigned(Resultado_Anterior) + "0001");
END ARCHITECTURE;

Quadro 04 – Entidade do Multiplexador do resto


LIBRARY ieee;
USE ieee.numeric_std.all;
use ieee.std_logic_1164.all;

ENTITY MuxResto IS
PORT(Selecionador: IN bit; A, ResultadoSub:
std_logic_vector (3 downto 0);
A_ResultadoSub: OUT std_logic_vector (3
downto 0));
END ENTITY;

ARCHITECTURE comportamento OF MuxResto IS


BEGIN

A_ResultadoSub <= ResultadoSub WHEN Selecionador = '1'


ELSE A;

END ARCHITECTURE;

3. Testbenchs

Para cada bloco foi feito um testbench com o objetivo de testar cada bloco
individualmente. Os quadros abaixo mostram o código desenvolvido e as imagens
mostram o resultado da simulação.

Quadro 05 – Testbench subtrator


ENTITY fullsub IS
PORT (A,B, BorrowIn: IN bit;
S, BorrowOut: OUT bit);
END ENTITY;

ARCHITECTURE comportamento OF fullsub IS


BEGIN
S <= (A xor B) xor BorrowIn;
BorrowOut <= ((B and BorrowIn) or (not A and BorrowIn) or (B and not
A));

END ARCHITECTURE;

ENTITY testsub IS
END ENTITY;

ARCHITECTURE comportamento OF testsub IS


COMPONENT fullsub IS
PORT (A,B, BorrowIn: IN bit;
S, BorrowOut: OUT bit);
END COMPONENT;

SIGNAL A,B,BorrowIn,S,BorrowOut: bit;

BEGIN
bc1 : fullsub PORT MAP(A,B,BorrowIn,S,BorrowOut);
PROCESS
BEGIN

BorrowIn <= '0'; WAIT FOR 100 ns;


A <='1'; WAIT FOR 100 ns;
B <='1'; WAIT FOR 100 ns;
B <='0'; WAIT FOR 100 ns;
A <='0'; WAIT FOR 100 ns;

END PROCESS;

END ARCHITECTURE;

Quadro 06 – Waveform subtrator

Quadro 07 – Testbench subtrator 4 bits


ENTITY fullsub IS
PORT (A,B, BorrowIn: IN bit;
S, BorrowOut: OUT bit);
END ENTITY;

ARCHITECTURE comportamento OF fullsub IS


BEGIN
S <= (A xor B) xor BorrowIn;
BorrowOut <= ((B and BorrowIn) or (not A and BorrowIn) or (B and not
A));

END ARCHITECTURE;

ENTITY subtrator4bits IS
PORT (AS,BS, BorrowIn: in bit_vector(3 DOWNTO 0);
SS, BorrowOut: out bit_vector(3 DOWNTO 0));
END ENTITY;

ARCHITECTURE comportamento OF subtrator4bits IS

COMPONENT fullsub IS
PORT (A,B, BorrowIn: IN bit;
S, BorrowOut: OUT bit);
END COMPONENT;

SIGNAL BORROW: bit_vector(3 DOWNTO 0);


SIGNAL A,B: bit_vector(3 downto 0);
BEGIN

sub0: fullsub PORT MAP(

A => AS(0),
B => BS(0),
BorrowIn => '0',
S => SS(0),
BorrowOut => BORROW(0)

);

sub1: fullsub PORT MAP(

A => AS(1),
B => BS(1),
BorrowIn => BORROW(0),
S => SS(1),
BorrowOut => BORROW(1)

);

sub2: fullsub PORT MAP(

A => AS(2),
B => BS(2),
BorrowIn => BORROW(1),
S => SS(2),
BorrowOut => BORROW(2)

);

sub3: fullsub PORT MAP(

A => AS(3),
B => BS(3),
BorrowIn => BORROW(2),
S => SS(3),
BorrowOut => BORROW(3)

);
PROCESS
BEGIN

A <= "1111"; WAIT FOR 100 ns;


B <= "1111"; WAIT FOR 100 ns;
B <= "1110"; WAIT FOR 100 ns;
B <= "0111"; WAIT FOR 100 ns;
B <= "0001"; WAIT FOR 100 ns;
B <= "0011"; WAIT FOR 100 ns;
END PROCESS;
END ARCHITECTURE;

Quadro 08 – Waveform subtrator 4 bits

Quadro 09 – Testbanch Comparador


ENTITY AmaiorB IS
PORT( A, B: bit_vector(3 DOWNTO 0);
MAIOR: OUT bit);
END ENTITY;

ARCHITECTURE comportamento OF AmaiorB IS


BEGIN
MAIOR <= (((not B(3)) and A(3)) OR ((A(3) XNOR B(3)) and ((not B(2)) and A(2)))
OR ((A(3) XNOR B(3)) and (A(2) XNOR B(2)) and ((not B(1)) and A(1))) OR ((A(3)
XNOR B(3)) and (A(2) XNOR B(2)) and (A(1) xnor B(1)) and (not B(0) and A(0))))
OR ((A(3) xnor B(3)) and (A(2) xnor B(2)) and (A(1) xnor B(1)) and (A(0) xnor
B(0))) when (A > "0000" and B > "0000") ELSE '0';

END ARCHITECTURE;

ENTITY testecomparador IS
END ENTITY;

ARCHITECTURE comportament OF testecomparador IS

COMPONENT AmaiorB IS
PORT( A, B: bit_vector(3 DOWNTO 0);
MAIOR: OUT bit);
END COMPONENT;

SIGNAL A,B : bit_vector(3 downto 0);


SIGNAL MAIOR: bit;

BEGIN

bc1: AmaiorB PORT MAP(A,B,MAIOR);


PROCESS
BEGIN

A <= "1111"; WAIT FOR 100 ns;


B <= "1111"; WAIT FOR 100 ns;
B <= "0000"; WAIT FOR 100 ns;
B <= "0101"; WAIT FOR 100 ns;

END PROCESS;
END ARCHITECTURE;
Quadro 10 – Waveform comparador 4 bits

Quadro 11 – Testbanch Mux Quosciente


LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_signed.all;
use ieee.std_logic_unsigned.all;

ENTITY MuxQuosciente IS
PORT(Selecionador: IN bit; Resultado_Anterior: IN std_logic_vector (3
downto 0);
Quosciente: OUT std_logic_vector (3 downto 0));
END ENTITY;

ARCHITECTURE comportamento OF MuxQuosciente IS

BEGIN

Quosciente <= Resultado_Anterior WHEN Selecionador = '0' ELSE


std_logic_vector(unsigned(Resultado_Anterior) + "0001");
END ARCHITECTURE;

LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_signed.all;
use ieee.std_logic_unsigned.all;

ENTITY testemux IS
END ENTITY;

ARCHITECTURE comportamento OF testemux IS

COMPONENT MuxQuosciente IS
PORT(Selecionador: IN bit;
Resultado_Anterior: IN std_logic_vector (3 downto 0);
Quosciente: OUT std_logic_vector (3 downto 0));
END COMPONENT;

SIGNAL Selecionador: bit;


SIGNAL Resultado_Anterior: std_logic_vector(3 downto 0);
SIGNAL Quosciente: std_logic_vector(3 downto 0);

BEGIN

bc1: MuxQuosciente PORT MAP(Selecionador,Resultado_Anterior,Quosciente);


PROCESS
BEGIN

SELECIONADOR <= '1' ; WAIT FOR 100 ns;


Resultado_Anterior <= "0000"; WAIT FOR 100 ns;
SELECIONADOR <= '0' ; WAIT FOR 100 ns;
Resultado_Anterior <= "0000"; WAIT FOR 100 ns;
SELECIONADOR <= '1' ; WAIT FOR 100 ns;
Resultado_Anterior <= "1111"; WAIT FOR 100 ns;
SELECIONADOR <= '0' ; WAIT FOR 100 ns;
Resultado_Anterior <= "1111"; WAIT FOR 100 ns;

END PROCESS;
END ARCHITECTURE;

Quadro 12 – Testbanch Mux resto


LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_signed.all;
use ieee.std_logic_unsigned.all;

ENTITY MuxResto IS
PORT(Selecionador: IN bit; A, ResultadoSub: std_logic_vector (3
downto 0);
A_ResultadoSub: OUT std_logic_vector (3 downto
0));
END ENTITY;

ARCHITECTURE comportamento OF MuxResto IS

BEGIN

A_ResultadoSub <= ResultadoSub WHEN Selecionador = '1' ELSE


A;

END ARCHITECTURE;

LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_signed.all;
use ieee.std_logic_unsigned.all;

ENTITY testemux2 IS
END ENTITY;

ARCHITECTURE comportamento OF testemux2 IS

COMPONENT MuxResto IS
PORT(Selecionador: IN bit; A, ResultadoSub: std_logic_vector (3
downto 0);
A_ResultadoSub: OUT std_logic_vector (3 downto
0));
END COMPONENT;

SIGNAL Selecionador: bit;


SIGNAL ResultadoSub: std_logic_vector(3 downto 0);
SIGNAL A_ResultadoSub: std_logic_vector(3 downto 0);

BEGIN

bc1: MuxResto PORT


MAP(Selecionador,ResultadoSub,A_ResultadoSub);
PROCESS
BEGIN
Selecionador <= '1' ; WAIT FOR 100 ns;
A_ResultadoSub <= "0000"; WAIT FOR 100 ns;
Selecionador <= '0' ; WAIT FOR 100 ns;
A_ResultadoSub <= "0000"; WAIT FOR 100 ns;
Selecionador <= '1' ; WAIT FOR 100 ns;
A_ResultadoSub <= "1111"; WAIT FOR 100 ns;
Selecionador <= '0' ; WAIT FOR 100 ns;
A_ResultadoSub <= "1111"; WAIT FOR 100 ns;
Selecionador <= '1' ; WAIT FOR 100 ns;
A_ResultadoSub <= "1101"; WAIT FOR 100 ns;
A_ResultadoSub <= "0111"; WAIT FOR 100 ns;

END PROCESS;
END ARCHITECTURE;

Quadro 13 – Waveform multiplexador resto

Quadro 14 – Testbanch Divisor


ENTITY SistemaGeral IS
PORT (A,B : IN bit_vector(3 downto 0);
S : out bit_vector(3 downto 0);
R : out bit_vector(3 downto 0));
END ENTITY;
ARCHITECTURE comportamento OF SistemaGeral IS

COMPONENT MuxResto IS
PORT(Selecionador: IN bit; A, ResultadoSub: std_logic_vector (3
downto 0);
A_ResultadoSub: OUT std_logic_vector (3 downto
0));
END COMPONENT;

COMPONENT MuxQuosciente IS
PORT(Selecionador: IN bit; Resultado_Anterior: IN
std_logic_vector (3 downto 0);
Quosciente: OUT std_logic_vector (3 downto 0));
END COMPONENT;

ENTITY AmaiorB IS
PORT( A, B: bit_vector(3 DOWNTO 0);
MAIOR: OUT bit);
END COMPONENT;

COMPONENT subtrator4bits IS
PORT (AS,BS, BorrowIn: in bit_vector(3 DOWNTO 0);
SS, BorrowOut: out bit_vector(3 DOWNTO 0));
END COMPONENT;

SIGNAL A,B,S,R: bit_vector(3 downto 0);


SIGNAL MAIOR: bit;
SIGNAL subtrator: bit_vector(3 donwto 0);

bc1 : AmaiorB PORT MAP(


A => A,
B => B,
MAIOR => MAIOR
);

bc3: subtrator4bits PORT MAP(


AS => A,
BS => B,
BorrowIn => '0',
SS => subtrator
bc2: MuxResto PORT MAP(
Selecionador => MAIOR,
A => A,
ResultadoSub => subtrator
);

END ARCHITECTURE;

Entidade alto nível


ENTITY comportamentoS IS
END ENTITY;

ARCHITECTURE comportamento OF comportamentoS IS

COMPONENT SistemaGeral IS
PORT (A,B : IN bit_vector(3 downto 0);
S : out bit_vector(3 downto 0);
R : out bit_vector(3 downto 0));
END COMPONENT;

SIGNAL A,B: bit_vector(3 downto 0);


SIGNAL S,R: bit_vector(3 downto 0);

BEGIN
bc1: SistemaGeral PORT MAP(A,B,S,R);

PROCESS
BEGIN

A <= "1111" ; WAIT FOR 100 ns;


B <= "1111" ; WAIT FOR 100 ns;
A <= "1111" ; WAIT FOR 100 ns;
B <= "0111" ; WAIT FOR 100 ns;
A <= "0000" ; WAIT FOR 100 ns;
A <= "1111" ; WAIT FOR 100 ns;

END PROCESS;
END ARCHITECTURE;
4. RTL Viewer

Esta sessão tem o objetivo de mostrar a conexão dos blocos descritos em


hardwares no nível de portas lógicas.

Quadro 15 – Bloco divisor e subtrator


Quadro 16 – Bloco 7 segmentos

5. Technology Map Viewer

Esta sessão tem como objetivo mostrar como a descrição de hardware foi
mapeada no software Quartus Prime.

Quadro 17 – Bloco divisor subtrator


Quadro 18 – Bloco Mux Resto
Quadro 19 – Bloco Mux Quosciente

Quadro 20 – Bloco do sistema completo


6. onsumo de Hardware e Simulação temporal

O sistema completo contou com 238 elementos lógicos e 26 pinos, sendo


12 de entrada, referentes aos bits da palavra A e B e do primeiro resultado
anterior que foi setado como zero, 14 de saída, referente a cada display de 7
segmentos.

Quadro 21 – Consumo de Hardware

Quadro 22 – Simulação temporal do Divisor


7. Considerações Finais

A linguagem de descrição de hardware é uma ferramenta utilizada para a


otimização na construção de hardwares. Utilizando-se do software Quartus prime
foi possível criar o projeto proposto de um divisor 4x4 compreendendo todos os
conceitos abordados em aula.
A construção de um projeto hierárquico de ponta a ponta permitiu o
entendimento de como a divisão de um problema em partes menores pode
melhorar a performance de forma signficativa do desenvolvimento de Projetos de
descrição de hardware. Além, a seperação em blocos menores compreende o
conceito de reutilização, termo fortemente usado na área pelo poder de
reaproveitamento na criação de diversos projetos.
Por fim, o desenvolvimento lógico carregado pelo aluno durante o curso,
somado ao desenolvimento lógico em uma nova ferramenta de ensino prático para
o dia a dia de um Engenheiro de hardware, apresenta explicitamente a contribuição
para a formação do estudante.

Você também pode gostar