Você está na página 1de 5

Universidade Federal de Minas Gerais

Escola de Engenharia – Departamento de Engenharia Eletrônica


Laboratório de Sistemas Digitais
Aulas 11 e 12: Construção de bibliotecas VHDL com componentes parametrizáveis.

OBJETIVOS:
 Projeto de componentes em VHDL. Projeto e simulação de uma biblioteca de componentes em VHDL no
ambiente Quartus II – Altera para construção de um caminho de dados (ou bloco operacional) e de um
bloco de controle (ou unidade de controle) para implementação de lógica RTL. Implementação prática no
kit didático de lógica programável Exsto XD301.
 Criação de uma biblioteca de componentes parametrizáveis (de tamanho genérico).

MATERIAL UTILIZADO :
 Microcomputador com software Quartus II – Altera – Web Edition (gratuita). Kit didático de lógica
programável marca EXSTO modelo XD301 com CPLD da família MAX3000A, modelo EPM3064ALC44-10,
gravador USB Blaster e cabo USB.

INTRODUÇÃO :
Nessa prática você estudará e implementará em VHDL uma biblioteca de componentes. Os componentes que
você implementará nessa prática são normalmente encontrados em qualquer processador.
Todos os processadores são constituídos de dois blocos básicos: o caminho de dados (ou bloco operacional) e a
parte de controle (ou unidade de controle). O caminho de dados é a parte responsável por levar dados de um
componente de armazenamento a outro e de processar (ou modificar) esses dados de alguma forma, seja
através de uma operação lógica (AND, OR, etc.) ou uma operação aritmética qualquer. A unidade de controle,
por sua vez, é a parte do processador responsável por instruir os componentes que constituem o caminho de
dados a executarem suas funções em uma ordem pré-estabelecida. Essa ordem pré-estabelecida é a sequência
de ações que caracteriza um processador, ou seja, sua capacidade de executar tarefas encadeadas.

Keyword GENERIC

Em VHDL, o construto generic permite a criação de estruturas com tamanhos parametrizáveis. Por exemplo, as
entradas e saídas do multiplicador seguinte têm tamanhos que são definidos pela variável “n”:

Figura 1: VHDL - Exemplo de uso do construto generic: componente “mult_se_neg” com valor default de n=16 bits.

No exemplo da Figura 1, note que usamos o símbolo asterisco (*) para implementar um multiplicador. Isso foi
possível porque declaramos no cabeçalho (linha 3) o uso da biblioteca padrão “numeric_std”.

sd11_e_sd12.docx 1/5
Universidade Federal de Minas Gerais
Escola de Engenharia – Departamento de Engenharia Eletrônica
Laboratório de Sistemas Digitais
Aulas 11 e 12: Construção de bibliotecas VHDL com componentes parametrizáveis.

A definição de um generic precisa ser feito na entity do módulo. A sintaxe é:


entity
generic (
<nome do generic1> : <tipo do generic1> := <valor default>;
<nome do generic2> : <tipo do generic2> := <valor default>;
);

O tipo do generic pode ser natural ou integer. O generic pode ser usado na definição do tamanho de um
std_logic_vector. Dessa forma, estruturas aritméticas podem ser usadas. Por exemplo, as sentenças seguintes
n
definem o sinal teste1 com o tamanho de “n” bits e o sinal teste2 com o tamanho de 2 bits (‘**’ = ‘elevado a’).

signal teste1 : std_logic_vector (n-1 downto 0);


signal teste2 : std_logic_vector (2**n-1 downto 0);

Em um projeto hierárquico os generic de vários módulos podem ser conectados. Isso é feito pelo construto
generic map. Por exemplo, o CPLD EMP3064ALC44-10 existente no kit Exsto não comporta um multiplicador de
16 bits como estabelece o valor default de n=16 na rotina “mult_se_neg” mostrada na Figura 1. Mas podemos
instruir o compilador para usar um valor diferente do default, digamos gen=4 bits como mostra o exemplo a
seguir (Figura 2).

Figura 2: Exemplo de sobreposição do parâmetro default n=16 bits por gen=4 bits no uso do componente “mutl_se_neg” pela
entity “projeto”.

sd11_e_sd12.docx 2/5
Universidade Federal de Minas Gerais
Escola de Engenharia – Departamento de Engenharia Eletrônica
Laboratório de Sistemas Digitais
Aulas 11 e 12: Construção de bibliotecas VHDL com componentes parametrizáveis.

