vargas/SisC/poligrafo-vhdl.doc · Web viewminicurso 2. dispositivo lógico programÁvel (fpga) e...
-
Upload
nguyenliem -
Category
Documents
-
view
237 -
download
0
Transcript of vargas/SisC/poligrafo-vhdl.doc · Web viewminicurso 2. dispositivo lógico programÁvel (fpga) e...
VII - SEMANA DA ENGENHARIA PUCRS
MINICURSO 2
DISPOSITIVO lógico PROGRAMÁVEl (FPGA) E
LINGUAGEM DE DESCRIÇÃO DE HARDWARE (VHDL)
ELABORADO E MINISTRADO PELO ENGENHEIRO ANDERSON ROYES TERROSO
PORTO ALEGRE, SETEMBRO DE 1998
1 INTRODUÇÃO...............................................................................................................................
1.1 DISPOSITIVOS LÓGICOS PROGRAMÁVEIS FPGA..............................................................1.1.2 DEFINIÇÃO DE BLOCOS LÓGICOS:..............................................................................1.1.3 DEFINIÇÃO DE ROTEAMENTO.......................................................................................1.1.3 DEFINIÇÃO DE IOB´S......................................................................................................
1.2 CIRCUITOS PROGRAMÁVEIS EPLD.....................................................................................
2 LINGUAGEM DE DESCRIÇÃO DE HARDWARE (VHDL).......................................................
2.1 O QUE É VHDL?......................................................................................................................2.2 O QUE SIGNIFICA VHDL?......................................................................................................2.3 O QUE É UMA LINGUAGEM DE DESCRIÇÃO DE HARDWARE?......................................2.4 BREVE HISTÓRICO................................................................................................................
2.4.1 LINHA CRONOLÓGICA....................................................................................................2.5 VANTAGENS E DESVANTAGENS DE SE UTILIZAR VHDL...............................................
3 COMPONENTES DE UM PROJETO VHDL...............................................................................
3.1 PACKAGE (PACOTES)............................................................................................................3.2 ENTITY (ENTIDADE)..............................................................................................................
3.2.1 TIPO DE PORTAS.............................................................................................................3.2.2 TIPOS DE SINAIS..............................................................................................................
3.3 ARCHITECTURE (ARQUITETURA).......................................................................................3.3.1 ARQUITETURA SIMPLES.................................................................................................3.3.2 ARQUITETURA CONCORRENTE.....................................................................................
3.4 CONFIGURATION (CONFIGURAÇÃO).................................................................................
4 SEMÂNTICA DA LINGUAGEM VHDL.......................................................................................
4.1 ELEMENTOS LÉXICOS..........................................................................................................4.1.1 COMENTÁRIOS.................................................................................................................4.1.2 IDENTIFICADORES..........................................................................................................4.1.3 TIPOS DE DADOS NÃO LÓGICOS...................................................................................4.1.4 EXPRESSÕES E OPERADORES........................................................................................
5 COMANDOS SEQÜENCIAIS........................................................................................................
5.1 ATRIBUIÇÃO DE VARIÁVEIS...............................................................................................5.2 ATRIBUIÇÃO DE SINAIS.......................................................................................................5.3 COMANDO WAIT....................................................................................................................5.4 COMANDO IF THEN ELSE.....................................................................................................5.5 COMANDO LOOP FOR - WHILE............................................................................................5.6 COMANDO NEXT...................................................................................................................5.7 COMANDO EXIT.....................................................................................................................5.8 COMANDO CASE....................................................................................................................5.9 COMANDO NULL...................................................................................................................5.10 COMANDO RETURN............................................................................................................
6 ESPECIFICANDO A ESTRUTURA DE UM SISTEMA...............................................................
7 ALGUNS EXEMPLOS DE IMPLEMENTAÇÕES EM VHDL....................................................
8 BIBLIOGRAFIA.............................................................................................................................
1 INTRODUÇÃO
O rápido desenvolvimento dos recursos de concepção de circuitos
integrados, tanto na área de processos quanto na área de CAD, tornou
possível o aparecimento de dispositivos com Lógica Programável. Tais
dispositivos permitem aos usuários implementar circuitos complexos sem a
necessidade do uso de onerosos recursos de fundição em sílicio.
A primeira utilização destes circuitos é naturalmente nos projetos de
prototipagem. Tendo em vista que grande parte destes circuitos podem ser
reprogramados, o seu uso nas fases preliminares de projeto possibilita uma
grande economia de tempo e dinheiro.
A medida em que os dispositivos de Lógica Programável tornam-se
cada vez mais densos e rápido, o processo de concepção de projetos
eletrônicos se beneficia destes circuitos fazendo com que o tempo de projeto
seja reduzido em muitos dias. Assim sendo, devido à grande complexidade
dos projetos capazes de ser implementados em lógica programável, tais
circuitos passam a ser utilizados em projetos industriais como substituto dos
circuitos ASIC (Application Specific Integrated Circuits).
1.1 DISPOSITIVOS LÓGICOS PROGRAMÁVEIS FPGA
FPGA (Field Programmable Gate Array) são circuitos programáveis
compostos por um conjunto de células lógicas ou blocos lógicos alocados
em forma de uma matriz. Em geral, a funcionalidade destes blocos assim
como o seu roteamento, são configuráveis por software. A palavra Field
indica que a configuração do circuito pode ser feita pelo usuário final sem a
necessidade da utilização de recursos de foundries. Na Figura 1.1, está
demonstrado a estrutura de uma FPGA.
FIGURA 1.1: A estrutura de uma FPGA.
1.1.2 DEFINIÇÃO DE BLOCOS LÓGICOS:
As funções lógicas são implementadas no interior dos Blocos Lógicos.
Em algumas arquiteturas os Blocos Lógicos possuem recursos seqüenciais
tais como flip-flop ou registradores. O fabricante Xilinx chama seu Bloco
Lógico de CLB (Configurable Logic Block), conforme a Figura 1.2. Enquanto
que a Actel usa o termo LM (Logic Modules), já a Altera utiliza o termo LE
(Logic Element) para as séries 8000 e 10000 e Macrocell para as séries
5000, 7000 e 9000.
FIGURA 1.2: A estrutura de uma FPGA.
1.1.3 DEFINIÇÃO DE ROTEAMENTO
A interconexão entre os blocos é feita através de uma rede de duas
camadas de metal. A conexões físicas entre os fios são feitas ora com
transistores de passagem controlados por bits de memória (PIP) ora com
chaves de interconexão (Switch Matrix).
Os recursos de roteamento da série XC3000 da Xilinx possuem:
· Conexões Globais: formam uma rede de interconexão em linha e
colunas de cinco fios de metal cada, que se ligam através de
chaves de interconexão. Esta rede circunda os blocos lógicos
(CLB´s) e os blocos de E/S (IOB´s);· Matrizes de Conexão (Switch Matrix): são chaves de
interconexão que permitem o roteamento entre os Blocos
Lógicos através das Conexões Globais (Figura 1.3). Estas
conexões são programáveis na fase de roteamento automático,
executada pelo software de projeto do fabricante ou
manualmente com o uso de uma ferramenta de software
chamada Edinet.
CLB
SB
SBSB
SB 1 2
3
4
56
7
8
Switch BoxFIGURA 1.3:Representação de um Switch Box.
· Conexões Diretas: são conexões entre CLB´s vizinhos e permitem
conectar blocos com menor atraso, pois não utilizam os recursos
globais de roteamento.
· Linhas Longas: são conexões que atravessam todo o circuito sem
passar pelas switch matrix e são utilizadas para conectar sinais
longos e com restrições de skew entre múltiplos destinos (Figura
1.4)
FIGURA 1.4: Roteamento de uma FPGA.
1.1.3 DEFINIÇÃO DE IOB´S
Os blocos de E/S possuem buffer tristate e um flip-flop para os sinais
da saída. O sinal de saída pode ser invertido por programa assim como o
sinal de controle do tristate (Figura 1.5)
FIGURA 1.5: Representação de um IOB da família XC 3000 da XILINX
1.2 CIRCUITOS PROGRAMÁVEIS EPLD
EPLD (EPROM Programmable Logic Devices) são componentes que
possuem transistores EPROM para possibilitar sua programação. Os
transistores EPROM são usados para forçar valores nas entradas dos blocos
lógicos, ou seja, enquanto eles não são programados em seu estado OFF, a
word line pode forçar valores para o bit line, ora fechando o circuito entre o
dreno e a fonte do transistor, ora abrindo o circuito entre dreno e a fonte.
2 LINGUAGEM DE DESCRIÇÃO DE HARDWARE (VHDL)
2.1 O QUE É VHDL?
VHDL é uma forma de se descrever, através de um programa, o comportamento de um circuito ou componente digital.
2.2 O QUE SIGNIFICA VHDL?
Very Hight Speed Integrated CircuitHardwareDescriptionLanguage
Linguagem de Descrição de Hardware com ênfase em Circuitos Integrados de altíssima velocidade.
2.3 O QUE É UMA LINGUAGEM DE DESCRIÇÃO DE HARDWARE?
Uma linguagem de descrição de hardware descreve o que um sistema faz e como. Esta descrição é um modelo do sistema hardware, que será executado em um software chamado simulador. Um sistema descrito em linguagem de hardware pode ser implementado em um dispositivo programável (FPGA - Field Program Gate Array), permitindo assim o uso em campo do seu sistema, tendo a grande vantagem da alteração do código a qualquer momento.
2.4 BREVE HISTÓRICO
A idéia da criação de uma linguagem de descrição de hardware partiu do Departamento de Defesa dos Estados Unidos da América (DoD). As forças armadas americanas, compravam grande quantidade de placas de circuitos impressos, sendo que muitas delas compostas de circuitos integrados de aplicação específica (ASIC - Application Specific Integrated Circuits). Como era comum, empresas da área de eletrônica, mudarem de área ou trocar de ramo, necessitava-se garantir a reposição das peças durante a vida
útil das placas, com isso o DoD iniciou o desenvolvimento de uma linguagem padrão de descrição de hardware.
2.4.1 LINHA CRONOLÓGICA
1968: foram desenvolvidas as primeiras linguagens de descrição de hardware, porém em 1970 tinha-se inúmeras linguagens com sintaxe e semântica incompatíveis;
1973: surge o primeiro esforço de padronização da linguagem, comandado pelo projeto CONLAN (CONsensus LANguage), cujo o objetivo principal era: definir formalmente uma linguagem de multi-nível com sintaxe única e semântica igual. Paralelamente, iniciou-se outro projeto financiado pelo DoD cujo o objetivo era criar uma linguagem de programação.
1983: em janeiro de 1983, foi publicado o relatório final do projeto CONLAN. Neste mesmo ano, também foi publicado o relatório final do projeto DoD, que deu origem a linguagem ADA. Em março de 83, o DoD começou o programa VHSIC, afim de melhorar a tecnologia de concepção, engenharia e construção nos EUA. Participaram deste projeto a IBM, Intermetrics e Texas Instruments.
1986: a Intermetrics desenvolveu um compilador e um simulador. Além disso foi criado um grupo de padronização da IEEE para VHDL.
1988: primeiros softwares são comercializados.
1991: recomeçou-se um novo processo de padronização, cujo o objetivo era a coleta e análise de requisitos, definição dos objetivos e a especificação das modificações à linguagem.
1992: as modificações propostas foram avaliadas e votadas.
1993: um novo padrão é publicado, chamado VHDL-93, padronizado IEEE Std 1164-1993.
1997: em dezembro de 97 foi publicado o manual de referência da linguagem VHDL.
2.5 VANTAGENS E DESVANTAGENS DE SE UTILIZAR VHDL
A descrição de um sistema em VHDL apresenta inúmeras vantagens, tais como:
· Intercâmbio de projetos entre grupos de pesquisa sem a necessidade de alteração;
· Permite ao projetista considerar no seu projeto os delay´s comuns aos circuitos digitais;
· A linguagem independe da tecnologia atual, ou seja, você pode desenvolver um sistema hoje e implementá-lo depois;
· Os projetos são fáceis de serem modificados;· O custo de produção de um circuito dedicado é elevado, enquanto que
usando VHDL e Dispositivos Programáveis, isto passa a ser muito menor;
· Reduz consideravelmente o tempo de projeto e implementação.
Quanto as desvantagens, apenas uma é relevante:
· VHDL não gera um hardware otimizado;
3 COMPONENTES DE UM PROJETO VHDL
A estrutura de um programa VHDL, baseia-se em 4 blocos:
PACKAGEENTITY
ARCHITECTURECONFIGURATION
· PACKAGE são declarados as constantes, tipos de dados, sub-programas;· ENTITY declaração dos pinos de entrada e saída;· ARCHITECTURE define as implementações do projeto;· CONFIGURATION define as arquiteturas que serão utilizadas.
Abaixo está representado a estrutura de um programa descrito em
VHDL.
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.all;USE IEEE.STD_LOGIC_UNSIGNED.all;
PACKAGE(BIBLIOTECAS)
ENTITY exemplo ISPORT (
< descrição dos pinos de entrada e saída >
);END exemplo;
ENTITY(PINOS DE I/O)
ARCHITECTURE teste OF exemplo ISBEGIN
PROCESS( <pinos de entrada e signal > )
BEGIN
< descrição do circuito integrado >
END PROCESS;END teste;
ARCHITECTURE(ARQUITETURA)
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.all;USE IEEE.STD_LOGIC_UNSIGNED.all;entity placa isport (
a : in bit_vector( 6 downto 0);b : out bit_vector( 6 downto 0)
);end placa;architecture TTL of placa issignal pino_1 bit;signal pino_2 bit;signal pino_3 bit;signal pino_4 bit;
beginCI_X : process( a )begin
<descrição do processo>end process CI_Y;
CI_Y : process( a )begin
<descrição do processo>end process CI_Z;
end TTL;
FIGURA 2.1: Apresentação de um programa em VHDL e o sua representação em hardware.
3.1 PACKAGE (PACOTES)
Os pacotes (biblioteca) contém uma coleção de elementos incluindo descrição do tipos de dados (relacione com os includes da Linguagem C).
Pacotes usados normalmente:IEEE.std_logic_arith – funções aritméticasIEEE.std_logic_signed – funções aritméticas com sinalIEEE.std_logic_unsigned – funções aritméticas sem sinalIEEE.std_logic_1164 – std_logic e funções relacionadasALTERA.maxplus2 – declaração de todas as macro-funções e mega-funções.
Como utilizá-los:
LIBRARY <nome_da_biblioteca> e/ou
USE <nome_da_biblioteca>.all
OBS. 1: .all significa que todos os elementos da bibliotecas devem ser utilizados, caso não seja acrescentado .all deve-se especificar os elementos que serão utilizados.
REGRA GERAL => COLOQUE SEMPRE .all
3.2 ENTITY (ENTIDADE)
3.2.1 TIPO DE PORTAS
IN = porta de entrada;
OBS.: não pode receber atribuição de valor dentro do programa.
OUT = porta de saída;
OBS.: não pode ser utilizado como entrada para outro circuito.
INOUT = porta de entrada e saída;
BUFFER = porta de saída que pode ser atualizada por mais de uma fonte;
LINKAGE = o valor da porta pode ser lido e atualizado.EX.: Entity <nome> isport ( sinal_controle : in <tipo>;
parcela_1 : in <tipo>;parcela_2 : out <tipo>
);end <nome>;
3.2.2 TIPOS DE SINAIS
<tipo> => bit, bit_vector, std_logic, std_logic_vector, boolean, real,
bit assume valor ‘0’ ou ‘1’ x : in bit;bit_vector vetor de bits. x : in bit_vector(7 downto 0); ou x : in bit_vector(0 to 7);std_logicstd_logic_vector vetor de bits. x : in std_logic_vector(7 downto 0); Boolean assume valores true ou false (verdadeiro ou falso)Real
3.3 ARCHITECTURE (ARQUITETURA)
Arquitetura pode ser definida como sendo a(s) implementação(ões) do
projeto. Na figura 3.1, temos uma placa mãe de um PC, por exemplo, onde
está faltando o chip, considere que a interface entre o chip e o meio externo
seja idêntica. Na figura 3.2, foi colocado um chip, com toda a arquitetura do
projeto.
Figura 3.1 Figura 3.2
3.3.1 ARQUITETURA SIMPLES
A arquitetura simples contém apenas um processo, ou seja, apenas um bloco. Architecture topologia_arquitetura of teste is
begin process ( a, b)
variable temp : bit;
begin
temp := a and b; z <= temp xor a;
end process;end topologia_arquitetura;
3.3.2 ARQUITETURA CONCORRENTE
A arquitetura concorrente é uma forma mais complexa de descrever um sistema, geralmente apresenta várias processos dentro de uma arquitetura.
No programa 1 e 2, temos uma arquitetura com três processos, podendo ser ou não idependentes. Estes processos são executados em paralelo, porém os processos só serão executados se algum sinal (A, B ou C) tiver seu estado alterado. Novamente tem-se um ganho de processamento.
Programa 1 Programa 2
Architecture topologia_arquitetura of teste is
begin
signal temp1 : bit;signal temp2 : bit;
processo_1 : process ( a, b, temp1 )
variable temp3 : bit;
begin
temp1 <= ‘0’; temp2 := a and b; z <= temp1 xor temp2;
end process process_1;
processo_2 : process ( a, b, temp1, temp2 )
variable temp3 : bit;
begin
temp2 <= ‘1’; temp3 := a and temp1; w <= temp3 xor temp2;
end process process_2;end topologia_arquitetura;
O exemplo acima, apresenta algumas características, tais como:1. Uma arquitetura com dois processos, que serão executados 2. paralelamente;2. Os dois processos possuem variáveis com mesmo nome, mas isto não influência no processamento;
3.4 CONFIGURATION (CONFIGURAÇÃO)
uma mesma entity pode ter várias arquiteturas.
Exemplo:
configuration nome_da_config of contador isfor estrutural
for all: Tflip_flop
use entity work.Tflip_flop(comp);
end for;for all: inversor
use entity work.Tflip_flop(comp);
end for;end for
end nome_da_config
4 SEMÂNTICA DA LINGUAGEM VHDL
4.1 ELEMENTOS LÉXICOS
4.1.1 COMENTÁRIOS
Comentários em VHDL são iniciados por dois hífens adjacentes (--), podendo ser estendido até o final da linha.
Exemplo 1:
· -- a linha que você colocar como comentário, deverá colocar antes de · -- iniciá-la dois hífens adjacentes.
Exemplo 2:
A <= B and C; -- esta operação realiza a and de B com C e o resultado é -- colocado em A
4.1.2 IDENTIFICADORES
Quando se escreve um programa em VHDL, deve-se tomar certos cuidados, com os identificadores, abaixo segue uma tabela apresentando alguns identificadores válidos e inválidos.
IDENTIFICADORES VÁLIDOS
· palavras seguidas do caracter underline _ Ex.: teste_padrao, input_1_x· não é sensivel a LETRA MAIÚSCULA e minúscula Ex.: SOMA = soma
· nome com underline são diferentes de nomes sem underline. Ex.: Teste_Padrao ¹ TestePadrao
IDENTIFICADORES INVÁLIDOS
· uso de palavras reservadas da linguagem com outras finalidades identificador começando com número => 7AB
· uso do caracter @ Ex.: A@B· o caracter underline no fim de um identificador Ex.: soma_· o uso de dois caracteres underlines seguidos Ex.: IN__1
4.1.3 TIPOS DE DADOS NÃO LÓGICOS
· BIT: assume valores ‘0’ e ‘1’, bit_vector é um conjunto de bits. Ex.: “010001”
· Boolean: assume valores true ou false· Real: sempre com ponto decimal. Ex.: -3.2, 4.56, 6.0, -2.3E+2· Inteiros: não é possível realizar conversão sobre inteiros. Ex.: 3, 546, -
349· Physical: representam uma medida física: voltagem, capacitância, tempoTipos pré-definidos: fs, ps, ns, um, ms, sec, min, hr.· Intervalos: permite determinar um intervalo de utilização dentro de um
determinado tipo.range <valor_menor> to <valor_maior>range <valor_maior> downto <valor_menor>· Array: em VHDL um array é definido como uma coleção de elementos
todos do mesmo tipo.Abaixo seguem alguns exemplos de array:
type word is array (31 downto 0) of bit;type memory is array (address) of word;type transform is array (1 to 4, 1 to 4) of real;type vector is array (integer range<>) of real;type string is array (positive range<>) of character
Ex.:type b is array (1 to 5) of character;(‘t’, ‘e’,’s’,’t’,’e’)(1 =>’t’, 5 => ‘e’, 2 => ’e’, 3 => ‘s’, 4 => ‘t’)(3 => ‘s’, 2 => ‘e’, 5 => ‘e’, others => ‘t’)
· Record: semelhante a “struct” da Linguagem C, ou seja, é uma coleção de elementos de tipos diferentes.
type instruction is record Mneumonico : String;Code : Bit_vector( 3 downto 0);;Ciclos : integer;
end record;
signal Instr1: instruction;
Instr1.Mneumonico : “or reg1, reg2”Instr1. Code : “0010”Instr1.Ciclos : 3
4.1.4 EXPRESSÕES E OPERADORES
4.1.4.1 OPERADORES LÓGICOS
Os operadores lógicos são: and, or, nand, nor, xor, xnor e not.
4.1.4.2 OPERADORES NUMÉRICOS
Os operadores numéricos são: soma (+), subtração (-), multiplicação (*), divisão (/), módulo (mod), remanescente (rem - ex.: 6 rem 4 = 2), expoente (**), valor absoluto (abs).
4.1.4.3 OPERADORES RELACIONAIS
Os operadores relacionais são; igual (=), diferente (/=), menor do que (<), menor ou igual (<=), maior do que (>), maior ou igual (>=).
4.1.4.4 OPERADORES DE DESLOCAMENTO
Operadores Exemplosll - shift left logical 01101001 => 11010010 (acrescenta 0 no bit - sign.)srl - shift right logical 01101001 => 01101001 (acrescenta 0 no bit + sign.)sla - shift left arithmetic 01101001 => 11010011 (repete o bit - sign.)sra - shift right arithmetic 01101001 => 00110100 (repete o bit + sign.)rol - rotate left logical 01101001 => 11010010 (desloca todos bits para esq.)ror - rotate right logical 01101001 => 10110100 (desloca todos bits para dir.)
4.1.4.5 OPERADOR DE CONCATENAÇÃO
Esta operação consiste em criar um novo vetor a partir de dois vetores já existentes, por exemplo:dado1 : bit_vector(0 to 7);
[01011011]dado2 : bit_vector(0 to 7);
[11010010]novo_dado : bit_vector(0 to 7);novo_dado <= (dado1(0 to 1) & dado2(2 to 5) & dado1(6 to 7));
[01010011]
5 COMANDOS SEQÜENCIAIS
Nesta seção será apresentado alguns comandos sequenciais que o VHDL dispõe, são eles:
atribuição à variáveis comando nextatribuição à sinais comando exitcomando wait comando nullcomando if-then-else comando returncomando loop for- while comando case
5.1 ATRIBUIÇÃO DE VARIÁVEIS
Note que a passagem de parâmetros é realizada utilizando :=.
Interpretação do programa abaixo:Na linha 15 o bit menos significativo do vetor C receberá “um” e o outro “zero”,
Nas linhas 16 e 17 foram utilizados operadores booleanos;Nas linhas 18 e 19, utilizou-se o operador & para realizar a concatenação (vide SEMÂNTICA DA LINGUAGEM);Na linha 20, o bit menos significativo do vetor D será igual a “0” enquanto que o outro “1”;Na linha 21 o vetor W teria os seguintes valores após a operação: [1G00], onde G é o valor dele mesmo.
Na linha 22, DATA será todo preenchido com 0’s.1 architecture topologia_arquitetura of teste is2 signal A, B, J : bit_vector(1 downto 0);3 signal E, F, G : bit;4 begin56 process ( A, B, E, F, G, J)78 variable C, D, H, Y : bit_vector(1 downto 0);9 variable W, Q : bit_vector(3 downto 0);
10 variable Z : bit_vector(7 to 0);11 variable X : bit;12 variable DATA : bit_vector(31 downto 0);1314 begin15 C := “01”;16 X := E nand F;17 Y := H or J;18 Z(0 to 3) := C & D;19 Z(4 to 0) := (not A) & (A nor B);20 D := (‘1’, ‘0’);21 W := (2 downto 1 => G, 3 => ‘1’, others => ‘0’);
22 DATA := (others => ‘0’);23 end process;24 end topologia_arquitetura;
A função de uma variável dentro de um processo serve para intermediar valores.OBS. 1: A variável (VARIABLE) só pode ser utilizada dentro do processo em que foi criada;OBS. 2: Ela poderá assumir os mesmo tipos descritos anteriormente;OBS. 3: Sempre que for passado algum parâmetro para uma variável, estes devem ser do mesmo tipo.OBS. 4: Note que a passagem de valores para uma variável é através de := e para pinos de saída a atribuição é feita com <=
Outro exemplo: Note que a atualização da variável é automática. Este exemplo apresenta as etapas de simulação de um programa em VHDL, acompanhe cada bloco (horizontalmente).D <= 2;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 = 1B = 1C = 1D = 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 = 0B = 1 Bv = 0C = 1D = 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 = 2B = 1 Bv = 0C = 1D = 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 = 2B = 1 Bv = 3C = 1D = 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 = 3B = 1 Bv = 3C = 1D = 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 = 3B = 1 Bv = 3C = 1D = 2 E = 1 Ev = 6
5.2 ATRIBUIÇÃO DE SINAIS
A passagem de parâmetros para sinais se dá com o uso de <=.Interpretação do programa abaixo:Na linha 11, inicialmente A vale 0, após 20ns o valor de A é alterado para 1 e após 40ns, retorna a ser 0;
Na linha 12 e linha 13, são operações lógicas;
Na linha 14, o processo é semelhante ao da linha 11, entretanto os dados agora são do tipo inteiro.
1 architecture teste of topologia_arquitetura is2 signal A, B, C : bit;3 signal D: integer;4 begin56 process ( A, B, C, D)78 variable L, M, N, Q bit;9
10 begin11 A <= ‘0’, ‘1’ after 20ns, ‘0’ after 40ns12 B <= not L;13 C <= ((L andM) xor (N nand Q));14 D <= 3, 5 after 20ns, 7 after 40ns, 9 after 60ns;1617 end process;18 end topologia_arquitetura;
OBS. 1: Note que a atribuição a um sinal é feita através de <=;OBS. 2: Houve uma atribuição ao SIGNAL dentro do processo, isto não implica em dizer que em outro processo eu possa utilizá-lo atribuindo outro valor, ou seja, ele poderá ser utilizado por outro processo, mas não poderá receber uma atribuição de valores;OBS. 3: O signal deve ser passado ao processo, como mostra o exemplo.
Outro exemplo: Neste exemplo, fica bem claro a diferença entre uma variável e um sinal, ou seja, todos os sinais só serão atualizados no final do processo, enquanto que a variável é atualizada sempre que usada. Novamente, acompanhe a simulação do programa passo-a-passo (horizontalmente).
D <= 2;
process (C, D)begin
A <= 2;B <= A + C;A <= D +1;E <= A * 2;
end process;
A = 1B = 1C = 1D = 1 E = 1
process (C, D)begin
A <= 2;B <= A + C;A <= D +1;E <= A * 2;
end process;
A = 1B = 1C = 1D = 2 E = 1
process (C, D)begin
A <= 2;B <= A + C;A <= D +1;E <= A * 2;
end process;
A = 1 A <= 2B = 1C = 1D = 2 E = 1
process (C, D)begin
A <= 2;B <= A + C;A <= D +1;E <= A * 2;
end process;
A = 1 A <= 2B = 1 B <= A + CC = 1D = 2 E = 1
process (C, D)begin
A <= 2;B <= A + C;A <= D +1;E <= A * 2;
end process;
A = 1 A <= D + 1B = 1 B <= A + CC = 1D = 2 E = 1
process (C, D)begin
A <= 2;B <= A + C;A <= D +1;E <= A * 2;
end process;
A = 1 A <= D + 1B = 1 B <= A + CC = 1D = 2 E = 1 E <= A * 2;
process (C, D)begin
A <= 2;B <= A + C;A <= D +1;E <= A * 2;
end process;
A = 1 A <= 3B = 1 B <= 2C = 1D = 2 E = 1 E <= 2;
process (C, D)begin
A <= 2;B <= A + C;A <= D +1;E <= A * 2;
end process;
A = 3 B = 2 e não 3C = 1D = 2E = 2 e não 6
Qual a diferença entre o SIGNAL e a VARIABLE?1. O signal pode ser utilizado por qualquer processo pertencente aquela
arquitetura, enquanto que a variável é interna ao processo e,2. A atualização da variável é imediata, enquanto que o signal só é
atualizado no final do processo.
5.3 COMANDO WAIT
Este comando tem a finalidade de causar uma suspensão do processo declarado ou procedimento. O comando wait pode ser utilizado de quatro formas diferentes, são elas:
1 wait until <conditional>; wait until CLK’event and CLK = ‘1’;2 wait on <signal_list>; wait on a, b;3 wait for <time>; wait for 10ns;4 wait; wait;
Interpretação da tabela acima:Na linha 1, o comando wait until implica que a operação está suspensa até (until) que haja uma transição (‘event) e (and) o CLK seja igual a 1, ou seja, está aguardando uma borda de subida;
Na linha 2, o comando wait on suspende a operação até que a e b sejam igual a 1;
Na linha 3, suspende a operação por 10ns;
Na linha 4, suspende a operação.
5.4 COMANDO IF THEN ELSE
Existem inúmeras formas de se utilizar if-then-else(elsif), abaixo segue um quadro explicativo do if-then-else e ao lado dois exemplos simples. O próximo quadro apresenta um exemplo usando este comando e o comando anterior (wait).
MODELOif condição_1 then <comandos>elsif condição_2 then <comandos>else
<comandos>end if;
exemplo 1:if ( A = ‘0’) then B <= “00”;else B <= “11”;end if;
exemplo 2:if (CLK’event and CLK =’1’) then FF <= ‘0’;elsif (CLK’event and CLK =’0’) then FF <= ‘1’;elsif (J = ‘1’) and (K=’1’) then FM <= ‘1’;end if;
1 architecture topologia_arquitetura of teste is2 signal CLK : bit;3 signal SEL : bit_vector(1 downto 0);4 begin5 process6 begin7 if (SEL = “00”) then8 wait until CLK’event and CLK = ‘1’;9 elsif SEL = “01” then
10 wait for 60ns;11 else12 null;13 end if;14 end process;15 end topologia_arquitetura;
-------------------------------------------------------------------------------------------------------------- * * * * * Comentários * * * * *-- O programa deve receber o nome de lab1.vhd------------------------------------------------------------------------------------------------------------
library IEEE;use ieee.std_logic_1164.all;
entity lab1 isport ( controle : in bit;
parcela_1 : in bit_vector( 3 downto 0);parcela_2 : in bit_vector( 3 downto 0);soma_total : out bit_vector( 4 downto 0);mult_total : out bit_vector( 7 downto 0)
);end lab1;
architecture logica of lab1 is
begin process ( controle, parcela_1, parcela_2)
begin
if (controle = ‘1’ ) thensoma_total <= parcela_1 + parcela_2;
else mult_total <= parcela_1 * parcela_2;
end if;
end process;end logica;
-------------------------------------------------------------------------------------------------------------- * * * * * Comentários * * * * *-- O programa deve receber o nome de lab2.vhd------------------------------------------------------------------------------------------------------------
library IEEE;use ieee.std_logic_1164.all;
entity lab2 isport ( controle : in bit;
parcela_1 : in bit_vector( 3 downto 0);parcela_2 : in bit_vector( 3 downto 0);
soma_total : out bit_vector ( 4 downto 0); mult_total : out bit_vector ( 7 downto 0); operacao_and : out bit_vector ( 3 downto 0); operacao_xor : out bit_vector ( 3 downto 0) );end lab2;
architecture logica of lab2 is
begin
soma : process ( controle, parcela_1, parcela_2 )begin
if (controle = ‘1’ ) thensoma_total <= parcela_1 + parcela_2;
else mult_total <= parcela_1 * parcela_2;
end if;
end process soma;
operacao_logica : process ( controle, parcela_1, parcela_2 )begin
if ( controle = ‘1’ ) thenoperacao_and <= parcela_1 and parcela_2;
else operacao_xor <= parcela_1 xor parcela_2;
end if;
end process operacao_logica;
end logica;
-------------------------------------------------------------------------------------------------------------- * * * * * Comentários * * * * * -- O programa deve receber o nome de lab3.vhd------------------------------------------------------------------------------------------------------------
library IEEE;use ieee.std_logic_1164.all;
entity lab3 isport ( controle : in bit;
parcela_1 : in bit_vector( 3 downto 0);parcela_2 : in bit_vector( 3 downto 0);soma : out bit_vector( 4 downto 0);multiplicacao : out bit_vector( 7 downto 0)
);end lab3;
architecture logica of lab3 is
signal soma_total : bit_vector ( 4 downto 0);signal mult_total : bit_vector ( 7 downto 0);
begin process ( controle, parcela_1, parcela_2)
begin
if (controle = ‘1’ ) thensoma_total := parcela_1 + parcela_2;
else mult_total := parcela_1 * parcela_2;
end if;
soma <= soma_total;multiplicacao <= mult_total;
end process;
end logica;
5.5 COMANDO LOOP FOR - WHILE
<label opcional>: for <parâmetros> in <valor_final> loop<seqüência de comandos>
end loop <label opcional>;
OBS.: O PARÂMETRO NÃO PODE TER SEU VALOR ALTERADO EM HIPÓTESE ALGUMA DENTRO DO LOOP FOR
O exemplo abaixo, apresenta de que forma pode ser utilizado o comando LOOP-FOR.
1 process (A)23 begin4 variable Z : bit_vector( 3 downto 0);5 A <= 2;6 Z := “0000”;7 for i in 0 to 3 loop8 if(A = i) then9 Z(i) := ‘1’;
10 end if;11 end loop;12 end process;
Note que este loop será realizado 4 vezes, independentemente da condição IF-THEN. O funcionamento deste programa baseia-se na atribuição de 1 na posição Z(2) quando i for igual a A, ou seja, 2..
Usando o loop While
1 2
Na figura 1, o processo aguarda até que clk seja igual a 1, enquanto isso ele fica parado. Quando o clk for igual a 1 (figura 2), então o processo
entra no loop while. Este loop aguarda até que o Level seja igual 1, enquanto isso ele fica no loop while Level = ‘1’ loop => end loop (figura 3).
3 4
Quando Level for igual a 1, então ele incrementa o contador (figura 4).
5.6 COMANDO NEXT
O comando NEXT é utilizado para terminar prematuramente execução de uma iteração do tipo while, for ou um loop infinito.
process(A)begin
Z <= “0000”;for i in 0 to 3 loop
next when A/=i;Z(I) <= ‘1’;
end loop;end process;
5.7 COMANDO EXIT
exit => utilizado para terminar um while, for;exit <label_loop> => termina o laço e desloca para o label;exit <label_loop> when <condição> => termina o laço quando (when) condi- ção é satisfeita;
5.8 COMANDO CASE
O comando case seleciona a execução que ocorrerá de uma lista de alternativas.
porta_programável : process (Mode, PrGIn1, PrGIn2)begin
case Mode iswhen “000” => PrGOut <= PrGIn1 and PrGIn2;when “001” => PrGOut <= PrGIn1 or PrGIn2;when “010” => PrGOut <= PrGIn1 nand PrGIn2;when “011” => PrGOut <= PrGIn1 nor PrGIn2;when “100” => PrGOut <= not PrGIn1;when “101” => PrGOut <= not PrGIn2;when others => PrGOut <= ‘0’
end case;end process porta_programavel;porta_programável : process (Mode, PrGIn1, PrGIn2)
begincase Mode is
when “000” => PrGOut <= PrGIn1 and PrGIn2;when “001” => PrGOut <= PrGIn1 or PrGIn2;when “010” => PrGOut <= PrGIn1 nand PrGIn2;when “011” => PrGOut <= PrGIn1 nor PrGIn2;when “100” => PrGOut <= not PrGIn1;when “101” => PrGOut <= not PrGIn2;when others => PrGOut <= ‘0’
end case;end process porta_programavel;porta_programável : process (Mode, PrGIn1, PrGIn2)
begincase Mode is
when “000” => PrGOut <= PrGIn1 and PrGIn2;when “001” => PrGOut <= PrGIn1 or PrGIn2;when “010” => PrGOut <= PrGIn1 nand PrGIn2;when “011” => PrGOut <= PrGIn1 nor PrGIn2;when “100” => PrGOut <= not PrGIn1;when “101” => PrGOut <= not PrGIn2;when others => PrGOut <= ‘0’
end case;
end process porta_programavel;
5.9 COMANDO NULL
O comando null é frequentemente utilizado com o comando case, a última opção do case ficaria com null. Similar ao null da Linguagem C.
5.10 COMANDO RETURN
Utilizado em funções, tem a finalidade de retornar um valor.
6 ESPECIFICANDO A ESTRUTURA DE UM SISTEMA
Neste capítulo será apresentado uma outra forma de detalhamento de um sistema, visando obter um sistema compacto, sem a necessidade de repetição de processos. Para isso, é necessário o uso de component e port map.
O component é exatamente a descrição de um componente, ou seja, define-se anteriormente sua topologia, permitindo assim o uso repetidas vezes.
O port map é um mapeamento deste componente em um sistema maior.
EX.: Suponha que você tenha um sistema composto por cinco componentes, mas de dois tipos diferentes, por exemplo 7408 e 7404. A Figura 6.1, apresenta esta situação, porém ao invés de um CI completo, vamos supor que tenha somente uma porta lógica.
FIGURA 6.1: Exemplo de um sistema
Note que a placa acima possui cinco blocos internos, que são representados por dois componentes. O primeiro passo é modelar estes componentes, o programa 1 apresenta esta modelagem e o programa 2 modela o segundo componente.Já o programa 3, modela os cinco blocos dentro da placa. Note que a instrução
component componente_andport( a: in bit; b : in bit; c : out bit);
end component;
está chamando o componente and anteriormente modelado. Já a instrução
and1 : componente_and port map (a => in1, b => in2, c => s1);
mapeia o bloco (componente and) na placa. Todos os blocos precisam ser nomeados na placa dentro da placa.
Programa 1: descreve o componente inversor;Programa 2: descreve o componente and;Programa 3: descreve um sistema utilizando estes dois componentes;
Programa 1 Programa 2----------------------------------------------------------- Arquivo componente_inv.vhd-- Modelo do inversor---------------------------------------------------------
library IEEE;use IEEE.std_logic_1164.all;
entity componente_inv isport(
x : in bit;y : out bit);
end componente_inv;
architecture arquitetura_inv of componente_inv is
begin y <= not x;
end arquitetura_inv;
----------------------------------------------------------- Arquivo componente_and.vhd-- Modelo da porta AND---------------------------------------------------------
library IEEE;use IEEE.std_logic_1164.all;
entity componente_and isport(
a : in bit;b : in bit;c : out bit);
end componente_and;
architecture arquitetura_and of componete_and is
begin c <= a and b;
end arquitetura_and;
Programa 3-------------------------------------------------------- Arquivo componente_sistema.vhd-- Modelo da porta AND------------------------------------------------------
library IEEE;use IEEE.std_logic_1164.all;
entity componente_sistema isport(
in1 : in bit;in2 : in bit;in3 : in bit;in4 : in bit;out1 : out bit);
end componente_sistema;
architecture arquitetura_sistema of componente_sistema is
component componente_andport( a: in bit; b : in bit; c : out bit);
end component;
component componente_invport( x: in bit; y : out bit);
end component;
signal s1, s2, s3, s4 : bit;
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 => out1);inv1 : componente_inv port map (x => s1, y => s3);inv2 : componente_inv port map (x => s2, y => s4);
end arquitetura_sistema;
7 ALGUNS EXEMPLOS DE IMPLEMENTAÇÕES EM VHDL
A seguir são apresentado três exemplos utilizando a Linguagem de Descrição de Hardware (VHDL).
O primeiro deles é a implementação de uma ULA (Unidade Lógica Aritmética). A estrutura é igual aos exemplos anteriores, na entity foi declarado 4 sinais: controle, operando_a, operando_b e saída. Então, a interface do sistema é definida por estes pinos de I/O .
Logo a seguir, está estruturada a arquitetura da ULA, de forma que a palavra de controle seleciona o tipo de operação que será realizada, para isso foi utilizado if-then-else.
A Figura 7.1, apresenta a simulação feita no MAXPLUX II. Note que a saída está atrasada em relação ao sinal de controle, justificando o atraso inerente as portas lógicas.
------------------------------------------------------------------ Implementação de uma ULA.----------------------------------------------------------------library IEEE;use IEEE.std_logic_1164.all;
entity ula isport(
controle : in bit_vector(2 downto 0);operando_a : in bit_vector(7 downto 0);operando_b : in bit_vector(7 downto 0);saida : out bit_vector(7 downto 0));
end ula;
architecture estrutura of ula is
begin
process (controle, operando_a, operando_b)beginif (controle = "000") then
saida <= operando_a and operando_b;elsif (controle = "001") then
saida <= operando_a or operando_b;elsif (controle = "010") then
saida <= operando_a xor operando_b;elsif (controle = "011") then
saida <= operando_a nor operando_b;elsif (controle = "100") then
saida <= not(operando_a);elsif (controle = "101") then
saida <= not(operando_b);
elsif (controle = "110") thensaida <= operando_a nand operando_b;
elsif (controle = "111") thensaida <= not(operando_a xor operando_b);
end if;end process;
end estrutura;
FIGURA 7.1: Simulação da ULA.
O próximo exemplo apresenta a implementação de um decodificador 3x8. Como no exemplo anterior, a estrutura é a mesma, na entity são declarados os pinos de entrada e saída. Neste exemplo, utilizou-se o comando case para a implementação do decodificador. A Figura 7.2 apresenta a simulação do decodificador 3x8.
----------------------------------------------------------------------- Implementação de um decodificador 3x8.---------------------------------------------------------------------
library IEEE;use IEEE.std_logic_1164.all;
entity decodificador isport(
controle : in bit_vector(2 downto 0);saida : out bit_vector(7 downto 0));
end decodificador;
architecture estrutura of decodificador isbegin
process (controle)begin
case controle iswhen "000" => saida <= "00000001";when "001" => saida <= "00000010";when "010" => saida <= "00000100";when "011" => saida <= "00001000";when "100" => saida <= "00010000";when "101" => saida <= "00100000";when "110" => saida <= "01000000";when "111" => saida <= "10000000";
end case;end process;
end estrutura;
Dispositvos Programáveis (FPGA) e Linguagem de Descrição de Hardware (VHDL)
FIGURA 7.2: Simulação do decodificador
Eng. Anderson Royes Terroso http://www.ee.pucrs.br/~terroso
43
Dispositvos Programáveis (FPGA) e Linguagem de Descrição de Hardware (VHDL)
O próximo exemplo é bem simples, apresenta a implementação de um registrador de 12 bits, note que o processo só enviará os dados da entrada para a saída quando o clock for nível lógico um. A Figura 7.3, apresenta a simulação deste programa.
------------------------------------------------------------------------- Implementação de um registrador de 12 bits.-----------------------------------------------------------------------
library IEEE;use IEEE.std_logic_1164.all;
entity reg12 isport(
d : in bit_vector(11 downto 0);clk : in bit;q : out bit_vector(11 downto 0));
end reg12;
architecture estrutura of reg12 isbegin
processbegin
wait until clk = '1';q <= d;
end process;end estrutura;
FIGURA 7.3: Simulação do registrador de 12 bits.
Eng. Anderson Royes Terroso http://www.ee.pucrs.br/~terroso
44
Dispositvos Programáveis (FPGA) e Linguagem de Descrição de Hardware (VHDL)
8 BIBLIOGRAFIA
Bostock, Geoff, FPGAs and programmable LSI : a designer's handbook. Oxford : Butterworth-Heinemann, 1996. 216p.
Hachtel, Gary D. ; Somenzi, Fabio, Logic synthesis and verification algorithms. Boston : Kluwer Academic, 1996. 564p.
Brown, Stephen D. et al. Field-programmable gate arrays. Boston : Kluwer Academic, 1992. 206p.
Trimberger, Stephen M. (Ed). Field-programmable gate array technology. Boston : Kluwer Academic, 1994. 258p.
Grünbacher, Herbert ; Hartenstein, Reiner W. (Ed.).Field-programmable gate arrays : architectures and tools for rapid prototyping. Berlin : Springer, 1993. 220p.
IEEE Workshop on FPGAs for Custom Computing Machines (1993 :Napa) Proceedings. ; Buell, Duncan A. ; Pocek, Kenneth L. (Ed.).Los Alamitos, CA : IEEE Computer Society Press, 1993. 212p.
CHANG, K. C., Digital Design and Modeling with VHDL and Synthesis.IEEE Computer Society Press, 1997
AIRIAU, R. et all. VHDL du langage à la modélisation. Presses Polytechniques Universitaires Romandes, 1990.
MAX+PLUS II & VHDL, Customer Training - ALTERA.
MAX+PLUS II, Programmable Logic Development System - Getting Started. ALTERA, Version 6.0, 1995.
VHDL Reference Guide, ACTIVE-VHDL Series Book1. ALDEC, 1998.
INTERNET:
ftp://ftp.cs.adelaide.edu.au/pub/VHDLhttp://www.altera.comhttp://www.aldec.com
Eng. Anderson Royes Terroso http://www.ee.pucrs.br/~terroso
45