Escolar Documentos
Profissional Documentos
Cultura Documentos
Tutorial VHDL Epoca
Tutorial VHDL Epoca
O que significa VHDL? Very High Speed Integrated Circuit Hardware Description Language
Linguagem de Descrio de Hardware com nfase em Circuitos Integrados de altssima velocidade.
Caractersticas do VHDL
Linguagem concorrente. Todos os comandos simultaneamente (com exceo de processos) ocorrem
Caractersticas do VHDL
Projetar um sistema em VHDL geralmente mais difcil que escrever um programa para fazer a mesma coisa utilizando uma linguagem de programao como C
O cdigo VHDL executado em um simulador No h um executvel
Caractersticas do VHDL
Consideraes importantes
1. VHDL NO programao uma linguagem de
Conceitos necessrios
Algoritmos; Conceitos de linguagem de programao (para descrio comportamental); Circuitos Digitais; Arquitetura de computadores;
Breve Histrico
- final de 1960: primeiras Linguagem de Hardware; - 1973: projeto CONLAN (CONsensus LANguage); - 1983: relatrio final do CONLAN e a Linguagem ADA; - 1983: DoD inicia programa VHSIC (participao da IBM, Intermetrics e Texas Instruments; - 1986: a Intermetrics desenvolve compilador e simulador, criado um grupo de padronizao da IEEE para VHDL; - 1988: primeiros softwares so comercializados; - 1991: recomeou-se um novo processo de padronizao; - 1992: modificaes propostas foram avaliadas e votadas; - 1993: um novo padro publicado, chamado VHDL-93; - 1997: publicado o manual de referncia da linguagem.
Ciclo de Projeto:
Especificao: determinar requisitos e funcionalidade do projeto. Codificao: descrever em VHDL todo o projeto, segundo padres de sintaxe. Simulao do Cdigo-Fonte: simular o cdigo em ferramenta confivel a fim de verificar preliminarmente cumprimento da especificao;
Ciclo de Projeto:
Sntese, otimizao e Fitting: Sntese: compilao de um cdigo VHDL para uma descrio abstrata.
de
Fitting: lgica sintetizada e otimizada mapeada nos recursos oferecidos pela tecnologia.
Ciclo de Projeto:
Simulao do modelo: resultados mais apurados de comportamento e timing. Gerao: configurao das lgicas programveis ou de fabricao de ASICs.
Etapas de Projeto:
Etapas de Projeto:
Tipos de circuitos:
Circuitos Combinacionais: circuitos que dependem apenas da combinao das variveis de entrada Circuitos Sequenciais: circuitos que dependem da varivel tempo (sincronizao, realimentao, etc) Circuitos Hardwired: circuito projetado para realizar uma tarefa especfica, sem a necessidade de programao Processadores: sistemas de uso geral, compostos por unidades operativas e de controle, com conjunto de instrues especfico. Sistemas embarcados: sistemas para uso especfico com restries de potncia e aplicaes de tempo real.
Componentes de um projeto
PACKAGE ENTITY ARCHITECTURE CONFIGURATION
Package (Pacote): constantes, bibliotecas; Entity (Entidade): pinos de entrada e sada; Architecture (Arquitetura): implementaes do projeto; Configuration (Configurao): define as arquiteturas que sero utilizadas.
Componentes de um projeto
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.all; USE IEEE.STD_LOGIC_UNSIGNED.all; ENTITY exemplo IS PORT ( <descrio dos pinos de I/O> ); END exemplo; PACKAGE (BIBLIOTECAS)
ARCHITECTURE (ARQUITETURA)
Entity (Entidade)
Abstrao que descreve um sistema, uma placa, um chip, uma funo ou uma porta lgica. Etapa caixa preta, onde necessrio apenas descrever quem so as entradas e sadas do circuito (interface com meio externo)
Entity <nome_da_entidade> is port ( entrada_1: in <tipo>; entrada_2: in <tipo>; sada_1 : out <tipo>; ...
);
end <nome_da_entidade>;
Entity (Entidade)
Parmetros: - GENERIC: passagem de informaes estticas - PORT: correspondem ao pinos de entrada e sada. Modos de operao:
IN: porta de entrada; OUT: porta de sada (no podem ser usados como entradas, nem seus valores utilizados na lgica interna); INOUT: porta de entrada e sada; BUFFER: sada com possibilidade de realimentao.
Entity (Entidade)
Tipos mais utilizados: bit bit_vector Assume valores 0 ou 1. x: in bit; Vetor de bits. x: in bit_vector(7 downto 0); x: in bit_vector(0 to 7); x: in std_logic; x: in std_logic_vector(7 downto 0); x: in std_logic_vector(0 to 7); Assume valores TRUE ou FALSE
Entity (Entidade)
STD_LOGIC: Definida pela biblioteca IEEE: use ieee.std_logic_1164.all; Pode assumir nove valores: U: no inicializada Z: alta impedncia
Entity (Entidade)
Circuito exemplo:
A extenso de um arquivo em VHDL .vhd. O nome do arquivo DEVE ser o mesmo nome da entidade. No caso acima, o arquivo deve ser salvo com o nome exemplo1.vhd.
Architecture (Arquitetura)
Architecture (Arquitetura)
Architecture (Arquitetura)
Arquitetura do circuito exemplo:
Architecture (Arquitetura)
Circuito exemplo completo em VHDL:
Package (Pacotes)
Os pacotes (bibliotecas) contm uma coleo elementos incluindo descrio do tipos de dados Analogia com C/C++: #include <library.h>. de
Package (Pacotes)
Permite a reutilizao de um cdigo j escrito.
Armazena: Declarao de tipos Declarao de constantes Declarao de subprogramas Declarao de mnemnicos Pode ser dividido em parte de declarao e parte de corpo (opcional).
Package (Pacotes)
necessrio o uso de packages quando se deseja utilizar algo no definido pela biblioteca VHDL padro. A rea de packages deve vir antes da rea de entidade.
Package (Pacotes)
Exemplo de Packages: package <biblioteca> is function soma(a,b: bit) return bit; subtype dado is bit_vector(32 downto 0); constant mascara : bit_vector(3 donwto 0) := 1100; alias terceiro_bit: bit is dado(3) ); end <biblioteca>.
PARTE II : SEMNTICA
36
So permitidos apenas letras, nmeros e underscore ( _ ) ltimo caractere no pode ser underscore;
o Ex: Teste_
No so permitidos 2 underscores em seqncia;
o Ex: Teste__projeto
Nomes com underscore so diferentes de nome sem underscore.
Valores de dados especficos usados como parmetros de objetos ou dentro de expresses. No representam tipos especficos:
Ex: '1' pode representar um bit ou um caractere.
Podem ser representados pelas seguintes categorias: Character Literals: um caracter ASCII (a, z). String Literals: seqncia de caracteres ASCII (texto) Bit String Literals: formas especiais de string literals para representar valores das bases binria, octal e hexadecimal.
B100100 O446 XA0F4B51
Based Literals: idntico a numeric literals, mas utilizando bases binria, octal e hexadecimal.
Ex: 2#101#, 16#FC9#, 2#1.0#E10#
VHDL uma linguagem fortemente tipada; Pouca converso feita automaticamente; Cada tipo tem um conjunto de operaes vlidas; Cada tipo tem um conjunto de valores definidos; Os tipos podem ser estendidos pelo usurio.
41
So divididos em 4 classes:
Tipos escalares (representam um nico valor); Tipos compostos (representam uma coleo de valores); *Tipos de acessos (similares a ponteiros); *Tipos de arquivo (referencia objetos que contm uma seqncia de valores). * No so sintetizveis
TIPOS
discretos
Enumerated
Scalar
escalar
Floating point
numricos
Composite
composto enumerado
character Integer Physical
fsico
bit_vector
Array
vetor
string
bit
boolean
integer
real
time
booleano
caracter
inteiro
tempo
VALOR um, zero Verdadeiro, falso Caracteres ASCII -231 -1 x 231 -1 0 X 231 -1 1 X 231 -1 -3.65*1047 x +3.65*1047
EXEMPLO 1, 0 TRUE, FALSE a, b, c, A, B, C, ?, ( 123, 8#173#, 16#7B#, 2#11_11_011# 123, 8#173#, 16#7B#, 2#11_11_011# 1.23, 1.23E+2, 16#7.B#E+1
TIME
Tipos enumerados: permite criar novos tipos. til para mquina de estados (FSM) Ex: type estado is (inicio, espera, calculo, final); Os tipos criados podem ser declarados Ex: signal estado_atual : estado Outros Exemplos (user defined types):
type dedos is range 0 to 10; type pos_neg is range -1 to 1;
48
a(4) <= b(4); a(0 to 3) <= b(2 DOWNTO 0); b(4) <= 0; b(2 DOWNTO 0) <= 0010; c <= (0, 0, 0, 1, 0);
-- 1 elemento <= 1 elemento -- parte do vetor <= parte do vetor -- 1 elemento <= 1 valor -- parte do vetor <= valor -- valor 00010 agregado notao -- posicional d <= (1 => 1, OTHERS => 0); -- valor 00010 agregado notao -- posicional
OTHERS: forma genrica de se atribuir valores aos demais bits no especificados anteriormente
49
Records: coleo de elementos de tipos diferentes. Semelhante a struct em C Exemplos: type instruction is record Mnemonico: string; Codigo: bit_vector(3 downto 0); Ciclos: integer; end record; signal instrucao : instruction; instrucao.Mnemonico : registrador instrucao.codigo : 0001 Instrucao.ciclos : 3
Realizam operaes sobre objetos do mesmo tipo; Operaes lgicas: and, or, nand, nor, xor, xnor e not; Para vetores, so efetuados bit a bit; Operaes relacionais: igual (=), diferente (/=), menor que (<), menor ou igual (<=), maior que (>), maior ou igual (>=) o resultado sempre do tipo boolean; Operaes numricas: soma (+), subtrao (-), negao (- unrio), multiplicao (*), diviso (/), mdulo (mod), remanescente (rem), expoente (**) e valor absoluto (abs) so aplicados somente para integer e real e para o tipo time, embora existam bibliotecas especficas para aritmtica;
Operaes de concatenao:
Cria um novo vetor a partir de dois vetores j existentes. Ex:
Dado1: bit_vector(7 downto 0); Dado2: bit_vector(7 downto 0); Dado_Resultante: bit_vector(7 downto 0) Dado1 := 01011011; Dado2 := 11010010; Dado_Resultante := (Dado1(7 downto 6) & Dado2(5 downto 2) & Dado1(1 downto 0)); Dado_Resultante = 01010011
Usados para representar e armazenar dados; Trs tipos bsicos: constantes, sinais e variveis; Cada objeto possui um tipo de dados especfico e um conjunto de possveis valores; Objetos de dados de tipos diferentes no podem ser atribudos um ao outro. Ex: somar 101(Bit) e 011(Std_logic).
Constante com valor global: Package (uso mais freqente) Somente no contexto em que foi declarada: entity, architecture, process, function
Representam ligaes entre elementos; Comunicao de mdulos em uma estrutura Temporizados. Declarao:
Globalmente:
Package
Internamente:
architecture (mais utilizado)
Declarao:
Podem ser declaradas apenas em processos (variveis locais); Podem corresponder a registradores (processos sem temporizao) ou no (processos com temporizao);
Quando utiliza-se sinal, a atribuio ocorre no final do processo, enquanto que a atribuio na varivel ocorre simultaneamente. Diferena entre as atribuies:
<= (atribuio de sinal) := (atribuio de varivel) Dentro de um processo (atribuies sequenciais) um sinal s pode ter atribudo um valor de cada vez.
D <= 2; process (C, D ) begin A <= 2; B <= A + C; A <= D +1; E <= A * 2; end process; process (C, D) begin A <= 2; B <= A + C; A <= D +1; E <= A * 2; end process; process (C, D) begin A <= 2 ; B <= A + C; A <= D +1; E <= A * 2; end process; process (C, D) begin A <= 2; B <= A + C A <= D +1; E <= A * 2; end process;
A=1 B=1 C=1 D=1 E=1 process (C, D) begin A <= 2; B <= A + C; A <= D +1; E <= A * 2; end process;
A=1 B=1 C=1 D=2 E=1 process (C, D) begin A <= 2; B <= A + C; A <= D +1; E <= A * 2; end process;
A=1 A <= 2 B=1 C=1 D=2 E=1 process (C, D) begin A <= 2; B <= A + C; A <= D +1; E <= A * 2; end process;
A = 1 A <= 2 B = 1 B <= A + C C=1 D=2 E=1 process (C, D) begin A <= 2; B <= A + C; A <= D +1; E <= A * 2; end process;
No atualiza
A <= 3 B <= 2
E <= 2;
A= 3 B= 2 C=1 D=2 E= 2
e no 3
e no 6
process (C, D)
variable Av, Bv, Ev : integer :=0;
process (C, D)
variable Av, Bv, Ev : integer := 0;
begin Av := 2; Bv := Av + C; Av := D +1; Ev := Av * 2; A <= Av; B <= Bv; E <= Ev; end process; A=1 B=1 C=1 D=2 E=1 process (C, D)
variable Av, Bv, Ev : integer := 0;
begin Av := 2; Bv := Av + C; Av := D +1; Ev := Av * 2; A <= Av; B <= Bv; E <= Ev; end process; A=1 Av = 0 B=1 Bv = 0 C=1 D=2 E=1 Ev = 0 process (C, D)
variable Av, Bv, Ev : integer := 0;
begin Av := 2; Bv := Av + C; Av := D +1; Ev := Av * 2; A <= Av; B <= Bv; E <= Ev; end process; A=1 Av = 2 B=1 Bv = 0 C=1 D=2 E=1 Ev = 0 process (C, D)
variable Av, Bv, Ev : integer := 0;
begin Av := 2; Bv := Av + C; Av := D +1; Ev := Av * 2; A <= Av; B <= Bv; E <= Ev; end process; A=1 Av = 2 B=1 Bv = 3 C=1 D=2 E=1 Ev = 0
begin Av := 2; Bv := Av + C; Av := D +1; Ev := Av * 2; A <= Av; B <= Bv; E <= Ev; end process; A=1 Av = 3 B=1 Bv = 3 C=1 D=2 E=1 Ev = 0
begin Av := 2; Bv := Av + C; Av := D +1; Ev := Av * 2; A <= Av; B <= Bv; E <= Ev; end process; A=1 Av = 3 B=1 Bv = 3 C=1 D=2 E=1 Ev = 6
Architecture (Arquitetura)
Descrio comportamental: descreve o que o sistema deve fazer de forma abstrata
Descrio por fluxo de dados (data-flow): descreve o que o sistema deve fazer utilizando expresses lgicas Descrio estrutural: descreve como o hardware em termos de interconexo de componentes
Comandos paralelos: operam simultaneamente, geralmente, sem comunicao entre si Comandos concorrentes: operam ao mesmo tempo com uma cooperao implcita na comunicao entre eles
64
65
END behavior;
s <= int1 OR int2 s ser executado se alguma modificao de a ou b provocarem alguma modificao em um ou ambos os sinais int1 e int2. A ordem de aparecimento na descrio em nada modifica o resultado.
66
WHEN-ELSE
WITH-SELECT
PROCESS
67
68
ENTITY teste IS PORT (a, b, c : IN integer; z : OUT integer); END teste; ARCHITECTURE behavior OF teste IS SIGNAL x : integer; BEGIN x <= 3; z <= a WHEN (x > 3) ELSE b WHEN (x < 3) ELSE c; END behavior;
69
As opes de escolha so definidas por expresses que retornam um valor booleano. Como WHEN-ELSE define uma prioridade na ordem das opes, o circuito equivalente corresponde a uma cadeia de seletores.
s0 <= i0 OR i1 WHEN na = 8 OR nb = 2 i1 WHEN na = 3 OR nb = 5 i0 AND i1 WHEN na = 7 i0; ELSE ELSE ELSE
70
D1
MUX S
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY Mux_1b IS PORT ( D0, D1, Sinal : IN std_logic; Saida : OUT std_logic ); END Mux_1b; ARCHITECTURE behavior_we OF Mux_1b IS BEGIN Saida <= D0 WHEN Sinal = 0 ELSE D1 WHEN Sinal = 1; END behavior;
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY decod3to8 IS PORT ( endereco : IN STD_LOGIC_VECTOR(2 DOWNTO 0); Saida : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END decod3to8; ARCHITECTURE behav OF decod3to8 IS BEGIN Saida <= 00000001 WHEN endereco = 000 ELSE 00000010 WHEN endereco = 001 ELSE
END behav;
WITH <expresso> SELECT <sinal> <= <expresso_a> WHEN <condicao_1>, <expresso_b> WHEN <condicao_2>, <expresso_c> WHEN <condicao_3> [| <condicao_4>], <expresso_d> WHEN OTHERS;
74
75
Exemplos
WITH s0 SELECT -- s0 tipo CHARACTER x0 <= i0 AND i1 WHEN a, i0 OR i1 WHEN b | c, i0 XOR i1 WHEN d TO g, i0 WHEN x DOWNTO k, i1 WHEN OTHERS;
76
D1 8
D2
MUX
Sada
8 8
D3 8
Sinal
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY Mux_8b IS PORT ( D0, D1, D2, D3 : IN STD_LOGIC_VECTOR(7 DOWNTO 0); Sinal : IN STD_LOGIC_VECTOR (1 DOWNTO 0); Saida : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END Mux_8b; ARCHITECTURE behavior OF Mux_8b IS BEGIN WITH Sinal SELECT Saida <= D0 WHEN 00, D1 WHEN 01, D2 WHEN 10, D3 WHEN OTHERS; END behavior;
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY decod3to8 IS PORT ( endereco : IN BIT_VECTOR(2 DOWNTO 0); Saida
ARCHITECTURE behavior OF decod3to8 IS BEGIN WITH endereco SELECT Saida <= 00000001 WHEN 000, 00000010 WHEN 001, 00000100 WHEN 010, 00001000 WHEN 011, 00010000 WHEN 100, 00100000 WHEN 101, 01000000 WHEN 110, 10000000 WHEN 111; END behavior;
END decod3to8;
Compostos de:
Parte declarativa Parte de comandos seqenciais
Estrutura
nome: PROCESS (lista de sensibilidade) -- declaraes de tipos, constantes,variveis -- no permitido declarao de sinais BEGIN -- comandos seqenciais END PROCESS nome;
80
Processos so concorrentes entre si Dentro de um processo, a execuo sequencial O processo executado at o ltimo comando e suspenso at que ocorra um evento em sua lista de sensibilidade A lista de sensibilidade composta por sinais e entradas Um evento em qualquer desses sinais dispara o processo
81
Seguem a ordem de aparecimento no cdigo Comandos seqncias s podem ser usados dentro de processos (process) Processos podem ser usados para modelar os diferentes componentes de um sistema Processos so concorrentes entre si
82
83
IF <condio1> THEN <comandos>; ELSIF <condio2> THEN <comandos>; ELSE IF <condio3> THEN <comandos>; END IF; END IF;
84
Exemplo
IF na = 3 THEN s0 <= i0 OR i1; s1 <= i3; ELSIF na = 8 OR y = 1 THEN s0 <= i1; s1 <= i4; ELSE s0 <= i0 AND i1; s1 <= i5; END IF;
85
Exemplo 2: Multiplexador
ARCHITECTURE behavior OF mux2to1 IS BEGIN; PROCESS (D0, D1, X) BEGIN IF X = 0 THEN S <= D0; ELSE S <= D1; END IF; END PROCESS; END behavior;
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY mux2to1 IS PORT (D0, D1, X : IN STD_LOGIC; S: OUT STD_LOGIC ); END mux2to1;
86
Seleciona a execuo que ocorrer de uma lista de alternativas Equivale ao comando WITH-SELECT
CASE <seleo> IS WHEN <condicao1> => <comandos>; WHEN <condicao2> TO <condicao3> => <comandos>; WHEN <condicao4> | <condicao5> => <comandos>; WHEN others => <comandos>; END CASE;
87
Exemplo
CASE na IS WHEN 3 => s0 <= i0 OR i1; s1 <= i3; WHEN 7 TO 12 => s0 <= i1; s1 <= i4; WHEN OTHERS => s0 <= i0 AND i1; s1 <= i5; END CASE;
88
... PROCESS (sel, en) BEGIN y <= 11111111; IF (en = 1) THEN CASE sel IS
0; 0; 0; 0; 0; 0; 0; 0;
Ao utilizar processos, um erro comum esquecer de atribuir a uma sada um valor default. Todas as sadas devem ter valores defaults. Neste exemplo, se no fosse atribudo a y o valor default 11111111, nenhum valor seria atribudo a y caso en = 0.
No realiza nenhuma operao A execuo passada para o prximo comando Especialmente til na construo CASE WHEN que precisa cobrir todos os valores da expresso de escolha mas para alguns valores no deve ser feito nada em um dado projeto
90
FOR
FOR <parmetro> IN <intervalo> LOOP <comandos>; END LOOP;
O parmetro tratado internamente como uma constante e no pode ser alterado durante a execuo do loop; Existe o loop WHILE, mas no sintetizvel.
a(3 downto 0)
Architecture b(3 downto 0)
se a = b ento Equals = 1 seno Equals = 0
equals
Descrio Comportamental
-- comparador de 4 bits entity comp4 is port ( a, b: in bit_vector (3 downto 0); equals: out bit ); end comp4; architecture comport of comp4 is begin comp: process (a,b) -- lista de sensibilidade begin if a = b then equals = 1 ; else equals = O ; end if; end process comp; end comport;
Descrio Estrutural
-- comparador de 4 bits entity comp4 is port ( a, b: in bit_vector (3 downto 0); equals: out bit ); end comp4; architecture estrut of comp4 is signal x: bit_vector (3 downto 0); component xnor is port (a, b: in bit; equals: out bit ); end component; begin U0: xnor port map (a(0), b(0), x(0)); U1: xnor port map (a(1), b(1), x(1)); U2: xnor port map (a(2), b(2), x(2)); U3: xnor port map (a(3), b(3), x(3)); U4: and4 port map (x(0), x(1), x(2), x(3), equals); end estrut;
uma entidade de projeto empregada na arquitetura de uma outra entidade A utilizao desses elementos permite a interligao de mltiplas entidades de projeto, de modo a formar uma entidade mais complexa em um projeto hierrquico
96
COMPONENT nome_componente_x GENERIC (n : tipo_n := valor; PORT ( sinal_a : modo_a sinal_b : modo_b sinal_c : modo_c END COMPONENT;
97
A solicitao um comando concorrente que consiste em um rtulo, o nome do componente e o mapa de portas (PORT MAP)
lista PORT MAP( a(1), b(1), c(1) ); -- posicional PORT MAP( sianl_b => b(1), sinal_a => a(1), sinal_c => c(1) ); -- nomeada PORT MAP( sinal_x => x(1), sinal_y => OPEN ) -- nomeada
x3:
componente_y
98
Posicional
A lista de sinais no mapa deve seguir a mesma ordem estabelecida na declarao do componente
Nomeada
Uma nova seqncia definida no mapa
A palavra OPEN indica que o sinal do componente no conectado a nenhum sinal da arquitetura
99
Programa 1
---------------------------------------------------------- Arquivo componente_inv.vhd -- Modelo do inversor --------------------------------------------------------library IEEE; use IEEE.std_logic_1164.all; entity componente_inv is port( x : in std_logic; y : out std_logic ); end componente_inv; architecture arquitetura_inv of componente_inv is begin y <= not x; end arquitetura_inv; begin
Programa 2
---------------------------------------------------------- Arquivo componente_and.vhd -- Modelo da porta AND --------------------------------------------------------library IEEE; use IEEE.std_logic_1164.all; entity componente_and is port( a : in std_logic; b : in std_logic; c : out std_logic ); end componente_and;
Programa 3 ------------------------------------------------------- Arquivo componente_sistema.vhd -----------------------------------------------------library IEEE; use IEEE.std_logic_1164.all; entity componente_sistema is port( in1 : in std_logic; in2 : in std_logic; in3 : in std_logic; in4 : in std_logic; out1 : out std_logic ); end componente_sistema; architecture arquitetura_sistema of componente_sistema is component componente_and port( a: in std_logic; b : in std_logicbit; c : out std_logic); end component; component componente_inv port( x: in std_logic; y : out std_logic); end component; signal s1, s2, s3, s4 : std_logic; begin and1 : componente_and port map (a => in1, b => in2, c => s1); and2 : componente_and port map (a => in3, b => in4, c => s2); and3 : componente_and port map (a => s3, b => s4, c => ut1); inv1 : componente_inv port map (x => s1, y => s3); inv2 : componente_inv port map (x => s2, y => s4); end arquitetura_sistema;
sum = a XOR b XOR cin cout = (a AND b) OR (a AND cin) OR (b AND cin)
A 0 0 0 0 1 1 1 1 B 0 0 1 1 0 0 1 1 CIN 0 1 0 1 0 1 0 1 SUM 0 1 1 0 1 0 0 1 COUT 0 0 0 1 0 1 1 1
ENTITY full_adder IS PORT ( cin: IN std_logic; a: IN std_logic; b: IN std_logic; sum: OUT std_logic; cout: OUT std_logic ); END full_adder;
ARCHITECTURE behavior OF full_adder IS BEGIN sum <= a XOR b XOR cin; cout <= (a AND b) OR (cin AND (a OR b)); END behavior;
Somador de 4 bits
COUT CIN
ADDER
SUM(3 downto 0)
A(3 downto 0)
B(3 downto 0)
A(1) B(1)
CIN
A(0)
B(0)
Somador de 4 bits
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY adder_4bits IS PORT ( cin: IN std_logic; a: IN std_logic_vector(3 DOWNTO 0); b: IN std_logic_vector(3 DOWNTO 0); sum: OUT std_logic_vector(3 DOWNTO 0); cout: OUT std_logic ); END adder_4bits;
ARCHITECTURE structure OF adder_4bits IS SIGNAL c: std_logic_vector(0 TO 2); COMPONENT full_adder IS PORT ( cin : IN std_logic; a : IN std_logic; b : IN std_logic; sum : OUT std_logic; cout : OUT std_logic ); END COMPONENT;
BEGIN FULL_ADDER_0: full_adder PORT MAP (cin => cin, a => a(0), b => b(0), sum => sum(0), cout => c(0)); FULL_ADDER_1: full_adder PORT MAP (cin => c(0), a => a(1), b => b(1), sum => sum(1), cout => c(1)); FULL_ADDER_2: full_adder PORT MAP (cin => c(1), a => a(2), b => b(2), sum => sum(2), cout => c(2)); FULL_ADDER_3: full_adder PORT MAP (cin => c(2), a => a(3), b => b(3), sum => sum(3), cout => cout); END structure;
11 0
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY dff_logic IS PORT (d, clk : IN BIT; q : OUT BIT); END dff_logic; ARCHITECTURE behavior OF dff_logic IS BEGIN PROCESS(clk) BEGIN IF (clkevent AND clk = 1) THEN q <= d; END IF; END PROCESS; END behavior;
11 1
A condio clkevent ativada quando ocorre variao no valor de clk; A utilizao de clkevent em conjunto com a lista de sensibilidade redundante, mas necessria devido ao fato de que algumas ferramentas de sntese ignoram a lista de sensibilidade; Uma mudana do clock pode ocorrer de 0 para 1 ou de 1 para 0, desse modo necessria a condio adicional clk = 1 ou clk = 0;
Em STD_LOGIC, usa-se rising_edge para transio de subida de clock e falling_edge para transio de descida.
11 2
ARCHITECTURE behavior OF dff_logic IS BEGIN PROCESS(clk, reset) BEGIN IF reset = 1 THEN q <= (others => 0); ELSIF RISING_EDGE(clk) THEN q <= d; END IF; END PROCESS; END behavior;
11 4
ARCHITECTURE behavior OF dff_logic IS BEGIN PROCESS(clk, preset) BEGIN IF preset = 1 THEN q <= (others => 1); ELSIF RISING_EDGE(clk) THEN q <= d; END IF; END PROCESS; END behavior;
11 5
ARCHITECTURE behavior OF reg_logic IS BEGIN PROCESS(clk, reset) BEGIN IF (reset = 1) THEN q <= (others => 0); ELSIF RISING_EDGE(clk) THEN IF (preset = 1) THEN q <= (others => 1); ELSE q <= d; END IF; END IF; END PROCESS; END behavior;
11 6
ARCHITECTURE behavior OF reg_logic IS BEGIN PROCESS(clk, reset, preset) BEGIN IF (reset = 1) THEN q <= (others => 0); ELSIF (preset = 1) THEN q <= (others => 1); ELSIF RISING_EDGE(clk) THEN q <= d; END IF; END PROCESS; END behavior;
11 7
So usadas para especificar e implementar unidades de controle Podem ser representadas por meio de um diagrama de estados
11 8
Exemplo:
entrada = 0 entrada = 1 entrada = 1
Estado
Sada 0 0 1
A C
B
entrada = 0
A B C
Cada transio ocorre em um evento do relgio, tanto de um estado para outro quanto para o mesmo estado
11 9
Seqncia de passos:
Cada estado transcrito utilizando o CASE A transio entre estados realizada utilizando o IF-THEN-ELSE Para criar os estados necessrio definir um tipo enumerado (enumeration type) contendo o nome dos estados e os sinais para cada tipo:
12 0
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY maquina_estados IS PORT ( entrada : IN std_logic; clock : IN std_logic; saida : OUT std_logic ); END maquina_estados;
12 1
ARCHITECTURE behavior OF maquina_estados IS TYPE estado IS (A, B, C); SIGNAL estado_atual, proximo_estado : estado; BEGIN PROCESS (clock, entrada) BEGIN CASE estado_atual IS WHEN A => saida <= 0; IF (entrada = 1) THEN proximo_estado <= B; END IF;
12 2
WHEN B => saida <= 0; IF (entrada = 0) THEN proximo_estado <= C; END IF; WHEN C => saida <= 1; proximo_estado <= A; END CASE; END PROCESS;
12 3
ATUALIZA_ESTADO : PROCESS (clock) BEGIN IF (clockevent AND clock = 1) THEN estado_atual <= proximo_estado; END IF; END PROCESS ATUALIZA_ESTADO; END behavior;
O primeiro processo realiza as operaes dentro dos estados e indica qual ser a transio de estado O segundo processo (ATUALIZA_ESTADO) realiza a transio entre estados quando ocorre um evento de subida do relgio (clock)
12 4
Descrio de um circuito que realiza a raiz quadrada de um nmero natural; Obteno de um modelo de hardware a partir de um algoritmo; Descrio das Partes Operativa e de Controle em VHDL;
d = 2; s = 4; x = DATA_IN
Registradores Multiplexadores
d=d+2
Somador
r=d/2
s=s+d+1
s>x
DATA_OUT = r
Composta de: 1 Multiplexador para o valor de D 1 Multiplexador para o valor de S 2 Multiplexadores para os valores de entrada do somador 1 Multiplexador para o bit de seleo do somador 4 Registradores (D, S, R e X) 1 Somador para o clculo de D e S 1 deslocador para o valor de R
d = 2; s = 4; x = DATA_IN
Registradores
d=d+2
r=d/2
s=s+d+1
s>x
DATA_OUT = r
Dados dos registradores utilizados: Tamanho: N bits Possuem write enable Circuitos sncronos
WE 1 Entrada N Saida N
REG
clk
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY reg_gen IS GENERIC (N : POSITIVE := 8); -- Default value
ARCHITECTURE behavior OF reg_gen IS BEGIN PROCESS(clk) BEGIN IF (clk'EVENT AND clk = 1') THEN IF ( WE = '1') THEN DATA_OUT <= DATA_IN; END IF; END IF;
PORT (
clk : IN BIT; DATA_IN : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0); WE : IN STD_LOGIC;
END PROCESS;
END behavior;
WED
1 D
WES
1 S
WER
1 R
WEX
1 X
clk
d = 2; s = 4; x = DATA_IN
Multiplexadores
d=d+2
r=d/2
s=s+d+1
s>x
DATA_OUT = r
Dados dos multiplexadores utilizados para D e S: Tamanho: N bits Possuem 2 entradas Seleo Circuitos Combinacionais 1
Entrada_1 N
Entrada_2 N
M U X
Saida N
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux_gen IS GENERIC (N : POSITIVE := 8); -- Default value
ARCHITECTURE behavior OF mux_gen IS BEGIN PROCESS BEGIN IF (SM = '0') THEN DATA_OUT <= DATA_A; ELSE DATA_OUT <= DATA_B; END IF;
PORT (
DATA_A, DATA_B : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0); SM : IN STD_LOGIC; DATA_OUT : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0) ); END mux_gen;
END PROCESS;
END behavior;
SMD 1
M U X D
WED
1 D
WES
1
SMS
M U X S
1 S
WER
1 R
WEX
1 X
clk
d = 2; s = 4; x = DATA_IN
d=d+2
Cin = 0
r=d/2
s=s+d+1
Somador
Cin = 1
s>x
DATA_OUT = r
Dados da ULA Tamanho: N bits Circuitos Combinacionais CIN Para d + 2 1 Entrada_1 = d Entrada_1 Entrada_2 = 2 N Para s + d + 1 Entrada_1 = d Entrada_2 = s Para s - x Entrada_2 Entrada_1 = -x N Entrada_2 = s
U L A
Saida N
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY ula IS
SIGNAL sum_t : STD_LOGIC_VECTOR(N-1 DOWNTO 0); GENERIC (N : POSITIVE := 8); -- Default value
BEGIN
sum_t <= A(N-1 DOWNTO 0) XOR B(N-1 DOWNTO 0) XOR (int_carry (N-2 DOWNTO 0) &Cin); int_carry(0) <= ((A(0) OR B(0)) AND Cin) OR (A(0) AND B(0));
Cout
END ula;
: OUT STD_LOGIC);
END PROCESS;
Sum <= sum_t; END behavior;
SMD 1
M U X D
WED
1 D
WES
1 SM1
M U X A
MUX_UL A
SMS
M U X S
1 S
WER
CIN= SM3
1 R
WEX
U L A
SM2
M U X B
1 X
clk
d = 2; s = 4; x = DATA_IN
d=d+2
r=d/2
s=s+d+1
s>x
DATA_OUT = r
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY DESLOCADOR IS GENERIC (N : POSITIVE := 8); -- Default value
ARCHITECTURE behavior OF DESLOCADOR IS BEGIN DATA_OUT <= '0' & DATA_IN(N-1 DOWNTO 1); END behavior;
PORT (
DATA_IN : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0); DATA_OUT : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0));
END DESLOCADOR;
SMD 1
M U X D
WED
1 D
WES
1 SM1
M U X A
MUX_UL A
SM3
SMS
M U X S
1 S
WER
CIN
1 R
WEX
U L A
SM2
M U X B
D E S L
1 X
clk
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY OP IS PORT (
clk
DATA_IN DATA_OUT N CTR
: IN BIT;
: IN STD_LOGIC_VECTOR(15 DOWNTO 0); : OUT STD_LOGIC_VECTOR(15 DOWNTO 0); : OUT STD_LOGIC; : IN STD_LOGIC_VECTOR(8 DOWNTO 0)
);
END OP;
ARCHITECTURE estrutural OF OP IS
SIGNAL sig_muxd, sig_muxs SIGNAL sig_d, sig_s, sig_r, sig_x SIGNAL sig_muxa, sig_muxb SIGNAL sig_sula, sig_desl : STD_LOGIC_VECTOR(15 DOWNTO 0); : STD_LOGIC_VECTOR(15 DOWNTO 0); : STD_LOGIC_VECTOR(15 DOWNTO 0); : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL cin
ALIAS smd : STD_LOGIC IS CTR(8); ALIAS sms : STD_LOGIC IS CTR(7); ALIAS wed : STD_LOGIC IS CTR(6);
: STD_LOGIC;
COMPONENT mux_gen IS
GENERIC (N : POSITIVE); PORT ( DATA_A, DATA_B SM : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0); : IN STD_LOGIC;
DATA_OUT
END COMPONENT; COMPONENT mux_1 IS PORT (
COMPONENT reg_gen IS
GENERIC (N : POSITIVE); PORT (clk DATA_IN WE : IN BIT; : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0); : IN STD_LOGIC;
COMPONENT ula IS
GENERIC (N : POSITIVE); PORT (Cin A, B Sum : IN STD_LOGIC; : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0); : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0);
Cout
-BEGIN --
: OUT STD_LOGIC);
END COMPONENT;
MUXD : mux_gen
GENERIC MAP (N => 16) PORT MAP (sig_sula, sig_muxd1, smd, sig_muxd); -MUXS : mux_gen
REGR : reg_gen
GENERIC MAP (N => 16) PORT MAP (clk, sig_desl, wer, sig_r); -REGX : reg_gen
MUXULA : mux_1
PORT MAP (sm2, sm1, sm3, cin); -Adder : ula GENERIC MAP (N => 16)
PORT MAP (cin, sig_muxa(15 downto 0), sig_muxb(15 downto 0), sig_sula(15 DOWNTO 0), N);
-desl : DESLOCADOR GENERIC MAP (N => 16) PORT MAP (sig_sula, sig_desl);
s1
pronto/
ready
s2
s3
s4
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY controle IS PORT ( clk : IN STD_LOGIC; NEG : IN STD_LOGIC; -- bit que verifica se s > x READY : IN STD_LOGIC; -- bit de inicializacao PRONTO : OUT STD_LOGIC; -- bit de parada SAIDA : OUT STD_LOGIC_VECTOR(8 DOWNTO 0) ); END controle;
ARCHITECTURE behavior OF controle IS TYPE StateType IS (s1, s2, s3, s4); SIGNAL estado_atual, proximo_estado : StateType; BEGIN outro_estado : PROCESS (estado_atual) BEGIN END PROCESS outro_estado;
WHEN s3 => SAIDA <= "000100101"; proximo_estado <= s4; -WHEN s4 => SAIDA <= "000000110"; IF (NEG = '0') THEN PRONTO <= '1'; proximo_estado <= s1; ELSE PRONTO <= '0'; proximo_estado <= s2; END IF; END CASE;
--
atualiza_estado : PROCESS (clk) BEGIN IF (clk'EVENT AND clk = '1') THEN Estado_atual <= proximo_estado; END IF; END PROCESS atualiza_estado; END behavior;
-- rising_edge(clk)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY raiz IS PORT (clk : IN BIT; : IN STD_LOGIC; : OUT STD_LOGIC_VECTOR(15 DOWNTO 0); ENTRADA DATA_OUT END raiz;
COMPONENT OP IS
PORT (clk DATA_IN N : IN BIT; : IN STD_LOGIC_VECTOR(15 DOWNTO 0); : OUT STD_LOGIC;
CTR
N
ENTRADA DATA_OUT PRONTO
: IN STD_LOGIC;
: IN STD_LOGIC; : OUT STD_LOGIC_VECTOR(8 DOWNTO 0); : OUT STD_LOGIC);
END COMPONENT;
BEGIN
CONTROL: controle PORT MAP (clk, N, ENTRADA, ctr, PRONTO); -OPERACIONAL: OP
Quartus II Web Edition www.altera.com Compilador e Simulador integrados Licena gratuita para estudantes
16 6
16 7