Escolar Documentos
Profissional Documentos
Cultura Documentos
iii
RESUMO
A maioria dos sistemas e processos conhecidos pode ser descrita por meio de equações
matemáticas e muitas dessas equações podem ser obtidas e aplicadas fisicamente por
meio de circuitos eletrônicos. O projeto desenvolvido trata-se de um ambiente para
representação de equações matemáticas em hardware digital reconfigurável para
aplicações em sistemas embarcados. O sistema assim desenvolvido pode ser utilizado
em inúmeras áreas, como processamento de sinais, automação, entre outras. O trabalho
consiste em uma ferramenta de Edição e Tradução de equações matemáticas para
VHDL, a qual analisa uma equação matemática e obtêm a sua representação em
linguagem VHDL, sendo esta representação utilizada para a síntese das equações em
circuitos eletrônicos. O resultado alcançado pelo desenvolvimento proporciona rapidez
na obtenção de código VHDL. Para a utilização do programa é necessário um
computador pessoal, uma interface de comunicação USB e um dispositivo lógico
programável. O código gerado deve ser utilizado em um ambiente de descrição de
circuitos lógicos com suporte à linguagem VHDL. Neste projeto foi utilizado o
ambiente de desenvolvimento Quartus® II, da Altera®, por meio do qual é gerado o
código-objeto que é gravado em CPLD ou FPGA. Os dados são enviados e recebidos do
computador por comunicação serial para a interface de comunicação, que envia e recebe
dados do kit de lógica programável de forma paralela. O software de tradução recebe
uma equação matemática constituída por funções do tipo exponencial, trigonométrica,
além de operações básicas como adição, subtração, multiplicação e divisão, que podem
ser agrupadas de acordo com as regras e então analisa a expressão, verificando os
operadores e as variáveis, quebrando as expressões para depois montar em código, de
acordo com a precedência das operações. Após a geração do código, podemos efetuar a
gravação na FPGA, para realização dos testes por meio da interface de testes, para poder
verificar a eficiência do sistema de acordo com a aplicação a ser desenvolvida.
Pretende-se, assim, facilitar o projeto de circuitos digitais utilizando a linguagem VHDL
e proporcionando uma forma rápida de se obter circuitos digitais correspondentes a
funções matemáticas, automatizar parte do processo de geração de código e ampliar a
aplicação da lógica programável nos mais diversos sistemas.
v
ABSTRACT
The most of the known systems and process can be described using mathematical
equations and many of these equations can be obtained and applied physically using
electronic circuits. The developed project is an environment for representation of
mathematical equations on reconfigurable digital hardware for embedded systems
applications. The system thus developed can be used at numerous areas, as signal
processing, automation, and others. The work consists of a tool for editing and
translation of mathematical equations to VHDL, which analyzes a mathematical
equation and achieve its representation in VHDL language, this representation being
used for the synthesis of the equations in electronic circuits. The result reached by the
development provides quick obtaining VHDL code. To use the program, a personal
computer, an USB communication interface and a programmable logic device are
needed. The generated code should be used in an environment of logic circuits
description with support for VHDL. In this project, the development environment used
was the Quartus® II, Altera®, through which is generated object code which is written
in CPLD or FPGA. The data is sent and received from the computer by serial
communication using the communication interface, which sends and receives data from
the kit of programmable logic in parallel. The translation software receives a
mathematical equation consisting of exponential functions, trigonometry, and basic
operations such as addition, subtraction, multiplication and division, which can be
grouped according to the rules, and then analyzes the expression and checking operators
and variables, and then breaking the expressions, building it in code after that,
according to the precedence of operations. After code generation, recording in the
FPGA can be made to perform the tests using the testing interface, in order to verify the
efficiency of the system according to the application being developed. It is intended,
thus facilitating the design of digital circuits using VHDL language and providing a
quick way to get digital circuits corresponding mathematical functions, automate part of
the code generation to expand the application of programmable logic in various
systems.
vii
LISTA DE ABREVIATURAS E SIGLAS
ix
LISTA DE FIGURAS
xi
LISTA DE TABELAS
xiii
SUMÁRIO
RESUMO ...................................................................................................... V
3. PROJETO ............................................................................................ 7
3.2.2 Hardware............................................................................................................................. 9
3.4.1 Recursos............................................................................................................................. 11
4. RESULTADOS .................................................................................. 13
xv
4.1 Software.................................................................................................................................. 13
4.2. Hardware..................................................................................................................................... 18
5. CONCLUSÃO ......................................................................................... 22
6. REFERÊNCIAS....................................................................................... 23
xvi
1
1. INTRODUÇÃO AO PROJETO
d) Proteção da propriedade intelectual, uma vez que não é possível obter o código-
fonte gravado no chip;
e) Baixo custo e economia de energia com a produção em larga escala (utilização de
ASICs).
Infelizmente, projetar um circuito digital para tais aplicações nem sempre é uma
tarefa fácil, pois exige conhecimento de circuitos e linguagem de descrição de hardware.
Além disso, quanto mais complexo um sistema, maior e mais trabalhosa a composição
do código equivalente.
Por isso, a necessidade de uma ferramenta capaz de automatizar a geração de código
em linguagem apropriada, que seja capaz de sintetizar circuitos já conhecidos e compor
circuitos complexos por meio da junção de circuitos menores.
1.2 Objetivos
Os A seguir são descritos os objetivos do projeto:
a) Desenvolver ferramenta de captura de equações matemáticas;
b) Gerar código VHDL correspondente à descrição dos circuitos para os seguintes
cálculos:
(i) Soma e subtração;
(ii) Multiplicação e divisão;
(iii)Potenciação;
(iv) Seno, Cosseno e Tangente;
(v) Função exponencial;
c) Analisar a equação inserida e fazer a tradução para código VHDL, utilizando um ou
mais dos circuitos citados no item anterior;
d) Utilizar uma ferramenta já existente para compilação do código gerado e gravação
no dispositivo de lógica programável;
e) Desenvolver uma interface de hardware para testes do código gravado no
dispositivo, com as seguintes funções:
(i) Receber do computador os valores de entrada das funções;
(ii) Transmitir os valores ao dispositivo de lógica programável;
(iii)Receber os resultados do dispositivo e transmiti-los ao computador;
f) Desenvolver uma interface de software para testes, com as seguintes funções:
(i) Comunicação de dados com dispositivo de hardware citado no item anterior;
(ii) Comparação dos valores recebidos com os valores esperados para as funções
utilizadas.
3
2. REVISÃO BIBLIOGRÁFICA
(−1)𝑛
𝑐𝑜𝑠(𝑥) = ∑∞
𝑛=0 (2𝑛)!
𝑥 2𝑛 Equação 2.2
𝑥𝑛
𝑒 𝑥 = ∑∞
𝑛=0 Equação 2.4
𝑛!
4
Neste padrão, o número que se está representando é obtido pela Equação 2.5, vista
abaixo.
𝑀𝑎𝑛𝑡𝑖𝑠𝑠𝑎
𝑁 = (−1)𝑆𝑖𝑛𝑎𝑙 × 2𝐸𝑥𝑝𝑜𝑒𝑛𝑡𝑒−127 × 1, Equação 2.5
223
na qual
- Sinal: 0 ou 1;
- Expoente: inteiro variando de 0 a 255;
- Mantissa: inteiro variando de 0 a 8.388.607.
Neste trabalho, porém, optou-se por utilizar uma forma diferente para o cálculo do
número representado, mostrada na Equação 2.6, mas que utiliza a mesma estrutura vista
na Tabela 2.1.
𝑀𝑎𝑛𝑡𝑖𝑠𝑠𝑎
𝑁 = (−1)𝑆𝑖𝑛𝑎𝑙 × 2𝐸𝑥𝑝𝑜𝑒𝑛𝑡𝑒 × Equação 2.6
223
na qual
- Sinal: 0 ou 1;
- Expoente: inteiro variando de -128 a 127;
- Mantissa: inteiro variando de 0 a 8.388.607.
O número 10, por exemplo, seria representado neste formato da seguinte maneira:
[0 00000100 10100000000000000000000] (binário) ou
[0 4 5.242.880] (decimal).
Esta forma de representação torna mais rápido o cálculo dos resultados, por não
exigir nenhum tipo de adaptação de expoente e mantissa, como seria necessário no caso
anterior. Por exemplo, utilizando a representação IEEE 754, quando a parte fracionária
𝑀𝑎𝑛𝑡𝑖𝑠𝑠𝑎
( ) é 0,5, o valor de multiplicação é na verdade 1,5. Para utilizar este valor nos
223
5
cálculos, seria necessário utilizar uma variável interna ao sistema, que receberia o valor
da mantissa, fazer o deslocamento de bits dessa variável à direita e inserir um bit com
valor 1 no bit mais significativo da mantissa. Considerando que o expoente inicial seja
127, este passaria para 128 e teríamos então o valor 0,75, que pode então ser utilizado
para o cálculo. Seria necessária também uma variável adicional que receberia o valor do
expoente menos 127.
Utilizando o formato escolhido para este projeto, não são necessários circuitos de
adaptação de expoente e mantissa, o que contribui para redução da utilização dos
recursos do dispositivo. No caso de haver necessidade de utilização do padrão IEEE
754, o circuito pode ser adaptado, havendo pequeno comprometimento de desempenho
e aumento na utilização de recursos do hardware.
6
7
3. PROJETO
3.1 Requisitos
Os requisitos mínimos para o funcionamento do sistema são descritos a seguir:
3.2 Arquitetura
A Figura 3.1 dá uma visão geral do projeto, o qual é dividido em software e
hardware, explicados em maiores detalhes nas sessões seguintes.
8
3.2.1 Software
O tradutor analisa uma equação inserida pelo usuário, verificando os operadores e
variáveis. Após isso, faz a quebra da expressão e o código é gerado por meio da
combinação de funções em VHDL, correspondentes a cada fragmento da expressão.
O ciclo de tradução executado pelo programa é mostrado na Figura 3.2.
3.2.2 Hardware
O hardware necessário ao projeto é composto por:
a) Computador pessoal, no qual o tradutor é instalado e por meio do qual é feita a
comunicação com a interface de hardware para testes;
b) Kit de lógica programável, utilizando FPGA ou CPLD, onde o circuito
correspondente ao código gerado é gravado;
c) Interface de hardware para testes, que recebe os valores das variáveis do
computador, envia estes dados ao dispositivo de lógica programável, recebe a
resposta do dispositivo e a envia ao computador.
Os dados, que correspondem aos valores das variáveis utilizadas na equação, são
enviados pelo computador por meio de comunicação serial (USB) para a interface de
hardware, a qual faz a aquisição dos valores de forma serial e disponibiliza estes valores
de forma paralela, para que possam ser processados pelo dispositivo de lógica
programável. As saídas da interface são então ligadas às entradas do kit.
As respostas aos dados enviados, ou seja, o cálculo feito pelo dispositivo de lógica
programável, são obtidas de forma inversa, coletando os dados paralelamente nas saídas
do kit e enviando-os de forma serial ao computador.
A Figura 3.4 ilustra a comunicação de dados entre os dispositivos. Na Figura 3.5,
temos o princípio de funcionamento do firmware utilizado.
10
3.4.1 Recursos
Os seguintes recursos são necessários para a execução do projeto:
a) Equipamentos:
(i) Computador pessoal (PC);
(ii) Kit de lógica programável Nios-II;
(iii)Instrumentos de medição (osciloscópio, voltímetro, etc.);
(iv) Gravador para microcontroladores;
b) Ambientes de programação:
(i) Para desktop (Visual Studio);
(ii) Para lógica programável (Quartus-II);
(iii)Para microcontroladores (CCS);
c) Componentes:
(i) Microcontrolador;
(ii) Componentes eletrônicos diversos para interface de comunicação.
12
3.4.2 Cronograma
4. RESULTADOS
4.1 Software
O software do projeto é composto pela interface de tradução e pela interface de
testes para comunicação com o módulo de hardware.
Figura Erro! Use a guia Página Inicial para aplicar 0 ao texto que deverá
aparecer aqui.4.2 – Tradutor: código correspondente à equação inserida
A seguir temos o código VHDL gerado para a equação cos(x)+2*x**3/25-0,5*x,
utilizada como exemplo.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
package Teste is
component Cosseno
port (x: in std_logic_vector (31 downto 0);
y: out std_logic_vector (31 downto 0));
end component;
component Multiplicacao
port (x1: in std_logic_vector (31 downto 0);
x2: in std_logic_vector (31 downto 0);
y: out std_logic_vector (31 downto 0));
end component;
component Divisao
port (x1: in std_logic_vector (31 downto 0);
x2: in std_logic_vector (31 downto 0);
y: out std_logic_vector (31 downto 0));
end component;
component Potenciacao
port (x1: in std_logic_vector (31 downto 0);
x2: in integer range 0 to 7;
y: out std_logic_vector (31 downto 0));
end component;
component Soma
port (x1: in std_logic_vector (31 downto 0);
x2: in std_logic_vector (31 downto 0);
y: out std_logic_vector (31 downto 0));
end component;
component Subtracao
port (x1: in std_logic_vector (31 downto 0);
x2: in std_logic_vector (31 downto 0);
y: out std_logic_vector (31 downto 0));
end component;
end Teste;
15
library work;
use work.Teste.all;
library ieee;
use ieee.std_logic_1164.all;
entity TCC is
port (x: in std_logic_vector (31 downto 0);
y: out std_logic_vector (31 downto 0));
end TCC;
Seno
Ângulo (radianos) Resultado Obtido Resultado Esperado Erro %
0,078539816 0,078461051 0,078459096 0,0024920
0,157079633 0,156449556 0,156434465 0,0096470
0,235619449 0,233495057 0,233445364 0,0212866
0,314159265 0,309139609 0,309016994 0,0396790
0,392699082 0,382922649 0,382683432 0,0625104
0,471238898 0,454402447 0,4539905 0,0907391
0,549778714 0,523142338 0,522498565 0,1232104
0,628318531 0,588768959 0,587785252 0,1673581
0,706858347 0,650848866 0,649448048 0,2156934
0,785398163 0,709028482 0,707106781 0,2717695
0,86393798 0,762963772 0,760405966 0,3363737
0,942477796 0,812336922 0,809016994 0,4103655
1,021017612 0,856859684 0,852640164 0,4948769
1,178097245 0,930355072 0,923879533 0,7009073
1,256637061 0,958909035 0,951056516 0,8256626
1,335176878 0,981777668 0,97236992 0,9675070
1,413716694 0,998838902 0,987688341 1,1289554
1,49225651 1,010004044 0,996917334 1,3127176
Cosseno
Ângulo (radianos) Resultado Obtido Resultado Esperado Erro %
0,078539816 0,996917963 0,996917334 6,31241E-05
0,157079633 0,987687349 0,987688341 0,00010036
0,235619449 0,97236228 0,97236992 0,00078576
0,314159265 0,951056004 0,951056516 5,39111E-05
0,392699082 0,923878908 0,923879533 6,75796E-05
0,471238898 0,891006231 0,891006524 3,28707E-05
0,549778714 0,852639675 0,852640164 5,73763E-05
0,628318531 0,809015989 0,809016994 0,00012423
0,706858347 0,76040411 0,760405966 0,00024403
0,785398163 0,707102776 0,707106781 0,00056647
0,86393798 0,649439812 0,649448048 0,00126825
0,942477796 0,587769508 0,587785252 0,00267851
1,021017612 0,522469044 0,522498565 0,00564996
1,099557429 0,453938007 0,4539905 0,01156244
1,178097245 0,382592201 0,382683432 0,02383984
1,256637061 0,308864594 0,309016994 0,04931795
1,335176878 0,23319912 0,233445364 0,10548262
17
Cosseno
Ângulo (radianos) Resultado Obtido Resultado Esperado Erro %
1,413716694 0,156046867 0,156434465 0,24776999
1,49225651 0,077863216 0,078459096 0,75947769
Tangente
Ângulo (radianos) Resultado Obtido Resultado Esperado Erro %
0,078539816 0,078701854 0,078701707 0,00018668
0,157079633 0,158384562 0,15838444 7,65316E-05
0,235619449 0,240084887 0,240078759 0,00255227
0,314159265 0,324918747 0,324919696 0,00029216
0,392699082 0,414207458 0,414213562 0,00147360
0,471238898 0,509497166 0,509525449 0,00555101
0,549778714 0,612685204 0,612800788 0,01886169
0,628318531 0,726143837 0,726542528 0,05487511
0,706858347 0,852870941 0,854080685 0,14164285
0,785398163 0,996682167 1 0,33178329
0,86393798 1,162441254 1,170849566 0,71813772
0,942477796 1,356330872 1,37638192 1,45679397
1,021017612 1,586177826 1,631851687 2,79889781
1,099557429 1,861858368 1,962610506 5,13357781
1,178097245 2,19568634 2,414213562 9,05169391
1,256637061 2,602973938 3,077683537 15,4242498
1,335176878 3,10256958 4,16529977 25,5138945
1,413716694 3,717525482 6,313751515 41,1201807
1,49225651 4,475837708 12,70620474 64,7743932
Exponencial
Expoente Resultado Obtido Resultado Esperado Erro %
0,1 1,100692272 1,105170918 0,40524463
0,2 1,206698656 1,221402758 1,20387005
0,3 1,327107906 1,349858808 1,68542821
0,4 1,475142002 1,491824698 1,11827452
0,5 1,668208838 1,648721271 1,18198067
0,6 1,927670002 1,8221188 5,79277276
0,7 2,27977705 2,013752707 13,2103779
0,8 2,754839897 2,225540928 23,7829357
0,9 3,387824535 2,459603111 37,7386668
1 4,218265533 2,718281828 55,1813167
18
Figura Erro! Use a guia Página Inicial para aplicar 0 ao texto que deverá
aparecer aqui.4.3 – Software de testes
4.2. Hardware
A interface de hardware proporciona uma forma rápida de testar combinações de
valores de entrada no dispositivo de lógica programável. Apesar de os resultados
poderem ser simulados por meio do Quartus II, com a interface de testes é possível
19
5. CONCLUSÃO
6. REFERÊNCIAS
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity Seno is
port (x: in std_logic_vector (31 downto 0); -- mantissa
y: out std_logic_vector (31 downto 0));
end Seno;
process(x)
variable mant1: std_logic_vector (23 downto 0);
variable exp1: std_logic_vector (7 downto 0);
variable mant2: std_logic_vector (47 downto 0);
variable exp2: std_logic_vector (15 downto 0);
begin
exp1 := (others => '0');
mant1 := (others => '0');
for i in 0 to 3 loop
exp2(15 downto 8) := x(30 downto 23);
mant2(46) := x(31);
mant2(45 downto 23) := x(22 downto 0);
for j in 2 to ((2 * i) + 1) loop
exp2(15 downto 8) := std_logic_vector(signed(exp2(15 downto 8)) + signed(x(30
downto 23)));
mant2 := std_logic_vector(signed(mant2(46 downto 23)) * signed(x(31) & x(22 downto
0)));
end loop;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity Cosseno is
port (x: in std_logic_vector (31 downto 0);
y: out std_logic_vector (31 downto 0));
end Cosseno;
end if;
if (signed(mant1) + signed(mant2(46 downto 23))) > 8388607 or (signed(mant1) +
signed(mant2(46 downto 23))) < -8388608 then
mant1 := std_logic_vector(signed(mant1) / 2);
mant2 := std_logic_vector(signed(mant2) / 2);
exp1 := std_logic_vector(signed(exp1) + 1);
exp2(15 downto 8) := std_logic_vector(signed(exp2(15 downto 8)) + 1);
end if;
mant1 := std_logic_vector(signed(mant1) + signed(mant2(46 downto 23)));
end loop;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity Tangente is
port (x: in std_logic_vector (31 downto 0);
y: out std_logic_vector (31 downto 0));
end Tangente;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity Exponencial is
port (x: in std_logic_vector (31 downto 0);
y: out std_logic_vector (31 downto 0));
end Exponencial;
process(x)
variable mant1: std_logic_vector (47 downto 0);
variable exp1: std_logic_vector (7 downto 0);
variable mant2: std_logic_vector (23 downto 0);
variable exp2: std_logic_vector (7 downto 0);
begin
exp2 := "00000001";
mant2 := "010000000000000000000000";
exp1 := x(30 downto 23);
mant1(46) := x(31);
mant1(45 downto 23) := x(22 downto 0);
for i in 0 to 8 loop
exp1 := x(30 downto 23);
mant1(46) := x(31);
mant1(45 downto 23) := x(22 downto 0);
for j in 0 to (i + 1) loop
exp1 := std_logic_vector(signed(exp1) + signed(x(30 downto 23)));
mant1 := std_logic_vector(signed(mant1(46 downto 23)) * signed(x(31) & x(22 downto
0)));
end loop;
exp1 := std_logic_vector(signed(exp1) + signed(expoente(i)));
mant1 := std_logic_vector(signed(mant1(46 downto 23)) * signed(fator(i)));
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity Soma is
port (x1: in std_logic_vector (31 downto 0);
x2: in std_logic_vector (31 downto 0);
y: out std_logic_vector (31 downto 0));
end Soma;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity Subtracao is
port (x1: in std_logic_vector (31 downto 0);
x2: in std_logic_vector (31 downto 0);
y: out std_logic_vector (31 downto 0));
end Subtracao;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity Multiplicacao is
port (x1: in std_logic_vector (31 downto 0);
x2: in std_logic_vector (31 downto 0);
y: out std_logic_vector (31 downto 0));
end Multiplicacao;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity Divisao is
port (x1: in std_logic_vector (31 downto 0);
x2: in std_logic_vector (31 downto 0);
y: out std_logic_vector (31 downto 0));
end Divisao;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity Potenciacao is
port (x1: in std_logic_vector (31 downto 0); -- mantissa
x2: in integer range 0 to 7;
y: out std_logic_vector (31 downto 0));
end Potenciacao;