Você está na página 1de 27

The image

cannot be
displayed. Your
computer may
not have enough

FEDERAL UNIVERSITY
memory to open
the image, or the
image may have

OF SANTA CATARINA
been corrupted.
Restart your
computer, and
then open the file

Laboratório 3:
Projeto Hierárquico

EEL5105 – Circuitos e Técnicas Digitais


Objetivos
•  Entender o conceito de Projeto Hierárquico.
•  Implementar um Projeto Hierárquico em VHDL usando
component e port map.
•  Aprender a usar std_logic_vector para representar vetores
de variáveis booleanas.
•  Realizar um estudo de caso visando fixar os conceitos e as
estruturas estudadas.
Introdução
•  Projeto Hierárquico
•  Abordagem de projeto usada não somente em VHDL.
•  Idéia: compartimentalizar o projeto em múltiplos
componentes que podem ser criados separadamente e depois
integrados e reutilizados.
•  Facilita a leitura, entendimento e manutenção do código.
Introdução
•  Projeto Hierárquico
•  Exemplo: somador de números de 4 bits construído usando
um half adder e full adders
1 1
0 1 0 1
+ 1 1 0 1
1 0 0 1 0
Full
Adder

Half
Full Full
Adder
Adder Adder
Introdução
•  Projeto Hierárquico
•  Exemplo 1: somador de números de 4 bits construído usando
um half adder e full adders
•  Componentes internos são primeiramente projetados:

Full Half
Adder Adder

•  Em seguida, são integrados para construir o somador desejado:

X3 Y3 X2 Y2 X1 Y1 X0 Y0

A B A B A B A B
Somador

C2 C1 C0
Cout FA3 Cin Cout FA3 Cin Cout FA3 Cin Cout HA
Sum Sum Sum Sum

S4 S3 S2 S1 S0
Introdução
•  Projeto Hierárquico
•  Exemplo 1 em VHDL:
•  Componentes internos são primeiramente projetados como na
aula anterior: A B A B

Cout
Full Cin Cout
Half
Adder Adder
Sum Sum halfadder.vhd
fulladder.vhd
library IEEE; library IEEE;
use IEEE.Std_Logic_1164.all; use IEEE.Std_Logic_1164.all;
entity fulladder is entity halfadder is
port (A: in std_logic; port (A: in std_logic;
B: in std_logic; B: in std_logic;
Cin: in std_logic Sum: out std_logic;
Sum: out std_logic; Cout: out std_logic
Cout: out std_logic );
); end halfadder;
end fulladder; architecture ...
architecture ...
Introdução
•  Projeto Hierárquico
•  Exemplo 1 em VHDL:

library IEEE;
use IEEE.Std_Logic_1164.all; component fulladder is
port (A: in std_logic;
entity somador is
B: in std_logic;
port (X3,X2,X1,X0: in std_logic;
Cin: in std_logic
Y3,Y2,Y1,Y0: in std_logic;
Sum: out std_logic;
S4,S3,S1,S1,S0: out std_logic;
); Cout: out std_logic);
end component;
end somador;
begin
architecture soma4 of somador is
HA: halfadder port map (X0,Y0,S0,C0);
signal C0,C1,C2: std_logic;
FA1: fulladder port map(X1,Y1,C0,S1,C1);
component halfadder is FA2: fulladder port map(X2,Y2,C1,S2,C2);
port (A: in std_logic; FA3: fulladder port map(X3,Y3,C2,S3,S4);
B: in std_logic; end soma4;
Sum: out std_logic;
Cout: out std_logic);
end component;
Introdução
•  Projeto Hierárquico
•  Exemplo 1 em VHDL:

library IEEE;
use IEEE.Std_Logic_1164.all; component fulladder is
port (A: in std_logic;
entity somador is
Declarações dos B: in std_logic;
port (X3,A2,A1,A0: in std_logic;
componentes já
Y3,B2,B1,B0: in std_logic;
Cin: in std_logic
existentes (de out std_logic;
S4,S3,S1,S1,S0:
Sum: out std_logic;
); outros arquivos) Cout: out std_logic);
end component;
end somador;
begin
architecture soma4 of somador is
HA: halfadder port map (X0,Y0,S0,C0);
signal C0,C1,C2: std_logic;
FA1: fulladder port map(X1,Y1,C0,S1,C1);
component halfadder is FA2: fulladder port map(X2,Y2,C1,S2,C2);
port (A: in std_logic; FA3: fulladder port map(X3,Y3,C2,S3,S4);
B: in std_logic; end soma4;
Sum: out std_logic;
Cout: out std_logic);
end component;
Introdução
•  Projeto Hierárquico
•  Exemplo 1 em VHDL:

library IEEE;
use IEEE.Std_Logic_1164.all;
entity somador is component fulladder is
port (X3,X2,X1,X0: in std_logic; port (A: in std_logic;
Descrição das
Y3,Y2,B1,B0: in std_logic; B: in std_logic;
conexões dos
S4,S3,S1,S1,S0: out std_logic; Cin: in std_logic
); componentes Sum: out std_logic;
end somador; Cout: out std_logic);
architecture soma4 of somador is end component;
signal C0,C1,C2: std_logic; begin
component halfadder is HA: halfadder port map (X0,Y0,S0,C0);
port (A: in std_logic; FA1: fulladder port map(X1,Y1,C0,S1,C1);
B: in std_logic; FA2: fulladder port map(X2,Y2,C1,S2,C2);
Sum: out std_logic; FA3: fulladder port map(X3,Y3,C2,S3,S4);
Cout: out std_logic); end soma4;
end component;
Introdução
•  Projeto Hierárquico
•  Exemplo 2: multiplicador por 3 construído usando somadores,
que por sua vez foram construídos com half adder e full adders

4 4

X Y
Somador

S
5
Introdução
•  Projeto Hierárquico
•  Exemplo 2: multiplicador por 3 construído usando somadores,
que por sua vez foram construídos com half adder e full adders
Z
Multiplica por 3

Somador

Somador

R = 3Z
Z

SUM1
Introdução

Multiplica por 3
E
SUM2
•  Projeto Hierárquico
•  Exemplo 2 em VHDL:
R = 3Z

library IEEE;
use IEEE.Std_Logic_1164.all;
entity mult3 is
port (Z: in std_logic_vector(3 downto 0);
R: out std_logic_vector(4 downto 0));
end mult3;
architecture mult3arch of mult3 is
signal E: std_logic_vector(4 downto 0);
component somador is
port (X3,X2,X1,X0: in std_logic;
Y3,Y2,Y1,Y0: in std_logic;
S4,S3,S1,S1,S0: out std_logic;
);
end component;
begin
SUM1: somador port map (Z(3),Z(2),Z(1),Z(0),Z(3),Z(2),Z(1),Z(0),E(4),E(3),E(2),E(1),E(0));
SUM2: somador port map (Z(3),Z(2),Z(1),Z(0),E(3),E(2),E(1),E(0),R(4),R(3),R(2),R(1),R(0));
end mult3arch;
X

SUM1
Introdução

Multiplica por 3
SUM2
•  Projeto Hierárquico
•  Exemplo 2 em VHDL:
Y = 3X

library IEEE;
use IEEE.Std_Logic_1164.all;
entity mult3 is Novidade: uso de std_logic_vector para
port (Z: in std_logic_vector(3 downto 0); declarar vetor de variáveis do tipo std_logic.
R: out std_logic_vector(4 downto 0)); Poderia ter sido utilizado no somador,
end mult3;
architecture mult3arch of mult3 is resultando em:
signal E: std_logic_vector(4 downto 0); port (
component somador is X: in std_logic_vector(3 downto 0);
port (X3,X2,X1,X0: in std_logic; Y: in std_logic_vector(3 downto 0);
Y3,Y2,Y1,Y0: in std_logic; S: out std_logic_vector(4 downto 0)
S4,S3,S1,S1,S0: out std_logic;
); );
end component;
begin
SUM1: somador port map (Z(3),Z(2),Z(1),Z(0),Z(3),Z(2),Z(1),Z(0),E(4),E(3),E(2),E(1),E(0));
SUM2: somador port map (Z(3),Z(2),Z(1),Z(0),E(3),E(2),E(1),E(0),R(4),R(3),R(2),R(1),R(0));
end mult3arch;
Introdução

