Você está na página 1de 166

MINICURSO: TPICOS EM VHDL

Prof. Leonardo Augusto Casillo

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.

O que significa Linguagem de Descrio de Hardware (HDL)?


Uma linguagem de descrio de hardware descreve o que um sistema faz e como;
Um sistema descrito em linguagem de hardware pode ser implementado em um dispositivo programvel FPGA (Field Programmable Gate Array) ou um dispositivo ASIC (Aplication Specific Integrated Circuit), permitindo o uso em campo do sistema; Existem dezenas de HDLs: AHDL, VERILOG, Handel-C, SDL, ISP, ABEL

Caractersticas do VHDL
Linguagem concorrente. Todos os comandos simultaneamente (com exceo de processos) ocorrem

Permite, atravs de simulao, verificar o comportamento do sistema digital;


Permite descrever hardware em diversos nveis de abstrao, por exemplo: Algortmico ou comportamental. Transferncia entre registradores (RTL).

Hoje utilizada para SIMULAO e SNTESE

Caractersticas do VHDL

VHDL anlogo a uma linguagem de programao


VHDL prov mecanismos para modelar a concorrncia e sincronizao que ocorrem a nvel fsico no hardware

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

2. O VHDL deve ser descrito aps a arquitetura, e no a arquitetura aps o VHDL.

Vantagens e Desvantagens do VHDL


Vantagens
time-to-market: Se h dez anos atrs um produto demorava 6 meses para ser desenvolvido, mas permanecia no mercado por 2 anos, hoje um produto no permanece mais de 18 meses, logo o seu desenvolvimento deve levar bem menos tempo. menor ciclo e custo de desenvolvimento: devido eliminao de gerao, manuteno de esquemticos e pela diminuio de erros de desenvolvimento pelo uso de simulao nos ciclos iniciais do projeto; aumento de qualidade no desenvolvimento: VHDL facilita o rpido experimento com diferentes arquiteturas e tcnicas de implementao, e pela capacidade das ferramentas de sntese otimizarem um projeto tanto para rea mnima quanto para velocidade mxima; evoluo da tecnologia Novos dispositivos surgem com mais capacidade e mais recursos internos; gerenciamento do projeto Projetos em VHDL facilitam a estruturao de componentes (topdown), facilitam a documentao e so necessrias menos pessoas para desenvolver e verificar, sendo tambm mais simples modificar o projeto; independente de tecnologia e fabricante: porm sabe-se que na prtica no independente de ferramenta de sntese e de simulao.

Vantagens e Desvantagens do VHDL


Desvantagens
Mudana de cultura; Aprendizado e treinamento; Escolha de uma ferramenta de desenvolvimento; Circuito menos otimizado que esquemtico; Ferramentas de sntese ineficientes.

Conceitos necessrios
Algoritmos; Conceitos de linguagem de programao (para descrio comportamental); Circuitos Digitais; Arquitetura de computadores;

Para descries mais complexas: Linguagem Assembly; Microprocessadores; Sistemas embarcados.

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.

Otimizao: seleo da melhor soluo implementao para uma dada tecnologia.

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.

PARTE I : ELEMENTOS BSICOS

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)

ENTITY (PINOS DE I/O)

ARCHITECTURE teste OF exemplo IS BEGIN ... END teste;

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.

ARCHITECTURE (ARQUITETURA) PROCESSOS


N N

ENTITY (ENTIDADE) PINOS DE I/O

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

std_logic* std_logic_vector boolean

Entity (Entidade)
STD_LOGIC: Definida pela biblioteca IEEE: use ieee.std_logic_1164.all; Pode assumir nove valores: U: no inicializada Z: alta impedncia

X: desconhecida 0: valor 0 1: valor 1 -: Dont care.

W: desconhecida fraca L: 0 fraca (Low) H: 1 fraca (High)

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)

Especificao do funcionamento do circuito


Formada por: Declaraes: sinais, constantes, componentes, subprogramas Comandos: blocos, atribuies a sinais, chamadas a subprogramas, instanciao de componentes, processos Uma entidade pode ter vrias arquiteturas: VHDL prov meios de especificar qual arquitetura se deseja utilizar

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

Para incluir uma biblioteca no cdigo VHDL (incio do cdigo):


LIBRARY <nome_da_biblioteca> e/ou USE <nome_da_biblioteca>.all

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.

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


Biblioteca do usurio (default): work.

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

Usados como referncia a todos os objetos declarados Regras


Primeiro caractere deve ser uma LETRA No CASE-SENSITIVE
Ex: Teste = teste = TESTE

Existem palavras reservadas


Ex: and, mux

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.

