vhdl - di.ufpb.br · vhdl projeto de iniciação científica biblioteca aritmética murilo i....

26
VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues www.vhdl.hpg.com.br [email protected] FEI - 1999

Upload: ngocong

Post on 01-Apr-2019

217 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

VHDLProjeto de Iniciação Científica

Biblioteca Aritmética

Murilo I. [email protected] - 1999

Page 2: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

INDICE

PARTE I

Apresentação do MaxPlux................................................................................................... 1

Iniciando um Projeto para Descrição em VHDL................................................................. 2

Comandos Principais.............................................................................................. 3

Tipos de Sinais....................................................................................................... 4

Entradas e Saídas do Nosso Projeto - Definindo uma Entidade........................................... 4

Definindo a Arquitetura do Nossa Entidade......................................................................... 5

Definindo um Processo para nossa Arquitetura................................................................... 6

Finalmente vamos escrever o código

Apresentação do Algoritmo da SOMA.................................................................. 8

Em VHDL.............................................................................................................. 8

Código Final........................................................................................................... 10

Agora vamos Copilar o Código Digitado............................................................................. 11

Simulando o Projeto............................................................................................................. 12

Iniciando um Projeto para Desenhar o Circuito (Floorplan)

Símbolos do Floorplan ........................................................................................... 17

Exercícios............................................................................................................................. 21

Page 3: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

PARTE I

Page 4: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

MaxPlux

Apresentação do MAX+plus

Este software nos será útil para a simplificação e implementação de circuitos digitais. Particularmentetrabalharemos com a parte aritmética, criando uma biblioteca aritmética para ser usada em aplicações futuras.

Para Iniciar umnovo projeto!

Page 5: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Iniciando um Projeto para Descrição em VHDL

Na barra de ferramentas do MAX+plus clique no botão mais a esquerda, após abrir a janela de‘Novo’, você irá informar o que você quer, selecione ‘Text Editor file’ e clique Ok. Abrirá uma janela detexto onde você digitará o seu projeto.

Antes de prosseguir, salve o projeto informado que é um texto que contem uma descrição em VHDL, cliqueno botão salvar . Na janela ‘Salvar’, informe o nome do projeto e indique que a extensão *.VHD, eclique Ok.

Page 6: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Comandos Principais

Agora já podemos digitar nosso projeto:

Em primeiro vamos indicar que queremos usar a biblioteca ieee.

LIBRARY ieee;USE ieee.std_logic_1164.all;

Agora vamos declarar uma entidade, que contém a descrição das entradas e saídas do circuito.

Selecione no Menu Templantes, VHDL Templantes..., e selecione Entity Declaration e clique Ok.

Criará o seguinte código em seu projeto.

ENTITY __entity_name ISPORT(

__input_name, __input_name : IN STD_LOGIC;__input_vector_name : IN

STD_LOGIC_VECTOR(__high downto __low);__bidir_name, __bidir_name : INOUT STD_LOGIC;__output_name, __output_name : OUT STD_LOGIC);

END __entity_name;

__entity_name – Nome da entidade, tem que ser obrigatoriamente o mesmo nome do projeto.__input_name – Nome de um sinal de entrada.__output_name - Nome de um sinal de saída.

Page 7: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Tipos de Sinais

STD_LOGIC – sinal lógico aceita ‘1’ – nível lógico 1, ‘0’ – nível lógico 0.STD_LOGIC_VECTOR(bit downto 0)– um vetor de sinais lógicos com tamanho de bit-1 bits.

Entradas e Saídas do Nosso Projeto – Definindo uma Entidade

Nosso projeto será um somador de 8 bits, e terá como entrada dois vetor, A e B, que serão os operadores e umvetor de saída S que conterá o resultado da soma de A e B.

Faça as substituições necessárias para que o código fique da seguinte maneira:

LIBRARY ieee;USE ieee.std_logic_1164.all;