Neste exemplo o generic “gen” do módulo “projeto” conecta-se com o generic “n” do módulo mult_se_neg, de
tal forma que “n” para a instância “instancia_mult1” do componente “mult_se_neg” assume o valor contido
em “gen”, ou seja, “instancia_mult1” tem efetivamente 4 bits (e não 16 bits, que seria seu valor default caso a
senteça generic fosse omitida), como mostra a Figura 3 a seguir.

Note que a arquitetura para o componente mult_se_neg constante da Figura 1 testa o valor da multiplicação e
só o coloca na saída se este for “negativo” (bit mais significativo em 1 quando usamos aritmética em
complemento de dois). Veja na Figura 3-a que a realização prática desta arquitetura no CPLD usa o bit mais
significativo para habilitar os latches (a variable temp[7] vai nas entradas “ENABLE” dos latches que foram
instanciados). No caso da saída incondicional (se tirássemos o “if” ou o comentário da linha com o “else”),
teríamos a saída ligada direto no multiplicador (Figura 3-b).

(b)

(a)

Figura 3: Diferença entre as implementações do componente mult_se_neg implementado na Figura 1, sem o “else” (a) e com
o “else” (b). A arquitetura para o componente que testa o valor “negativo” usa o bit mais significativo para habilitar os latches
(temp[7] vai nas entradas “ENA” dos latches ). No caso da saída incondicional (com a linha do else ativa), temos apenas o
multiplicador, sem interferência de latches.

sd11_e_sd12.docx 3/5
Universidade Federal de Minas Gerais
Escola de Engenharia – Departamento de Engenharia Eletrônica
Laboratório de Sistemas Digitais
Aulas 11 e 12: Construção de bibliotecas VHDL com componentes parametrizáveis.

TAREFAS QUE DEVERÃO SER FEITAS ANTES DOS DIAS DAS AULAS (PRÉ-RELATÓRIO )
1. Estude os comandos em VHDL mais apropriados para descrição de componentes parametrizáveis:
GENERIC e GENERIC MAP.
2. Estude no capítulo 4 do livro de Sistemas Digitais do Frank Vahid o funcionamento dos seguintes
componentes:
a. Registrador de carga paralela;
b. Registrador de deslocamento (sequencial);
c. Somadores (ripple carry);
d. Deslocador Barrel Shifter (combinacional);
e. Comparadores de igualdade e de magnitude;
f. Contadores Ascendentes/Descendentes;
g. Temporizadores;
h. Banco de Registradores

3. Implemente em VHDL cada um dos componentes acima de maneira a formar uma biblioteca, onde
eles possam ser reutilizados em um projeto de processador dedicado com capacidade de
processamento de um número qualquer de bits. Em outras palavras, escreva cada componente em
VHDL de forma parametrizável. Valide cada um dos componentes por meio de simulação. Anote em
uma tabela quantas macrocélulas cada componente de seu projeto consome para realizações de 2
bits, 4 bits e 8 bits. Na aula faremos uma comparação de eficiência da implementação com os demais
grupos. Caso o chip não comporte a solução de 8 bits, escolha um chip de maior capacidade da própria
família MAX3000 (p. ex. o MAX3128 tem 128 macrocélulas, o MAX3512 tem 512 macrocélulas, etc.).

ATIVIDADES NO LABORATÓRIO :
Cada um dos componentes desenvolvidos deverá ser testado no kit XD301 com a quantidade de bits genérica.
Devido à quantidade de componentes, teremos as aulas práticas 11 e 12 disponíveis para esta tarefa.

RELATÓRIO :
O grupo deverá entregar um relatório final no Moodle após a aula, no prazo determinado pelo professor,
documentando o item 3 do pré-relatório e contendo as correções eventualmente necessárias verificadas nas
aulas práticas.

OPCIONAL: ESCLARECIMENTOS SOBRE PACKAGE E BIBLIOTECAS (L IBRARIES) NO QUARTUS II:


Cada vez que se declara e compila um PACKAGE, ele é acrescentado automaticamente à biblioteca work, sendo
necessário somente fazer a declaração "use.work.nome_do_package.all". A condição default é jogar todas as
design units para a biblioteca “work”. Você pode deixar desta forma e tudo vai funcionar, ou então acrescentar
uma diretiva (como comentário: synthesis library my_lib) antes de cada entity no seu código VHDL para jogá-las
para um outro arquivo de biblioteca “my_lib” (opcional). Veja abaixo como isso pode ser feito no Quartus II:

-- synthesis library my_lib


library ieee;
use ieee.std_logic_1164.all;
entity my_entity(...)
end entity my_entity;

O texto na caixa mostrada na próxima página foi extraído do Help do Quartus II e diz como gerar uma library
com o nome que você escolher (ao invés de jogar tudo na library "work"). A Altera também recomenda que
toda cláusula "use" seja precedida de uma cláusula "library" correspondente. Em assignments > settings >
libraries você especifica a localização dos arquivos de library que irá usar.

sd11_e_sd12.docx 4/5
Universidade Federal de Minas Gerais
Escola de Engenharia – Departamento de Engenharia Eletrônica
Laboratório de Sistemas Digitais
Aulas 11 e 12: Construção de bibliotecas VHDL com componentes parametrizáveis.

TEXTO EXTRAÍDO DO “HELP” DO QUARTUS II: ORGANIZING A VHDL DESIGN INTO LIBRARIES

A VHDL library stores analyzed design units. Every design unit in a VHDL design must be compiled into a library, and two desi gn units
with the same name cannot be compiled into the same library. For example, if a design contains declares two packages with the same name,
it must compile the packages into different libraries. By default, the Quartus II software compiles all VHDL files into the work library. If a
VHDL design refers to a library that does not exist, or if the library does not contain a referenced design unit, the software searches for the
design unit in the work library. This behavior allows the Quartus II software to compile most VHDL designs with minimal setup.

Note: The Quartus II software cannot process VHDL designs with two or more entities of the same name even if the entities are
compiled into separate custom libraries.

Prior to analyzing the sources files in a design, you may specify a different destination library for the design units in a source file. You can
use one of the following three methods, described in more detail below:

 In the File Properties dialog box in the Quartus II graphical user interface (GUI)
 In the Quartus Settings File (.qsf) or with a Tcl command
 In the VHDL file itself, using a synthesis directive

When the Quartus II Compiler analyzes the file (in a flow that requires analysis of the source file), it stores the analyzed design units in the
file's destination library.

To specify a destination library name in the Quartus II GUI:

To specify a library name in the GUI for one of your VHDL files, follow these steps:

1. In the File name list on the Files page of the Settings dialog box, select the appropriate VHDL file.
2. Click Properties.
3. In the Type list, select VHDL (if it is not already selected).
4. In the Library box, type the library name or select an existing library name

To specify a destination library name in the QSF or with Tcl:

In the QSF or through Tcl commands, you can specify the VHDL library name with the -library argument associated with the
VHDL_FILE assignment.

For example, the following QSF or Tcl assignment specifies that the Quartus II software should analyze my_file.vhd and store its contents
(design units) in the VHDL library my_lib.

set_global_assignment VHDL_FILE my_file.vhd -library my_lib

To specify a destination library name in your VHDL file:

You can use the library synthesis directive to specify a library name in your VHDL source file. This directive takes a single string
argument: the name of the destination library. Specify the library directive in a VHDL comment prior to the context clause for a
primary design unit (a package declaration, an entity declaration, or a configuration), using one of the supported keywords for synthesis
directives, i.e. synthesis, pragma, synopsys, or exemplar.

The library directive overrides the default destination library work, the Library setting specified for the current file through the GUI,
QSF or Tcl, and any prior library directive in the current file. The directive remains effective until the end of the file or the next library
synthesis directive.

The following is an example using the library synthesis directive to create a library called my_lib that contains the design unit
my_entity.

-- synthesis library my_lib


library ieee;
use ieee.std_logic_1164.all;
entity my_entity(...)
end entity my_entity;

Note: Specifying the library name through the GUI, QSF or Tcl allows you to specify only a single destination library for all the
design units in a given source file. This synthesis directive allows you to change the destination VHDL library within a source file,
providing the option of organizing the design units in a single file into different libraries, rather than just a single library.

The Quartus II software gives an error if you use the library directive in the middle of a design unit.

sd11_e_sd12.docx 5/5

Você também pode gostar