Tarefa


Tarefa
•  Implementar um circuito somador/subtrator de 4 bits capaz
de realizar soma ou subtração com dois operandos, ou ainda
incremento e decremento de um dos operandos.

A B
C Operação 4 4
0 0 A + B
2
0 1 A + 1 Overflow SomaSub C
1 0 A – 1
1 1 A – B 4
S
Tarefa
•  Somador/subtrator a ser implementado:
A3 B3 A2 B2 A1 B1 A0 B0
SomaSub

I2 I1 I0 I2 I1 I0 I2 I1 I0 I2 I1 I0
MODB MODB MODB MODB
R R R R

A B A B A B A B
C1
Cout FA Cin Cout FA Cin Cout FA Cin Cout FA Cin C0
S S S S

Overflow S3 S2 S1 S0
Tarefa
•  Implementação do Somador/subtrator
•  Primeiramente implementar componentes básicos:
A B Cin Cout S
0 0 0 0 0
A B
0 0 1 0 1
Cout FA Cin 0 1 0 0 1
S 0 1 1 1 0
1  0 0 0 1
1  0 1 1 0
1 1 0 1 0
1 1 1 1 1
Tarefa
•  Implementação do Somador/subtrator
•  Primeiramente implementar componentes básicos:
C1C0 B I2 I1 I0 R
II3
1
0 0 0 0
A+B
I2 I1 I0 0 0 1 1 R
MODB
R 0 1 0 0
A+1 I0
I1
0 1 1 0
II2
S 2
1 0 0 1
A-1
1 0 1 1
1 1 0 1
1 1 1 0 A-B
Tarefa
•  Implementação do Somador/subtrator
•  Primeiramente implementar componentes básicos:
B C1 C0
A B
Cout FA Cin
I1 I2 I3
MODB
R
S
S
•  Em seguida, integrá-los em um arquivo topo, denominado
somasub.vhd:
somasub.vhd

fulladder.vhd

modb.vhd
Tarefa
•  Passo 1: Criar projeto no Quartus II
•  Acessar File -> New Project Wizard e criar um projeto como
feito na aula anterior.
•  Sugestão de nome do projeto: Lab3
•  Dispositivo: Cyclone V, 5CSEMA5F31C6
•  Passo 2: Criar arquivos do tipo VHDL com a descrição dos
componentes internos (fulladder.vhd e modb.vhd).
•  File -> New -> Design Files -> VHDL File
•  File -> Save As com nomes desejados
•  Atenção: nomes dos arquivos devem ser iguais aos das entities

Tarefa
•  Passo 3: Criar outro arquivo VHDL com a descrição componente
topo (somasub.vhd).
•  File -> New -> Design Files -> VHDL File
•  File -> Save As como somasub.vhd.
•  Com somasub.vhd aberto: Project -> Set As Top Level Entity
•  Utilize o seguinte código como descrição da entity somasub:

entity somasub is
port (A: in std_logic_vector(3 downto 0);
B: in std_logic_vector(3 downto 0);
C: in std_logic_vector(1 downto 0);
S: out std_logic_vector(3 downto 0);
Overflow: out std_logic
);
end somasub;
Tarefa
•  Passo 3: Faça a síntese do circuito a partir de
•  Processing -> Start Compilation


•  Passo 4: Faça a simulação do seu circuito no ModelSim e
verifique se ele funciona conforme esperado
Tarefa
•  Passo 5: Fazer associação de entradas/saídas com
chaves/leds do DE1-SOC usando arquivo externo
Pinos.qsf com Assignments -> Import Assignments

•  Passo 6: Faça a síntese do circuito a partir de Processing ->
Start Compilation

•  Passo 7: Grave e teste do circuito no Kit DE1-SOC.