ENTITY Algo ISGENERIC(byte_entrada: integer := 8; byte_saida: integer := 16);PORT(

clk : IN STD_LOGIC;A, B : IN STD_LOGIC_VECTOR(byte_entrada-1 downto 0);S : OUT STD_LOGIC_VECTOR(byte_saida-1 downto 0));

END Algo;

Note que:GENERIC – Está instrução serve para declarar constantes na entidade, note que usamos as constantesbyte_entrada e byte_saida para indicar o tamanho dos sinais de entrada e saída respectivamente e as usaremosmais a frente em nosso projeto.

O sinal de entrada clk servirá para acionar o somador, qdo. este sinal for de ‘0’ para ‘1’ o circuito apresentaráa soma do sinal A com o sinal B na saída S.

Qdo. o sinal é declarado como INOUT, ele servirá tanto para entrada como para saída. Ou seja, este sinal desaída será um registrador interno também.

Page 8: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Definindo a Arquitetura do Nossa Entidade

Novamente selecione no Menu Templates, VHDL Templantes..., selecione Architecture Body... e clique Ok.

Criará o seguinte código em seu projeto.

ARCHITECTURE a OF __entity_name ISSIGNAL __signal_name : STD_LOGIC;SIGNAL __signal_name : STD_LOGIC;

BEGIN-- Process Statement

-- Concurrent Procedure Call

-- Concurrent Signal Assignment

-- Conditional Signal Assignment

-- Selected Signal Assignment

-- Component Instantiation Statement

-- Generate StatementEND a;

(a) Nome daArquitetura

Nome da Entidadeque a arquiteturadescreve

Declarações de SinaisAuxiliares usados naarquitetura.Descrição dos

processossíncronos eassíncronos

Page 9: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Faça as alterações necessárias para que o código fique da seguinte maneira:

LIBRARY ieee;USE ieee.std_logic_1164.all;

ENTITY Algo ISGENERIC(byte_entrada: integer := 8; byte_saida: integer := 16);PORT(

clk : IN STD_LOGIC;A, B : IN STD_LOGIC_VECTOR(byte_entrada-1 downto 0);S : OUT STD_LOGIC_VECTOR(byte_saida-1 downto 0));

END Algo;

ARCHITECTURE Algo OF Algo IS

BEGIN-- Process Statement

END Algo;

Definindo um Processo para nossa Arquitetura

Posicione o cursor na linha seguinte ao comentário ‘-- Process Statement’ , e vá ao Menu Templates,Templates..., e selecione Process (Combinatorial Logic).... Será criado o seguinte código em seu projeto:

__process_label:PROCESS (__signal_name, __signal_name, __signal_name)

VARIABLE __variable_name : STD_LOGIC;VARIABLE __variable_name : STD_LOGIC;

BEGIN-- Signal Assignment Statement

-- Variable Assignment Statement

-- Procedure Call Statement

-- If Statement

-- Case Statement

-- Loop StatementEND PROCESS __process_label;

Nome do Processo

Declarações de VariáveisAuxiliares usadas dentrodo Processo.

Descrição da seqüência deações que descreve oprocesso.

Page 10: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Faça as alterações necessárias para que o código fique da seguinte maneira:

LIBRARY ieee;USE ieee.std_logic_1164.all;

ENTITY Algo ISGENERIC(byte_entrada: integer := 8; byte_saida: integer := 16);PORT(

clk : IN STD_LOGIC;A, B : IN STD_LOGIC_VECTOR(byte_entrada-1 downto 0);S : OUT STD_LOGIC_VECTOR(byte_saida-1 downto 0));

END Algo;

ARCHITECTURE Algo OF Algo IS

BEGIN-- Process Statement

Algo_Soma:PROCESS (clk)BEGIN

END PROCESS Algo_Soma;

END Algo;

Note que:PROCESS(clk) – clk como parâmetro indica que o processo só será executado qdo. O sinal de entrada clkmudar de estado lógico.

Page 11: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Finalmente vamos escrever o código

Apresentação do Algoritmo da SOMA