o Ex: teste_projeto testeprojeto

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.

So vlidos dependendo do tipo:


Ex: '$' vlido como um caractere mas no como bit.

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

Vlidos para bit_vector e std_logic_vector

Numeric Literals: Integer Literals (Ex: 1) e Real Literals (Ex: 1.1)


Nmeros reais no so sintetizveis.

Based Literals: idntico a numeric literals, mas utilizando bases binria, octal e hexadecimal.
Ex: 2#101#, 16#FC9#, 2#1.0#E10#

Physical Literals: grandeza fsica. Contm parte numrica e unidade.


Podem representar tempo, velocidade, distncia etc No so sintetizveis (tempo simulvel) Ex: 300 s, 40 m

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

Tipos enumerados: tipos j definidos pela norma


Bit Boolean Integer Real Physical STD_LOGIC

TIPO PREDEFINIDO BIT BOOLEAN CHARACTER INTEGER NATURAL POSITIVE REAL

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

ps=103 fs ns=103 ps us=103 ns ms=103 us sec=103 ms min=60sec hr=60min

1 us, 100 ps, 1 fs

NATURAL e POSITIVE so subtipos de INTEGER


45

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;

ARRAY: Coleo de elementos do mesmo tipo


Ordem crescente ou decrescente
type word is array (7 downto 0) of bit; type word is array (0 to 7) of bit;

Indexao por parntesis


signal palavra: word := 01111111; signal aux: bit; aux <= palavra(0);

TIPO PREDEFINIDO BIT_VECTOR STRING

VALOR 1, 0 Tipo character

EXEMPLO 1010, B10_10, O12, XA texto, incluindo_aspas

Signal a: Bit_Vector (0 TO 7) := 10110011


1 0 1 1 0 0 1 1
a(0) a(1) a(2) a(3) a(4) a(5) a(6) a(7)

Constant c: String (1 TO 9) := Alo mundo


A l o m u n d o
c(1) c(2) c(3) c(4) c(5) c(6) c(7) c(8) c(9)

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).

Assumem apenas um valor em todo o cdigo. Declarao:

constant <identificador>: <tipo> := <valor>


Ex: constant errado : boolean := False; Ex: constant parte_ram : bit_vector(3 downto 0) := 1110; Podem ser declaradas em qualquer parte do cdigo

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:

signal <identificador>: <tipo> [:= valor];

Podem ser declaradas:

Globalmente:
Package

Internamente:
architecture (mais utilizado)

Utilizados para armazenar valores intermedirios entre expresses; Atribuio imediata;

Declarao:

variable <identificador>: <tipo> [:= valor];

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 = 1 A <= D + 1 B = 1 B <= A + C C=1 D=2 E=1

A = 1 A <= D + 1 B = 1 B <= A + C C=1 D=2 E = 1 E <= A * 2;

A=1 B=1 C=1 D=2 E=1

A <= 3 B <= 2

E <= 2;

A= 3 B= 2 C=1 D=2 E= 2

e no 3

A diferena entre os valores deve-se a forma de atribuio

e no 6

D <= 2; process (C, D)


variable Av, Bv, Ev : integer := 0;

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

PARTE III : CIRCUITOS COMBINACIONAIS

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

Usados para imitar a natureza concorrente e paralela do hardware Um comando do tipo:


a <= b XOR c Ser executado apenas quando os sinais da direita mudam o valor e no por ordem de aparecimento na descrio ou no fluxo de controle

65

Exemplo: ou-exclusivo (XOR)


ARCHITECTURE behavior OF xor2 IS SIGNAL int1, int2 : STD_LOGIC;

LIBRARY ieee; USE ieee.std_logic_1164.all;

BEGIN ENTITY xor2 IS


PORT ( a, b : IN STD_LOGIC; s : OUT STD_LOGIC); END xor2; int1 <= NOT a AND b; int2 <= a AND NOT b; s <= int1 OR int2;

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

Atribuio condicional de sinais.

WITH-SELECT

Atribuio de sinal com escolha.

PROCESS

67

Atribuio de sinal condicional

LABEL: <sinal> <=

<expresso> WHEN <expresso_booleana> ELSE <expresso> WHEN <expresso_booleana> ELSE <expresso>

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

Exemplo: Multiplexador de 1 bit


D0
D 0 D 1 S

D1

MUX S

D0, D1 = Entradas A = Sinal S = Sada

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

00000100 WHEN endereco = 010 ELSE


00001000 WHEN endereco = 011 ELSE 00010000 WHEN endereco = 100 ELSE 00100000 WHEN endereco = 101 ELSE 01000000 WHEN endereco = 110 ELSE 10000000 WHEN endereco = 111;

END behav;

Atribuio de sinal selecionada

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

As condies so mutuamente exclusivas

No contm uma prioridade como WHEN-ELSE


As condies podem ser agrupas atravs do delimitador |, equivalente a OU TO e DOWNTO podem ser empregadas para faixa de valores OTHERS vlida, como ltima alternativa

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;

WITH b1 AND b0 SELECT -- b1 e b0 tipo BIT x1 <= i0 WHEN 0, i1 WHEN 1;

76

Exemplo: Multiplexador de 8 bits com 4 entradas


D0 8

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;

: OUT BIT_VECTOR(7 DOWNTO 0) );

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

IF-THEN-ELSE CASE NULL FOR WHILE (* no sintetizvel)

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

WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN

000 001 010 011 100 101 110 111

=> => => => => => => =>

y(0) y(1) y(2) y(3) y(4) y(5) y(6) y(7)

<= <= <= <= <= <= <= <=

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.

END CASE; END IF; END PROCESS;

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.

Exemplo: Comparador de 4 bits

a(3 downto 0)
Architecture b(3 downto 0)
se a = b ento Equals = 1 seno Equals = 0

equals

Descrio por Data-Flow


-- comparador de 4 bits entity comp4 is port ( a, b: in bit_vector (3 downto 0); equals: out bit ); end comp4; architecture fluxo of comp4 is begin equals = 1 when (a=b) else O; end fluxo;

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

Para a utilizao necessria a declarao do componente


Empregando a palavra COMPONENT no lugar de ENTITY

COMPONENT nome_componente_x GENERIC (n : tipo_n := valor; PORT ( sinal_a : modo_a sinal_b : modo_b sinal_c : modo_c END COMPONENT;

-- lista de genricos tipo_sinal_a;-- lista de portas tipo_sinal_b; tipo_sinal_c);

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

-- rotulo nome mapa x1: componente_x x2: componente_x

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

Especificando a Estrutura de um Sistema


O component exatamente a descrio de um componente O port map um mapeamento deste componente em um sistema maior.

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;

architecture arquitetura_and of componente_and is


c <= a and b; end arquitetura_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;

Somador Completo de 1 bit

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

LIBRARY ieee; USE ieee.std_logic_1164.all;

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)

COUT ADDER 7 S(3)

CIN A(7) B(2)

COUT ADDER 1 S(1)

A(1) B(1)

ADDER COUT 0 S(0)

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;

PARTE IV : CIRCUITOS SEQUENCIAIS

Ativado apenas quando clk sofre alteraes D no altera o processo

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:

TYPE <tipo_estado> IS (nome_estado, nome_estado); SIGNAL estado : <tipo_estado>


So necessrios dois processos: um realiza as operaes dentro dos estados e o outro atualiza o estado.

12 0

Mquina de estados do exemplo anterior:

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

PARTE V : CIRCUITOS HARDWIRED

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; Fazer d <- d + 2; r <- d / 2; s <- s + d + 1; Enquanto (s < = x);

d = 2; s = 4; x = DATA_IN

Registradores Multiplexadores

d=d+2

Somador

r=d/2
s=s+d+1

Diviso por 2 = Deslocador direita

s>x

Flag para controle Maior / menor

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; Fazer d <- d + 2; r <- d / 2; s <- s + d + 1; Enquanto (s < = x);

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;

DATA_OUT : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0)


); END reg_gen;

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

SX= S + (-X) + 1 (Complemento de 2)

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

ARCHITECTURE behavior OF ula IS SIGNAL int_carry : STD_LOGIC_VECTOR(N-1 DOWNTO 0);

SIGNAL sum_t : STD_LOGIC_VECTOR(N-1 DOWNTO 0); GENERIC (N : POSITIVE := 8); -- Default value

PORT ( Cin : IN STD_LOGIC;


A, B : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0); Sum : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0);

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);

CASCADE_CARRY: FOR I in 1 TO N-1 GENERATE

int_carry(I) <= ((A(I) OR B(I)) AND int_carry(I-1)) OR (A(I) AND B(I));


END GENERATE CASCADE_CARRY; -PROCESS BEGIN

IF ( (sum_t(N - 1) = '1') OR ( A = NOT B)) THEN


Cout <= '1'; ELSE Cout <= '0'; END IF;

Necessrio para S X, mas no para X S

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

Diviso por 2 Deslocador direita

r=d/2
s=s+d+1

s>x

DATA_OUT = r

Dados do deslocador Tamanho: N bits Desloca apenas direita Circuito Combinacional


Entrada N D E S L Saida N

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;