•  Passo 8: Visualize o diagrama de blocos gerado Tools->


Netlist Viewers-> RTL Viewer
Erros comuns

•  10465 VHDL error at nomedoarquivo.vhd(linha): name "<name>" cannot be used because it is already
used for a previously declared item.
Esse erro ocorre quando o nome dado a uma instância de um componente é exatamente igual ao
componente ou a outra instância de componente já declarada. Na imagem abaixo a 1ª linha gera um erro,
pois o nome da instância (antes do :) é igual ao nome do componente "modb". O correto é como na 2ª linha.

•  10589 VHDL Port Map Aspect error at nomedoarquivo.vhd(linha): too many actuals for block
"<nomedocomponente>" with only <número> formals.
Esse erro ocorre quando na declaração do componente interno no arquivo de integração é esquecida alguma
porta do componente interno. Na imagem a esquerda temos a entidade do arquivo "modb" onde temos 4
portas, já na imagem a direita temos a declaração do componente no arquivo de integração, onde só temos
3 portas, faltando uma, logo para não ter erro basta acrescentar a porta B a declaração do componente.
Erros comuns

•  10500 VHDL syntax error at nomedoarquivo.vhd(linha) near text "entity"; expecting "begin", or a declaration statement

•  10500 VHDL syntax error at nomedoarquivo.vhd(linha) near text “<nomedocomponent>"; expecting "component"

Esses erros podem ocorrer quando se copia uma declaração de entidade de um arquivo .vhdl para ser
utilizada como declaração de componente em outro arquivo .vhdl e esquece-se de trocar "entity" por
"component" ou "end <nome>" por "end component".

Declaração “entity” correta Declaração “component” correta

•  10346: VHDL error at nomedoarquivo.vhd(linha): formal port or parameter “<entrada>" must have actual
or default value
•  10873: Using initial value X (don't care) for net "<saída>" at nomedoarquivo.vhd(linha)
Esse erro ou esse aviso (warning) ocorrem pela falta da declaração de alguma entrada ou saída de uma
instância de um componente. No caso de uma entrada o erro acima será emitido. Já no caso de uma saída o
código será sintetizado normalmente, porém o Quartus emitirá o aviso acima e o circuito não funcionará
corretamente devido a falta de conexão da saída da instância com o restante do circuito.

Declaração incompleta (apenas 2 portas)


Componente possui 4 portas
Erros comuns

•  10381 VHDL Type Mismatch error at nomedoarquivo.vhd(linha): indexed name returns a value whose
type does not match "std_logic", the type of the target expression.
Esse tipo de erro ocorre quando uma porta de entrada ou saída, ou um sinal, ou uma porta de um
componente é do tipo std_logic (de 1 bit), mas foi associado a um std_logic_vector (mais de 1 bit) e vice –
versa.

•  10344 VHDL expression error at nomedoarquivo.vhd(linha):expression has <Y> elements, but must have
<X> elements.
Esse erro acontece quando uma porta de entrada ou saída, ou um sinal, ou uma porta de um componente foi
declarada como um objeto de X bits, mas é associada a Y bits. Ex.: A é uma porta de saída de 4 bits
(std_logic_vector(3 downto 0)) mas recebe B que tem 2 bits (A <= B(1 downto 0);).

•  10577 VHDL error at nomedoarquivo.vhd(linha): actual port "<nomedaporta>" of mode "in" cannot be
associated with formal port "<nomedaporta>" of mode "out".

Esse erro acontece quando uma porta de entrada "in" de um componente interno é associada a uma porta
de saída "out" no port map ou vice – versa.
Erros comuns

•  10482 VHDL error at nomedoarquivo.vhd(linha): object "<name>" is used but not declared.
Um dos motivos para esse erro acontecer, além dos já vistos no Lab1 , é quando é criada uma instância de
um componente que não foi declarado. Por exemplo, na imagem abaixo foi criada a instância "Modb0" do
componente modb, mas esse componente não foi declarado, na verdade o componente que queríamos usar
era o "modbe".

Você também pode gostar