SejaA := Operado1 -- NR_MAX_DE_BITSB := Operador2 -- NR_MAX_DE_BITSR := Resultado da soma -- 2 * NR_MAX_DE_BITS

vaium := ‘0’;Para i de 0 até NR_MAX_DE_BITS-1 Faça

R[i]:= A[i] xor B[i] xor vaium;

vaium := ( B[i] and A[i] ) or( B[i] and vaium) or(vaium and A[i] );

Fim;

R[NR_MAX_DE_BITS] := vaium;

Para i de NR_MAX_DE_BITS +1 até 2 * NR_MAX_DE_BITS-1 FaçaR[i]:= ‘0’;

Fim;

Por exemplo: Somar 3H com BH, resultando EH. A e B com 4 bits e R com 8 bits.

carry A(I) B(I) R(O)0 0011 1011 000000001 0011 1011 000000101 0011 1011 000001100 0011 1011 000011100 00001110

000011100000111000001110

Em VHDL

• Na linha abaixo de Process(clk), vamos colocar a declaração da uma variável auxiliar vaium.

--Declara uma variavel auxiliar 'vaium' com tipo: STD_LOGIC--Serão usadas mas adiante no códigoVARIABLE vaium : STD_LOGIC;

• Posicione o cursor entre BEGIN e END PROCESS..., e digite os códigos ou procure no Menu Templates,VHDL Templates... .

• Primeiro vamos informar que nosso circuito só funcionará na borda de subida do clk.

Page 12: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

--Só executar a soma se clk for borda de subidaIF clk'EVENT AND clk = '1' THEN

-- Coloque seu código aqui

END IF;

EVENT – Indica que houve um evento de clk.AND clk = ‘1’ – Indica que clk foi para ‘1’

• Satisfazendo a condição de ser borda de subida do clk, vamos iniciar vaium com ‘0’:--Qdo. o processo começar, inicia a var. vaium com 0vaium := ‘0’;

:= , serve para atribuições em variáveis e<=, serve para atribuições em sinais

• Logo após, vamos fazer o loop da Soma.

--Loop PrincipalloopSoma:FOR i IN A'RANGE LOOP S(i) <= A(i) xor B(i) xor vaium;

vaium := ( B(i) and A(i) ) or( B(i) and vaium) or(vaium and A(i) );

END LOOP loopSoma;

A'RANGE – indica que i vai tomar valores de 0 até o tamanho de bits de A, e executar as ações para cada umdeste valor.

• Depois de ter executado o loop da Soma, vamos colocar vaium na posição ‘byte_entrada’ do sinal S.

--Se o resultado excedeu o tamanho de bits da entradaS(byte_entrada) <= vaium ;

• E zerar as demais posições de S, ou seja os bits de byte_entrada até byte_saida-1.

--Zera os bits mais altos não usados na somaloopZera:FOR i IN byte_entrada+1 TO byte_saida-1 LOOP S(i) <= '0';END LOOP loopZera;

• Pronto o sinal S contém o resultado da soma de A com B.

Em seguida listamos o código final do nosso projeto:

Page 13: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Código Final

LIBRARY ieee;USE ieee.std_logic_1164.all;

ENTITY Algo ISGENERIC(byte_entrada: integer := 8; byte_saida: integer := 16);PORT(

clk : IN STD_LOGIC;A, B : IN STD_LOGIC_VECTOR(byte_entrada-1 downto 0);S : OUT STD_LOGIC_VECTOR(byte_saida-1 downto 0));

END Algo;

ARCHITECTURE Algo OF Algo ISBEGIN-- Process Statement

Algo_Soma:PROCESS (clk)

--Declara uma variavel auxiliar 'vaium' com tipo: STD_LOGIC--Serão usadas mas adiante no códigoVARIABLE vaium : STD_LOGIC;

BEGIN

--Só executar a soma se clk for borda de subidaIF clk'EVENT AND clk = '1' THEN