SIGNAL sig_muxd1, sig_muxs1, sig_muxa1, sig_muxb0 : STD_LOGIC_VECTOR(15 DOWNTO 0);

ALIAS wes : STD_LOGIC IS CTR(5);


ALIAS wer : STD_LOGIC IS CTR(4); ALIAS wex : STD_LOGIC IS CTR(3); ALIAS sm1 : STD_LOGIC IS CTR(2); ALIAS sm2 : STD_LOGIC IS CTR(1); ALIAS sm3 : STD_LOGIC IS CTR(0);

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 (

: OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0));

DATA_A, DATA_B : IN STD_LOGIC;


SM DATA_OUT END COMPONENT; : IN STD_LOGIC; : OUT STD_LOGIC);

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;

DATA_OUT : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0));


END COMPONENT; COMPONENT DESLOCADOR IS GENERIC (N : POSITIVE);

PORT (DATA_IN : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0);


DATA_OUT : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0)); END COMPONENT;

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;

sig_muxd1 <= "0000000000000010"; -- 2


sig_muxs1 <= "0000000000000100"; -- 4 sig_muxb0 <= "0000000000000010"; -- 2 sig_muxa1 <= NOT(sig_x);

MUXD : mux_gen
GENERIC MAP (N => 16) PORT MAP (sig_sula, sig_muxd1, smd, sig_muxd); -MUXS : mux_gen

GENERIC MAP (N => 16)


PORT MAP (sig_sula, sig_muxs1, sms, sig_muxs); -REGD : reg_gen GENERIC MAP (N => 16)

PORT MAP (clk, sig_muxd, wed, sig_d);


-REGS : reg_gen GENERIC MAP (N => 16) PORT MAP (clk, sig_muxs, wes, sig_s);

REGR : reg_gen
GENERIC MAP (N => 16) PORT MAP (clk, sig_desl, wer, sig_r); -REGX : reg_gen

GENERIC MAP (N => 16)


PORT MAP (clk, DATA_IN, wex, sig_x); -MUXA : mux_gen GENERIC MAP (N => 16)

PORT MAP (sig_d, sig_muxa1, sm2, sig_muxa);


-MUXB : mux_gen GENERIC MAP (N => 16) PORT MAP (sig_muxb0, sig_s, sm1, sig_muxb);

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);

-DATA_OUT <= sig_r; END estrutural;

O diagrama de estados ter 4 estados, com o seguinte funcionamento:


Estado1 : d = 2; ready/ s = 4; x = DATA_IN; Valores de sada dos bits de controle Estado2: d = d +2; pronto r = d/2; Valores de sada dos bits de controle Estado3: s = s + d + 1; Valores de sada dos bits de controle Estado4: S>X? Valores de sada dos bits de controle

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;

Organizao dos bits de controle: SAIDA(8 DOWNTO 0);


BIT SMD (8) SMS (7) WED (6) WES (5) WER (4) WEX (3) SM1 (2) SM2 (1) SM3 (0) FUNO Bit de controle do componente MUXD Bit de controle do componente MUXS Write Enable do registrador D Write Enable do registrador S Write Enable do registrador R Write Enable do registrador X Bit de controle do componente MUX_B Bit de controle do componente MUX_A Bit de controle do componente MUX_ULA

CASE estado_atual IS WHEN s1 =>

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;

SAIDA <= "111101000";


IF (READY = '1') THEN proximo_estado <= s1; ELSE PRONTO <= '0';

proximo_estado <= s2;


END IF; -WHEN s2 => SAIDA <= "001010000";

proximo_estado <= s3;

--

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;

DATA_IN : IN STD_LOGIC_VECTOR(15 DOWNTO 0); PRONTO : OUT STD_LOGIC);

ARCHITECTURE estrutural OF raiz IS


-SIGNAL CTR : STD_LOGIC_VECTOR(8 DOWNTO 0); SIGNAL N : STD_LOGIC;

COMPONENT OP IS
PORT (clk DATA_IN N : IN BIT; : IN STD_LOGIC_VECTOR(15 DOWNTO 0); : OUT STD_LOGIC;

DATA_OUT : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);

CTR

: IN STD_LOGIC_VECTOR(8 DOWNTO 0));

END COMPONENT; COMPONENT controle IS PORT (clk : IN BIT;

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

PORT MAP (clk, DATA_IN, DATA_OUT, N, ctr);


-END estrutural;

Quartus II Web Edition www.altera.com Compilador e Simulador integrados Licena gratuita para estudantes

16 6

casillo@gmail.com casillo@ufersa.edu.br leonardocasillo@hotmail.com @leocasillo

16 7

Você também pode gostar