--Qdo. o processo começar, inicia a var. vaium com 0vaium := '0';

--Loop PrincipalloopSoma:FOR i IN A'RANGE LOOP S(i) <= A(i) xor B(i) xor vaium;

vaium := ( B(i) and A(i) ) or( B(i) and vaium) or(vaium and A(i) );

END LOOP loopSoma;

--Se o resultado excedeu o tamanho de bits da entradaS(byte_entrada) <= vaium ;

--Zera os bits mais altos não usados na somaloopZera:FOR i IN byte_entrada+1 TO byte_saida-1 LOOP S(i) <= '0';END LOOP loopZera;

END IF;END PROCESS Algo_Soma;

END Algo;

Page 14: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Agora vamos Copilar o Código Digitado

Antes vá no Menu de Projetos, File – Project, e selecione Set Project to Current File. Assim você informa queo projeto principal é o que está na janela ativa.

Depois no Menu de Projetos clique em Save & Compile, aparecerá mais duas janelas, uma do copilador, eoutra com as mensagens da compilação. No caso do código estiver com erro de sintaxe, no fim da tentativa decompilação será mostrado uma mensagem informando quantos erros ocorreram.

Setar ProjetoPrincipal

Para Copilarou Simular.

Mensagem de Erro, falta ‘;’ nofinal da linha 33. Dê doiscliques na mensagem e corrijaesse erro.

Page 15: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Neste caso, na janela de mensagens são informados o número da linha e o que ocorreu de errado. Dê doiscliques na mensagem de erro e você será levado a linha que foi identificado o erro.Um erro muito comum é o esquecer do ponto e virgula no final da linha.Algumas vezes as mensagens de erro seguinte da primeira são conseqüência dela, ou seja, identificando econcertando o primeiro erro os demais também são consertados. As vezes ocorre o contrario um erro escondeos outros, ou seja, consertando aparentemente o único erro do projeto e copilando novamente, você descobrevários outros.Mas não desista, lembre-se do ditado que diz: aprendemos com nossos próprios erros.

Simulando o Projeto

No Menu MAX+plus II, clique em Waveform Editor. Abrirá a janela do Editor de Forma de Onda. Nela vocêcolocará os sinais de entrada e saída que deseja testar. Seta os sinais de entrada no tempo.Manda simular, e será mostrado os dados de saída em função do tempo.

Page 16: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Com a janela Waveform Editor aberta. Vá ao Menu Node e Selecione Insert Node. Abrirá a seguinte janela,na qual você escolherá os sinais de entrada ou saída que desejar.

Selecione clk(I) e clique Ok. Repta o procedimento, inserindo os sinais A(I), B(I) e S(O).Clique duas vezes em cima de A(I), abrirá uma janela de informações do Grupo de sinal A[0..7].

Selecione HEX e clique Ok. Assim os números serão exibidos em hexadecimal. Repita também para B e S.

Listagem de todos osSinais, de entrada esaída do projeto

Nome do Sinal que seráinserido

Lista sinais.

InsereSinal

Tipo do sinal:Entrada ou Saída.

Page 17: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Seu Waveform deve estar assim:

Agora, vamos colocar os valores em A e B que queremos somar. Selecione A(I), clicando em cima dele.

Com A(I) selecionado clique em na barra de ferramentas a esquerda. Digite um valor e Ok.

Repita o procedimento com B(I), digitando um valor para ele também.

Com o sinal clk, vamos criar uma borda de subida num tempo qualquer maior que 0, claro.

Com o mouse selecione a faixa de tempo que deseja colocar ‘1’ em clk: por exemplo:

E clique em na barra de ferramentas a esquerda. Isso fará com que a faixa selecionada fique em um.

No exemplo, borda de subida em t=100,0ns, onde ocorrerá a soma de A com B e será apresentado o resultadoem S.

Seu Waveform deve estar assim:

Faixaselecionadacom o mouse!

Page 18: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Finalmente com todas as entradas setadas, vamos mandar simular o projeto. Vá ao Menu File, Project, Save &Simulate.

Abrirá uma janela pedindo que você informe um nome para o arquivo WaveForm, clique Ok.

Ele começara o processo de simulação, e se não houver nenhum erro, você verá a seguinte mensagem:

Clique Ok e seu WaveForm deverá estar assim:

Sinais emrelação aotempo

Tempo

CursorNome doSinalI-EntradaO-Saída

Valor dossinais em cimado cursor.

Page 19: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Você pode selecionar um intervalo de tempo para a simulação. No Menu View, clique em Time Range.Na janela Time Range coloque o tempo inicial e final, depois clique Ok.

No Menu View clique em Fit in Windows, que redesenha os sinais colocando-os todos dentro da telaAgora faça mais teste com os sinais, por exemplo:

Note que a soma é feita somente qdo. o sinal clk é levado para ‘1’.

Page 20: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Iniciando um Projeto para Desenhar o Circuito (Floorplan)

Na barra de ferramentas do MAX+plus clique no botão mais a esquerda, após abrir a janela de‘Novo’, você irá informar o que você quer, selecione ‘Graphic Editor file’ e ‘*.gdf’ e clique Ok. Assim Abriráuma janela na qual você desenhará o seu projeto.

Símbolos do Foorplan

Dê um clique duplo dentro da janela de desenho ou selecione no menu Symbol, Enter Symbol..., e abrirá umdialogo permitindo que selecione um símbolo pré-definido. Por exemplo, para iniciarmos nosso projetovamos selecionar três símbolos de entrada (input) e um de saída (output).

Selecione aquia Biblioteca desímbolos.

Selecioneaqui oSímbolos.

Page 21: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Na tela de ‘Lista de Símbolos’, selecione ..\maxplus2\max2lib\prim na biblioteca de símbolo, dando doiscliques nesta opção, será listada os símbolos dessa biblioteca, selecione input., e clique Ok.Será criada em sua janela de trabalho uma porta de entrada:

Para um dar o nome do sinal, selecione este sinal com um clique em cima dele. Clique no botão direito domouse e aparecerá o seguinte menu:

Selecione Edit Pin Name e escolha um nome para este sinal.

Repita este processo mais duas vezes, criando assim três sinais de entradas (A, B e VemUm). E com o mesmoprocesso, só que selecionando output no lugar de input, crie dois sinal de saída (S e VaiUm) para nossoprojeto.

O circuito deverá obedecer as seguintes fórmulas:S := A xor B xor VaiUm;VaiUm := ( B and A ) or ( B and VaiUm) or (VaiUm and A);

RecortarCopiarColarApagar componente

Editar Nome do Sinal

Editar valor Default dosinal (Vcc ou GND)

Roda Componente:Verticalmente,HorizontalmentePor angulo.

Page 22: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Repetindo o processo para selecionar os sinais de entrada e saída (input e output), escolha agora as portaslógicas: duas xor, três and2 e uma or3.Para facilitar, quando o cursor estiver em Symbol Files e você quer selecionar xor, digite ‘X’ no teclado, queserá posicionado o cursor no próximo símbolo que comece com a letra ‘X’.Mais uma, se você já tem um componente na tela e deseja outro igual, selecione-o, clique no botão direito domouse, escolha copiar. Depois no local da tela onde deseja copy o componente, clique novamente no botãodo mouse e selecione paste. Ou, segurando o Ctrl, clique no componente e arraste-o que ele será duplicado.

Sua tela deve estar assim:

Agora com o Menu de Ferramentas posicionado mo lado esquerdo da janela, desenhe as linhas necessárias:

Modo Cursor, Serve paraarrastar componentes.

Para escrever alguminformativo no circuito.

Para fazer linhas de ligaçãocom curvas de 90 º.

Linhas de ligação retas.

Amplia ou Diminui avisualização doscomponentes.

Page 23: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Seu circuito deve ficar assim:

Agora Salve, Compile e Simule o circuito da mesma maneira que foi descrito na parte anterior deste manual.

Digite Ctrl+L ou vá e, Files, Project, Save & Copile. Se todas as ligações foram feitas corretamente, vocêdeve receber uma mensagem ‘Projeto Compilado com sucesso’.

Crie uma nova janela WaveForm para simular o projeto. Insira nela os sinais A, B, VemUm e VaiUm. Nomenu Node, Insert Node. Na janela Insert Node, clique em List, selecione o sinal e clique Ok. Para maisinformação ver Capitulo Simulando o Projeto.

Informe os valores desejados para os sinais de entrada, no menu selecione, Files, Project, Save & Simule oudigite Ctrl+Shift+L para salvar e simular o projeto obtendo assim os valores de saída a partir dos dados deentrada.

Obtendo assim:

Há vários outros símbolos pré-definidos que você pode usar como também todos os seus projetos já copiladostambém estarão disponíveis.

Page 24: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Exercícios:

1) Fazer a descrição em VHDL de um circuito subtrator de n bits. Copilar e Simular.R.:

Apresentação do Algoritmo da Subtração

SejaA := Operado1 -- NR_MAX_DE_BITSB := Operador2 -- NR_MAX_DE_BITSR := Resultado da soma -- NR_MAX_DE_BITS

vaium := ‘0’;Para i de 0 até NR_MAX_DE_BITS-1 Faça

R[i]:= A[i] xor B[i] xor vaium;

vaium := ( B[i] and R[i]) or( B[i] and vaium) or(vaium and R[i]);

Fim;

Por exemplo: Subtrair 3H de BH, resultando 8H. A, B e R com 4 bits.

carry A(I) B(I) R(O)0 0011 1011 00000 0011 1011 00000 0011 1011 00000 0011 1011 1000

Foi feito um flag de erro, que vai para ‘1’ quando o operador B for maior que o operador A. Isso geraria umresultado negativo, não previsto.

Page 25: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

Em VHDL:

LIBRARY ieee;USE ieee.std_logic_1164.all;-- Subtração S = A - BENTITY Subr IS

GENERIC(byte_entrada: integer := 8; byte_saida: integer := 8);PORT(

clk : IN STD_LOGIC;A, B : IN STD_LOGIC_VECTOR(byte_entrada-1 downto 0);S : OUT STD_LOGIC_VECTOR(byte_saida-1 downto 0);erro : OUT STD_LOGIC);

END Subr;

ARCHITECTURE Subr OF Subr ISBEGIN-- Process Statement

Subr_Soma:PROCESS (clk)

--Declara uma variavel auxiliar 'vaium' e svlAi com tipo: STD_LOGIC--Serão usadas mas adiante no códigoVARIABLE vaium : STD_LOGIC;VARIABLE auxS: STD_LOGIC;

BEGIN

--Só executar a soma se clk for borda de subidaIF clk'EVENT AND clk = '1' THEN

--Qdo. o processo começar, inicia a var. vaium com 0vaium := '0';

--Loop PrincipalloopSoma:FOR i IN 0 TO byte_entrada-1 LOOP

auxS := (A(i) xor B(i) xor vaium);S(i) <= (A(i) xor B(i) xor vaium);

vaium := ( B(i) and auxS ) or ( B(i) and vaium) or (vaium and auxS ) ;

END LOOP loopSoma;

--Se o A > B, resultado é negativo.erro <= vaium ;

END IF;END PROCESS Subr_Soma;

END Subr;

Page 26: VHDL - di.ufpb.br · VHDL Projeto de Iniciação Científica Biblioteca Aritmética Murilo I. Rodrigues  muriloir@uol.com.br FEI - 1999

2) Fazer o desenho em Floorplan de um circuito contador assíncrono. Copilar e Simular.R.

Um contador é um registrador capaz de contar o número de pulsos de relógio que chegaram em suaentrada de relógio.

A fig. Abaixo mostra um contador construído com biestáveis JK.

O Circuito:

A simulação: