• Nenhum resultado encontrado

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO PRÓ-REITORIA DE GRADUAÇÃO DEPARTAMENTO DE CIÊNCIAS EXATAS, TECNOLÓGICAS E HUMANAS CURSO DE BACHARELADO EM CIÊNCIA E TECNOLOGIA RAONE VICTOR DA CUNHA

N/A
N/A
Protected

Academic year: 2021

Share "UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO PRÓ-REITORIA DE GRADUAÇÃO DEPARTAMENTO DE CIÊNCIAS EXATAS, TECNOLÓGICAS E HUMANAS CURSO DE BACHARELADO EM CIÊNCIA E TECNOLOGIA RAONE VICTOR DA CUNHA"

Copied!
50
0
0

Texto

(1)

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO PRÓ-REITORIA DE GRADUAÇÃO

DEPARTAMENTO DE CIÊNCIAS EXATAS, TECNOLÓGICAS E HUMANAS CURSO DE BACHARELADO EM CIÊNCIA E TECNOLOGIA

RAONE VICTOR DA CUNHA

SIMULAÇÃO DE CIRCUITOS DIGITAIS COM APLICAÇÃO EM PLACA ARDUINO

ANGICOS 2018

(2)

RAONE VICTOR DA CUNHA

SIMULAÇÃO DE CIRCUITOS DIGITAIS COM APLICAÇÃO EM PLACA ARDUINO

Monografia apresentada à Universidade Federal Rural do Semi-Árido – UFERSA, Campus Angicos como requisito para obtenção do título de Bacharel em Ciência e Tecnologia.

Orientador: Marco Diego Aurélio Mesquita, Prof. Me.

ANGICOS 2018

(3)

que regulamentam a Propriedade Intelectual, respectivamente, Patentes: Lei n° 9.279/1996 e Direitos Autorais: Lei n°

9.610/1998. O conteúdo desta obra tomar-se-á de domínio público após a data de defesa e homologação da sua respectiva ata. A mesma poderá servir de base literária para novas pesquisas, desde que a obra e seu (a) respectivo (a) autor (a) sejam devidamente citados e mencionados os seus créditos bibliográficos.

O serviço de Geração Automática de Ficha Catalográfica para Trabalhos de Conclusão de Curso (TCC´s) foi desenvolvido pelo Instituto de Ciências Matemáticas e de Computação da Universidade de São Paulo (USP) e gentilmente cedido para o Sistema de Bibliotecas da Universidade Federal Rural do Semi-Árido (SISBI-UFERSA), sendo customizado pela Superintendência de Tecnologia da Informação e Comunicação (SUTIC) sob orientação dos bibliotecários da instituição para ser adaptado às necessidades dos alunos dos Cursos de Graduação e Programas de Pós-Graduação da Universidade.

C972s Cunha, Raone Victor da.

Simulação de circuitos digitais com aplicação em placa Arduino / Raone Victor da Cunha. - 2018.

48 f. : il.

Orientador: Marco Diego Aurélio Mesquita.

Monografia (graduação) - Universidade Federal Rural do Semi-árido, Curso de Ciência e

Tecnologia, 2018.

1. Simulador. 2. Circuitos digitais. 3.

Transpilador. 4. Arduino. I. Mesquita, Marco Diego Aurélio, orient. II. Título.

(4)
(5)
(6)

RESUMO

Com os avanços da tecnologia, os sistemas digitais estão desenvolvendo-se de forma muito rápida. A variedade de equipamentos digitais que existem hoje podem ter muitos componentes, tornando os sistemas cada vez mais complexos. Quanto mais complexidade, mais análises e precauções precisam ser tomadas. Por esse motivo um método bastante utilizado é o desenvolvimento de simuladores. Para melhorar a criação de circuitos digitais com uso de simuladores, principalmente no ambiente educacional, tem-se como solução o desenvolvimento de um simulador que seja aplicado em uma placa Arduino, possibilitando uma experiência física sem grandes gastos para produzir o circuito. Para desenvolver o simulador aplicado no Arduino foi criada uma linguagem simples que descrevesse o circuito que será simulado. Essa descrição será usada, através de um transpilador, para gerar um código em linguagem C do circuito descrito. Esse código gerado pelo transpilador poderá ser compilado em um Arduino, possibilitando a experiência física. Verificando os resultados das simulações e comparando com a tabela verdade gerada por um simulador digital, percebesse que o desenvolvimento da simulação trouxe os resultados esperados, onde o circuito simulado na placa Arduino se comporta como o circuito descrito inicialmente.

Palavras-chave: Circuitos Digitais. Linguagem C. Transpilador. Simulador. Arduino.

(7)

ABSTRACT

With advances in technology, digital systems are developing very fast. The variety of digital materials that exist today can be components, making systems increasingly complex. The most precious, most analyzed and accurate need to be taken. For this reason, a widely used method is the development of simulators. To improve the creation of digital modules with the use of simulators, especially in the educational environment, it is necessary a simulator development solution that is applied to an Arduino board, allowing a great physical demand for major developments for the circuit. To develop the applied simulator, the Arduino was created by a simple language that describes the system that will be simulated. This description will be used, via a transpiler, to generate a C-language code of the described circuit. This code was created by the transpiler to be compiled into an Arduino, enabling a physical experience.

Checking the results of the simulations and comparing with the truth table generated by a digital simulator, I realized that language development was one of the most sought after, where the circuit simulated on the Arduino board behaved like the circuit initially described.

Keywords: Digital Circuits. Language C. Transpiler. Simulator. Arduino.

(8)

LISTA DE FIGURAS

FIGURA 1-SÍMBOLO DA PORTA AND ... 16

FIGURA 2-SÍMBOLO DA PORTA OR ... 16

FIGURA 3-SÍMBOLO DA PORTA NOT ... 17

FIGURA 4-PLACA DO MODELO ARDUINO UNO ... 22

FIGURA 5-CIRCUITO INDICANDO AS INFORMAÇÕES PARA DESCRIÇÃO ... 25

FIGURA 6-CIRCUITO MULTIPLEXADOR DE DUAS ENTRADAS COM DESCRIÇÕES ... 28

FIGURA 7-PRIMEIRO CIRCUITO ALEATÓRIO USADOS NOS TESTES DE SIMULAÇÕES ... 32

FIGURA 8-TESTE REALIZADO DA 7ª LINHA DA TABELA VERDADE DO PRIMEIRO CIRCUITO ALEATÓRIO ... 34

FIGURA 9-SEGUNDO CIRCUITO ALEATÓRIO USADO NOS TESTES DE SIMULAÇÃO ... 34

FIGURA 10-TESTE REALIZADO DA 6ª LINHA DA TABELA VERDADE DO SEGUNDO CIRCUITO ALEATÓRIO ... 36

FIGURA 11-CIRCUITO CODIFICADOR BINÁRIO-GRAY USADO NA SIMULAÇÃO ... 37

FIGURA 12-TESTE REALIZADO DA 10ª LINHA DA TABELA VERDADE DO CIRCUITO BINÁRIO-GRAY ... 38

FIGURA 13-CIRCUITO SOMADOR COMPLETO USADO NA SIMULAÇÃO ... 39

FIGURA 14-TESTE REALIZADO DA 2ª LINHA DA TABELA VERDADE DO CIRCUITO SOMADOR COMPLETO ... 41

FIGURA 15-CIRCUITO FLIP-FLOP SR COM CLOCK USADO NA SIMULAÇÃO ... 42

FIGURA 16-TESTE REALIZADO DA 4ª LINHA DA TABELA VERDADE DO CIRCUITO FLIP-FLOP RS COM CLOCK ... 44

(9)

LISTA DE TABELAS

TABELA 1-TABELA VERDADE DA PORTA AND... 15

TABELA 2-TABELA VERDADE DA PORTA OR ... 16

TABELA 3-TABELA VERDADE DA PORTA NOT ... 17

TABELA 4-IDENTIFICAÇÃO DAS ENTRADAS E SAÍDAS NO TRANSPILADOR ... 28

TABELA 5-VALOR ARMAZENADO PARA CADA FIO ... 29

TABELA 6-COMPARAÇÃO DE RESULTADOS DO PRIMEIRO CIRCUITO ALEATÓRIO SIMULADO NO LOGISIM E NO ARDUINO ... 33

TABELA 7-COMPARAÇÃO DE RESULTADOS DO SEGUNDO CIRCUITO ALEATÓRIO SIMULADO NO LOGISIM E NO ARDUINO ... 35

TABELA 8-COMPARAÇÃO DOS RESULTADOS DO CIRCUITO CODIFICADOR BINÁRIO-GRAY SIMULADO NO LOGISIM E NO ARDUINO ... 38

TABELA 9-COMPARAÇÃO DOS RESULTADOS DO CIRCUITO SOMADOR COMPLETO SIMULADO NO LOGISIM E NO ARDUINO ... 40

TABELA 10-COMPORTAMENTO DO FLIP-FLOP SR ... 42

TABELA 11-COMPORTAMENTO DO CLOCK NO CIRCUITO FLIP-FLOP RS ... 42

TABELA 12-COMPARAÇÃO DOS RESULTADOS DO CIRCUITO FLIP-FLOP SR COM CLOCK SIMULADO NO LOGISIM E NO ARDUINO ... 43

(10)

LISTA DE QUADROS

QUADRO 1-CÓDIGO DE IMPLEMENTAÇÃO DO CIRCUITO DESCRITO ... 26

QUADRO 2-EXEMPLO DE USO DO TRANSPILADOR USANDO LINHA DE COMANDO ... 27

QUADRO 3-CÓDIGO DE DESCRIÇÃO DO CIRCUITO ... 28

QUADRO 4-FUNÇÃO SETUP() GERADA NO FINAL DA TRANSPILAÇÃO DO CIRCUITO DESCRITO ... 30

QUADRO 5-FUNÇÃO LOOP() GERADA NO FINAL DA TRANSPILAÇÃO DO CIRCUITO DESCRITO .... 31

QUADRO 6-DESCRIÇÃO DO PRIMEIRO CIRCUITO ALEATÓRIO SIMULADO ... 33

QUADRO 7-DESCRIÇÃO DO SEGUNDO CIRCUITO ALEATÓRIO SIMULADO ... 35

QUADRO 8-DESCRIÇÃO DO CIRCUITO CODIFICADOR BINÁRIO-GRAY SIMULADO ... 37

QUADRO 9-DESCRIÇÃO DO CIRCUITO SOMADOR COMPLETO SIMULADO ... 40

QUADRO 10-DESCRIÇÃO DO CIRCUITO FLIP-FLOP SR COM CLOCK SIMULADO... 43

(11)

SUMÁRIO

1 INTRODUÇÃO ... 10

2 OBJETIVOS ... 13

2.1 OBJETIVO GERAL ... 13

2.2 OBJETIVOS ESPECÍFICOS ... 13

3 SIMULAÇÃO DE CIRCUITOS DIGITAIS ... 14

3.1 CIRCUITOS DIGITAIS ... 14

3.1.1 Lógica Booleana ... 14

3.1.2 Portas Lógicas ... 15

3.2 SIMULADORES ... 17

3.2.1 Modelos de simulação ... 18

3.2.2 Simulação implementada ... 19

3.3 COMPILADOR ... 19

3.3.1 Transpilador ... 20

3.4 ARDUINO ... 21

4 LINGUAGEM DESENVOLVIDA ... 23

4.1 LINGUAGEM DE PROGRAMAÇÃO ... 23

4.2 PALAVRAS RESERVADAS... 24

5 TRANSPILADOR IMPLEMENTADO ... 27

5.1 PROCESSO DE TRANSPILAÇÃO ... 27

6 RESULTADOS E DISCUSSÕES ... 32

6.1 CIRCUITOS ALEATÓRIOS ... 32

6.2 CODIFICADOR BINÁRIO-GRAY ... 36

6.3 SOMADOR COMPLETO ... 39

6.4 FLIP-FLOP RS COM CLOCK ... 41

6.5 DISCUSSÕES ... 44

7 CONSIDERAÇÕES FINAIS ... 46

REFERÊNCIAS ... 47

(12)

1 INTRODUÇÃO

No mundo existem muitas variáveis físicas em constante mudança, interagindo umas com as outras, e também alterando o comportamento das pessoas, muitas vezes de forma natural e discreta. Se for possível medir e representar as variáveis físicas como quantidade digital, então será possível registrar e manipular aritmeticamente esses valores digitais, podendo ser usadas, de alguma maneira, para controlar e desenvolver objetos (TOCCI;

WIDMER; MOSS, 2011).

Um sistema digital é uma combinação de dispositivos projetados para manipular informação lógica ou, quantidades físicas representadas no formato digital. Esses dispositivos podem ser mecânicos, magnéticos, pneumáticos, mas na maioria das vezes são eletrônicos. Os sistemas digitais mais conhecidos são computadores, calculadoras, equipamentos de áudio e vídeo e os sistemas de telecomunicações (TOCCI; WIDMER; MOSS, 2011).

Os sistemas digitais, de acordo com Fábio do Reis (2016), apresentam diversas vantagens em relação aos sistemas analógicos, por exemplo:

Maior facilidade para desenvolver projetos e armazenar informações;

São menos afetados por interferências;

Geralmente podem ser programados;

Limitação da amostragem.

Com o tempo esse tipo de sistema se tornou bastante utilizado, os analógicos quase sempre estão combinados com os digitais, formando sistemas híbridos. E com os avanços da tecnologia há hoje uma enorme variedade de equipamentos digitais, cada um com um grau diferente de complexidade, podendo ter de um a milhares de componentes. Quanto mais complexos, mais elementos precisa compor, tornando sua implementação mais detalhada e exigindo mais níveis de abstração no processo de projetá-los (TRINDADE JUNIOR;

JULIÃO, 2012).

Nem sempre a construção completa de um dispositivo é viável apenas para a finalidade de testes. Em casos assim, é interessante simular o funcionamento do dispositivo a fim de se detectar e corrigir falhas em um projeto antes de sua construção. A simulação é entendida como uma imitação de um processo ou operação do mundo real, a geração de uma história artificial para análise de características operacionais. Buscando evitar erros e diminuir a dificuldade em produzir sistemas digitais complexos, são utilizados modelos de simulação.

Esses modelos podem ser usados para predizer os efeitos causados por uma mudança no

(13)

sistema e também como ferramenta de projeto para validar e avaliar o desempenho de novos sistemas (MIYAGI, 2006).

A tecnologia dos sistemas digitais continua se desenvolvendo e com isso, vem tentando alcançar novas áreas de conhecimento e gerando também novas necessidades.

Suprindo algumas dessas necessidades, desenvolveram-se os sistemas embarcados, que são computadores anexados ao sistema que ele controla com tarefas que foram predefinidas.

Como é usado para tarefas específicas, pode assim, aperfeiçoar um determinado produto e diminuir o seu tamanho, bem como seu valor final. Os sistemas embarcados estão por todo lugar, costumam ser projetados a partir de uma aplicação e geralmente são usados sem muita exigência (POZZEBOM, 2014).

No sistema digital, como em qualquer eletrônica, são empregados pequenos grupos de circuitos básicos padronizados conhecidos também como portas lógicas. Através desses circuitos básicos podemos implementar todas as expressões geradas pela álgebra booleana, que constituem a base dos projetos dos sistemas já referidos (IDOETA; CAPUANO, 2012). A álgebra booleana é um sistema de símbolos e operadores que descrevem as decisões lógicas com base em circunstâncias que só podem ser resolvidas com verdadeiro e falso. No caso da eletrônica, as decisões lógicas têm base nos valores binários 0 e 1 (TOCCI; WIDMER;

MOSS, 2011).

Uma forma muito popular de criar sistemas embarcados é utilizando a placa Arduino.

Ela é baseada em um microcontrolador (microprocessador que pode ser programado para funções específicas) muito versátil que potencializa suas funções, podendo operar sozinha no controle de vários dispositivos (SOUZA et al., 2011).

Como as placas Arduino podem ser trabalhadas de diversas formas, para diferentes projetos, uma forma bastante proveitosa seria usá-las como simulador de circuitos digitais. Os circuitos básicos nem sempre são materiais simples de conseguir e necessitam de cuidados maiores ao serem utilizados. Por isso o uso de simuladores se torna importante para finalização dos projetos.

Então, a aplicação das simulações em uma placa Arduino permitirá ao usuário ter uma experiência prática sobre o processo de construção de um circuito sem custear com materiais necessários para a produção.

Os sistemas digitais estão ganhando cada vez mais espaço, se tornando bastante frequente no cotidiano das pessoas. Mesmo com esse crescimento ainda existem dificuldades, principalmente agora que os sistemas estão ficando mais complexos e ocupando menos espaço. Um exemplo de circuito com essas características são os chips. A construção de um

(14)

chip ou qualquer dispositivo digital complexo pode requer um alto custo de produção e alguns problemas só são descobertos quando os dispositivos já estão sendo utilizados de acordo com suas finalidades.

Para evitar que problemas sejam detectados apenas após a produção, é necessária alguma forma de prevenção, ou pelo menos ideias que reduzam a chance de que algum erro de projeto não seja percebido. Uma maneira de se testar um projeto é o uso de simuladores, que vão permitir que o usuário projete, quase sempre de maneira virtual, o dispositivo que se pretende construir. A simulação vai possibilitar que seja verificado todo o funcionamento ou outras características do circuito que se pretende construir sem necessidade de ter gastos com uma produção e, até melhorar o projeto antes de sair definitivamente do papel.

Outra dificuldade para implementar um dispositivo digital é no ambiente educacional.

O tempo disponível em sala de aula não é suficiente para construir um circuito digital complexo, e junto, verificar se está funcionado totalmente sem erros. Com os simuladores, esses circuitos podem ser desenvolvidos mais rapidamente tornando os experimentos e testes possíveis durante o horário de aula. E se a simulação for aplicada em placas Arduino, possibilitará uma experiência física aos alunos, podendo despertar neles algum interesse a mais pela área. Além de ser uma nova ferramenta para ministrar as disciplinas.

Sobre o desenvolvimento deste trabalho, o mesmo contem mais seis seções, a primeira mostra uma lista dos objetivos a serem alcançados durante o projeto. A segunda explica com mais detalhes a simulação de circuitos digitais e como é abordado nesta monografia. A terceira seção comenta sobre os itens necessários para o desenvolvimento da monografia, mostrando as principais características do código que dá origem ao simulador. Na quarta seção são aprofundadas as características dos circuitos e as técnicas ou ideias necessárias para desenvolver a monografia. O penúltimo capítulo é voltado para a discussão dos resultados obtidos e o último para a conclusão do trabalho.

(15)

2 OBJETIVOS

2.1 OBJETIVO GERAL

Criar uma solução completa que permita, a partir da especificação de um circuito digital, gerar um simulador do circuito em questão de forma que se possa programar um microcontrolador para se comportar de acordo com a especificação do circuito dado.

2.2 OBJETIVOS ESPECÍFICOS

Dadas as questões levantadas, o presente trabalho tem os seguintes objetivos:

• Especificar uma linguagem simples de descrição de circuitos digitais;

• Implementar um transpilador da linguagem especificada para um simulador em C do circuito descrito;

• Compilar o simulador gerado e rodá-lo em uma placa Arduino;

• Verificar que a placa Arduino se comporta como o circuito digital descrito.

Com isso, será possível de forma simples especificar circuitos digitais quaisquer e observar seu comportamento em um dispositivo físico.

(16)

3 SIMULAÇÃO DE CIRCUITOS DIGITAIS

Nesta seção serão abordados alguns conceitos e operações fundamentais que envolvem circuitos digitais. Buscando também relacioná-las com as características de simulações, explanando técnicas, e aprofundando nos assuntos em que esta monografia está envolvida.

3.1 CIRCUITOS DIGITAIS

Em um conceito generalista, podemos dizer que um circuito digital é todo e qualquer circuito que dará solução a um problema em forma de pulsos. Enquanto um circuito analógico pode dar a solução ao mesmo problema de forma continuada, sem interrupções. O conjunto de valores representados nos analógicos é teoricamente infinito, tornando o seu controle bem complexo. Já com os digitais os valores representados passam a ser um número estabelecido, o que torna seu controle bem simplificado (TRINDADE JUNIOR; JULIÃO, 2012).

Os circuitos digitais, tecnicamente, são projetados para produzir tensão de saída e para responder a tensões de entrada previsíveis. Isso significa que um circuito digital, para uma determinada faixa do nível 0 ou 1, responde da mesma maneira e não distingue as tensões de entrada dentro de uma mesma faixa definida. Os circuitos eletrônicos digitais passaram por muitas mudanças a medida que a tecnologia avançou, mas os princípios de representar 1s e 0s permanecem os mesmos (TOCCI; WIDMER; MOSS, 2011).

3.1.1 Lógica Booleana

Em muitos casos, o conjunto de possíveis estados se resume a apenas dois. Uma luz está acesa ou apagada, uma porta está aberta ou fechada, são exemplos dessas circunstâncias.

Aquelas circunstâncias que são descritas verdadeiras ou falsas com base em decisões lógicas, foram estudadas pelo matemático chamado George Boole. Os resultados de sua pesquisa são conhecidos como lógica booleana e os símbolos e operadores empregados para descrever essas decisões lógicas fazem parte do sistema chamado de álgebra booleana (TOCCI;

WIDMER; MOSS, 2011).

Qualquer sistema digital pode ser construído usando apenas três tipos de funções lógicas elementares designadas por AND, OR ou NOT. As funções elementares operam sobre dois valores lógicos das faixas de nível 0 ou 1 (para o caso da função NOT, só um valor), e

(17)

produzem um valor lógico para cada combinação possível dos valores dos operandos. Estas três funções lógicas são à base do funcionamento de qualquer circuito digital e formam o conjunto básico em que se fundamenta a Álgebra Booleana (ALVES, 2004).

3.1.2 Portas Lógicas

Através de um pequeno número de minúsculos dispositivos eletrônicos, capazes de ser combinados de inúmeras formas, é possível construir os circuitos eletrônicos digitais. Esses minúsculos dispositivos eletrônicos são denominados portas lógicas e são usados para calcular várias funções lógicas dos níveis de tensão (TANENBAUM, 2007).

As portas lógicas (AND, OR e NOT), podem ser representadas através de símbolos, utilizando linhas como entrada onde serão colocados os valores a serem operados e uma linha como saída que representa o valor final da função. Uma expressão booleana complexa pode ser representada ligando entre si vários desses símbolos de forma que seja construída a função pretendida (ALVES, 2004).

Existe uma forma de reproduzir em uma tabela o modo como a porta lógica se comporta. Essa tabela é chamada de Tabela Verdade e funciona como um mapa onde são colocadas todas as situações da função lógica com seus respectivos resultados (IDOETA;

CAPUANO, 2012).

A função AND, também conhecida como E, executa uma multiplicação de duas ou mais variáveis booleanas. É representado algebricamente por um “.”, no qual se lê “e”. Como resultado dessa função teremos o estado 1 se, somente se, todas as entradas estiverem com valor 1. Em qualquer outro caso o estado vai ser 0 (IDOETA; CAPUANO, 2012). Sua tabela verdade é (considerando dois valores de entrada):

Tabela 1 - Tabela verdade da porta AND

A B A . B 0 0 0 0 1 0 1 0 0 1 1 1

Fonte: Elaborada pelo autor (2018)

E seu símbolo usado nas representações de circuito é:

(18)

Figura 1 - Símbolo da porta AND

Fonte: Wikiwand1

A função OR, também chamada de OU, é representada pelo “+”, onde se lê “ou”. No resultado dessa função somente será 0 quando os valores de entrada forem todos 0. Se tiver pelo menos uma entrada com valor 1 o resultado da função será 1 (IDOETA; CAPUANO, 2012). Sua tabela verdade é (também considerando dois valores de entrada):

Tabela 2 - Tabela verdade da porta OR

A B A + B 0 0 0 0 1 1 1 0 1 1 1 1

Fonte: Elaborada pelo autor (2018)

E seu símbolo usado nas representações de circuito é:

Figura 2 - Símbolo da porta OR

Fonte: Wikiwand2

A função mais simples é a NOT, conhecida também por NÃO, é representada por um

“–” em cima da variável, onde se lê negação de “nome da variável”. Essa função inverte os estados, se o estado tiver em 1, então será 0, e vice-versa (IDOETA; CAPUANO, 2012). Sua tabela verdade é:

1 Disponível em: <http://www.wikiwand.com/simple/Logic_gate>. Acesso em jul. 2018.

2 Disponível em: <http://www.wikiwand.com/simple/Logic_gate>. Acesso em jul. 2018.

(19)

Tabela 3 - Tabela verdade da porta NOT

A Ā 0 1 1 0

Fonte: Elaborada pelo autor (2018)

E seu símbolo usado nas representações de circuito é:

Figura 3 - Símbolo da porta NOT

Fonte: Wikiwand3

3.2 SIMULADORES

A simulação é uma grande ferramenta que permite a diversos profissionais, de áreas diferentes, realizarem atividades em modelos de representação de alguma situação real. Os profissionais podem através dela, adquirir capacidade de identificar, formular e solucionar problemas relacionados às atividades: operação e gerenciamento de projetos e de sistemas de produção de bens e serviços (GAVIRA, 2003).

A simulação é benéfica quando ela modela o que acontece no sistema real com menor custo ou menos recursos. As principais vantagens que a simulação apresenta são:

• Novos equipamentos, sistemas de transporte, arranjos físicos, etc.

podem ser testados antes de se investir em recursos com as aquisições envolvidas;

• As hipóteses sobre várias perguntas de como alguns fenômenos ocorrem podem ser avaliadas;

• O tempo de simulação pode ser estendido ou reduzido, permitindo que os fenômenos estudados possam ser acelerados ou retardados;

• Podem ser identificados os pontos onde as informações ou materiais têm seus fluxos comprometidos.

3 Disponível em: <http://www.wikiwand.com/simple/Logic_gate>. Acesso em jul. 2018.

(20)

Os dados do resultado de uma simulação devem corresponder diretamente com resultados que seriam obtidos do sistema real. Com essa afirmação a simulação pode apresentar algumas desvantagens:

• Algumas construções de modelos requerem um treinamento especial.

As técnicas são aprendidas ao longo do tempo e a construção envolve o bom uso da experiência;

• Pode acontecer que os resultados sejam difíceis de interpretar. Como as saídas podem incluir variáveis aleatórias, é importante determinar se as saídas observadas são inter-relações efetivas das partes do sistema ou se derivam da aleatoriedade do mesmo;

• O desenvolvimento dos modelos e a análise dos dados podem consumir muito tempo e recursos. Sendo que economizar tempo e recursos pode resultar em cenários insuficientes para atender os objetivos.

Com o desenvolvimento de ferramentas e avanços em plataformas computacionais, as desvantagens se tornam menos intensas, a análise dos dados de saída é facilitada e também permitem que a simulação seja realizada cada vez mais rápida (MIYAGI, 2006).

3.2.1 Modelos de simulação

Vários fatores devem ser considerados quando se escolhe o tipo de modelagem que vai ser adotada em um simulador. A técnica deve permitir a troca flexível de informações entre os modelos, possibilitar a modelagem de fluxo e a modelagem flexível da arquitetura e dos componentes (KÜLZER, 2003).

É possível também classificar os simuladores baseando-se no tipo de modelagem interna que eles processam. Eles podem ser divididos em dois tipos principais: simuladores compilados e simuladores baseados em eventos.

Os simuladores compilados são executados através de um modelo de código compilado. É realizada a simulação executando o modelo resultante um determinado número de vezes. Esse tipo de modelagem é orientado principalmente para verificações funcionais sem preocupação com o tempo de execução. Isso o torna aplicável a modelos síncronos, onde a temporização pode ser verificada separadamente (CHEN, 1992).

Os simuladores baseados em eventos são chamados assim porque a modelagem inteira é ativada pelos eventos. Quando um evento ocorre no modelo, todos os componentes acionados pelo evento são simulados. Alguns dos componentes acionados podem alterar os

(21)

valores de saída, gerando assim novos eventos. A passagem de tempo é central para a simulação, podendo funcionar com modelos de temporização precisos. Assim, a simulação baseada em eventos tem um desígnio mais geral, sendo aplicável a modelos assíncronos (CHEN, 1992).

3.2.2 Simulação implementada

A simulação compilada é eficiente para modelos altamente ativos, mas não é competente para modelos de baixa atividade. É aplicável quando as combinações lógicas no modelo não possuem algum tempo de atraso, quando um passo termina o próximo começa imediatamente.

Considerando a utilização desse tipo de modelagem para simular circuitos digitais, poderemos descrever o sistema em uma linguagem de programação e então um modelo executável será gerado. Para esse executável poderão ser usadas linguagens de programação de alto nível, por exemplo, linguagem C (CHAKRABARTY, 2016).

Portanto, conhecendo as características dos dois tipos de modelagem, optou-se para realizar este projeto com base no modelo de simulação compilada, por apresentar uma implementação consideravelmente mais simples.

As operações de portas lógicas, realizadas em algoritmos para simular um circuito, são baseadas em sintaxes de linguagens de programação de alto nível. As sintaxes de atribuição, loops, condições lógicas, operadores de múltipla escolha e as chamadas de funções são usadas durante o processo. Nas etapas da simulação em que múltiplas portas seriam processadas simultaneamente, utilizando a modelagem compilada, é necessário que exista uma ordem de execução dessas portas no algoritmo, garantindo a estabilidade, por exemplo, os circuitos sequenciais com várias iterações (LAPIN; BULAKH; VAGAPOV, 2017).

3.3 COMPILADOR

O compilador é um software complexo, criado para converter um programa produzido por uma linguagem de programação de alto nível (também chamada de linguagem fonte) para um programa numa linguagem que possa ser executada por um computador (linguagem- objeto).

A construção do compilador precisa seguir dois princípios fundamentais: o compilador deve preservar o significado do programa fonte e deve melhorar esse programa de alguma

(22)

forma perceptível (MARANGON, 2017). Geralmente um compilador produz um programa em linguagem simbólica, ou assembly, não diretamente código de maquina. Então, esse programa simbólico, que é semanticamente equivalente ao programa em linguagem de alto nível, é traduzido em linguagem de máquina através de assemblers.

O processo de compilação se desenvolve em diversas etapas. Na primeira etapa o analisador léxico junta os caracteres do programa fonte, como palavras especiais e identificadores, em unidades léxicas. Ele ignora os comentários, já que não vão ser úteis para o compilador. Na próxima etapa o analisador sintático usa as unidades léxicas da etapa anterior para construir estruturas hierárquicas chamadas árvores de análise, as quais representam a estrutura sintática do programa.

O gerador de código intermediário em seguida vai produzir um programa com nível de linguagem entre a do programa de alto nível e a linguagem do código objeto. O analisador semântico faz parte do gerador de código intermediário e verifica se existiu algum erro difícil, ou impossível de ser detectado durante a análise sintática, por exemplo, erros de tipo. O gerador de código, como última etapa, traduz a versão do código intermediário para um programa equivalente em linguagem de máquina (URICER, 2001).

3.3.1 Transpilador

A transpilação é um tipo particular de compilação. Se um compilador consegue converter um código de certo nível de linguagem para outra com o mesmo nível de abstração, então esse compilador é também um transpilador. Se ele só consegue converter uma linguagem para outras de níveis diferentes, normalmente do nível mais alto para um nível inferior, então é apenas um compilador. Assim, todos os transpiladores também são compiladores, mas nem todo compilador pode ser considerado transpilador (CABOT, 2017).

Conhecer bem uma linguagem não vai garantir que ao tentar aprender outra linguagem se torne mais fácil, dado que as sintaxes parecidas podem conter armadilhas. Cada linguagem apresenta características, sintaxes e paradigmas únicos, as vezes possuem semelhança sintática com outras, mas possuem comportamentos diferentes. Algumas podem ter sintaxes e paradigmas complicados, tornando muitas vezes pouco produtivo o seu uso. A utilização de transpiladores irá facilitar várias tarefas, pois no lugar de códigos complexos, pode-se usar uma linguagem com sintaxes e paradigmas mais agradáveis (REIS V, 2016).

Um exemplo de aplicação é em navegadores antigos, neste caso, não têm suporte as versões atuais do JavaScript (linguagem de programação utilizada para manipular

(23)

comportamentos nas páginas web). Assim pode-se programar nas versões atualizadas e depois converter o código para as versões antigas, sem prejudicar usuários com navegadores antigos.

Com o transpilador é possível programar com as técnicas mais atualizadas e eficientes e converter para que o programa funcione em todos os lugares (CARVALHO, 2017).

3.4 ARDUINO

O Arduino é uma ferramenta popular para o desenvolvimento de produtos IoT (Internet of Things, no português, Internet das Coisas), bem como uma das ferramentas mais bem-sucedidas para educação STEM (Science, Technology, Engineering and Mathematics, no português, Ciência, Tecnologia, Engenharia e Matemática), além de ser bastante usada, principalmente por profissionais, para inovar em músicas, brinquedos, agricultura, etc.

Existem uma gama de ferramentas de software, plataformas de hardware e documentação, permitindo que qualquer pessoa seja praticamente criativa com a tecnologia.

O Arduino é o primeiro projeto de hardware de código aberto amplamente difundido.

Várias placas e bibliotecas de software foram desenvolvidas, ampliando e diversificando os possíveis projetos criados pela comunidade(ARDUINO, 2018).

A placa Arduino é baseada em um microcontrolador da família AVR bastante versátil, podendo operar sozinha no controle de vários dispositivos, sendo assim, muito aplicada em robótica e sistemas embarcados. A plataforma dispõe de uma camada simples de software implementada na placa, um bootloader e uma interface amigável, IDE do Arduino, que utiliza uma linguagem baseada em C, a linguagem Processing. O bootloader facilita a programação do microcontrolador, não exigindo compiladores ou hardware adicional (SOUZA et al., 2011). O modelo Arduino UNO, que será usado neste projeto, é baseado no microcontrolador ATmega328P.

(24)

Figura 4 - Placa do modelo Arduino UNO

Fonte: Arduino4

4 Disponível em: < https://store.arduino.cc/usa/arduino-uno-rev3>. Acesso em set. 2018.

(25)

4 LINGUAGEM DESENVOLVIDA

Durante esta seção algumas características das linguagens de programação serão expostas para facilitar a compreensão das palavras reservadas. Essas palavras são bastante empregadas durante a execução do projeto, podendo identificar pontos importantes a serem analisados para entender a simulação.

4.1 LINGUAGEM DE PROGRAMAÇÃO

O processamento de dados dos computadores está sob o controle de conjuntos ordenados de instruções. Os programadores especificam esse conjunto ordenado de instruções, que são desenvolvidos através de linguagens de programação. Algumas são entendidas apenas pelos programadores, ou somente pelas máquinas, enquanto outras são usadas como tradutores. Essas linguagens podem ser classificadas em três tipos: linguagem de máquina, assembly e de alto nível (PALMEIRA, 2012).

A linguagem de máquina é constituída por strings de números, que definem as operações realizadas uma de cada vez pelo computador, tornando assim complicada para os humanos lerem. É dependente da máquina, em outras palavras, uma determinada linguagem só pode ser usada para um tipo do computador, se mudar o tipo do computador, é necessária uma nova linguagem de máquina (DEITEL; DEITEL, 2011).

A linguagem assembly é formada por abreviações de expressões em inglês que representam operações elementares dessa linguagem, originando a base das linguagens assembly. Como não é uma língua que os computadores entendem, foi preciso desenvolver programas que convertem esse tipo de linguagem em linguagem de máquina, os chamados assemblers. (PALMEIRA, 2012).

Linguagens de alto nível são instruções únicas e simples que podem ser escritas para realizar tarefas fundamentais. Elas permitem escrever instruções que pareçam com o inglês comum e contêm as notações matemáticas normalmente utilizadas. As linguagens C, C++, JAVA, Pascal são exemplos de linguagens de alto nível e são bastante utilizadas em diversas áreas. As máquinas também não entendem esse tipo de linguagem e para traduzir as instruções para linguagem de máquina são utilizados programas tradutores, chamados de compiladores (PALMEIRA, 2012).

Algumas linguagens têm o seu desenvolvimento voltado para uma área específica, tornando-se bastante recomendada e popular naquela área. A linguagem C não tem uma área

(26)

particular, uma de suas vantagens é de adaptar-se ao desenvolvimento de diversos projetos, como interfaces gráficas, processamentos de registros, etc., uma característica conhecida como general purpose (em português, finalidade geral) (DAMAS, 2007).

A linguagem de programação C possui diversas características que chamam a atenção dos programadores, assim como, uma ótima opção para os iniciantes. Ela possui uma sintaxe bastante simples, com poucas palavras reservadas, tipos de dados e de operadores, reduzindo até o tempo e esforços necessários para aprendê-la. É conhecida e utilizada internacionalmente, tornando-se fácil encontrar manuais, livros e outros documentos especializados.

Considerando as características da linguagem C discutidas anteriormente, a familiaridade e a grade curricular do curso de Bacharelado em Ciência e Tecnologia, optou-se por criar o simulador deste projeto através da programação em C.

Para produzir as instruções do programa da simulação foi utilizado o IDE (Integrated Development Environment, em português, Ambiente de Desenvolvimento Integrado) Code::Blocks, um software livre, projetado para ser bastante extensível e configurável. E como compilador, foi usado o GCC (GNU Compiler Collection), um dos compiladores de C mais avançados e versáteis, que também é software livre.

4.2 PALAVRAS RESERVADAS

As palavras reservadas ou palavras-chave fazem parte de um conjunto de palavras com significados especiais para os compiladores. O programador deve ter cuidado em não as usar como identificadores, por exemplo, nome de variáveis (DEITEL; DEITEL, 2011). Na implementação do simulador foram utilizadas algumas palavras reservadas, de modo que ajudassem a descrever o circuito. Essas palavras server para identificar os dados do circuito para serem usados adequadamente no decorrer da simulação.

A descrição do circuito deve ser feita informando qual o token (texto como um símbolo para especificar o tipo de objeto usado no circuito), por exemplo, input para entradas ou port para portas lógicas, em seguida um nome atribuído a esse objeto juntamente com outros dados necessários sobre ele. Esses dados precisam estar digitados na sequência estabelecida para que o simulador simule o circuito corretamente.

Para descrever os dados das entradas do circuito é escrito primeiramente no arquivo o token input, palavra reservada para especificar uma entrada, em seguida o nome atribuído a essa entrada e o pino que será utilizado no Arduino para receber os valores. É criado uma

(27)

linha com o token, nome atribuído e o pino especifico para cada entrada empregada no circuito.

Para descrever a constante que o circuito está conectado será utilizado o token const, palavra que especifica uma constante, depois o nome atribuído e o valor dela, no caso, 0 ou 1.

Para o fio, é preciso apenas o token wire e o nome concedido ao fio. Também é preciso identificar em uma linha cada fio usado no circuito, com o nome em seguida. O mesmo serve para a constante, caso use os dois valores no circuito.

As informações adjacentes do token output, palavra-chave que identifica uma saída, são semelhantes com as do input, alterando apenas o pino de entrada, indicando agora o pino de saída onde mostrará o resultado dos dados manipulados.

O primeiro dado junto do token port, palavra-chave para porta lógica, indicam uma porta lógica, por exemplo, NOT para porta NÃO, ou OR para porta OU. Devendo ser escrita em letras maiúsculas o nome do tipo da porta em inglês. Os dois próximos são os nomes das entradas (inputs), constantes (const) ou fios (wires) usados para levar até a porta os valores que ela calculará, apenas dois nomes podem levar valor até a porta, no caso da porta NÃO só é permitido o nome de uma entrada (mais do que o valor permitido em cada porta ocasionará erros de leitura). E depois o nome da saída (output) ou de um fio que levará os resultados para o próximo passo.

A ordem que cada objeto do circuito é digitado não faz diferença. O mais importante é que os dados de cada objeto se encontrem na ordem estabelecida.

Em seguida um exemplo de como a descrição do circuito deve ser aplicada:

Figura 5 - Circuito indicando as informações para descrição

Fonte: Elaborada pelo autor (2018)

(28)

Na primeira linha do Quadro 1, é descrita uma entrada de pino, identificada com o nome “ent1”, que representa o pino 0. Na segunda linha é descrita outra entrada de pino, com o nome “ent2”, representando o pino 1. Na terceira linha a entrada do circuito está conectada a uma constante, identificada pelo nome “con”, de valor 1. A quarta linha reconhece uma saída nomeada por “saida1” e representa o pino 13. A quinta linha identifica um fio com o nome “f1”. Na sexta linha é identificada uma porta do tipo OU, duas entradas, uma do pino com nomes “ent2” e da constante “con”, e uma saída para um fio com o nome “f1”. Na última linha é descrita uma porta do tipo E, com uma entrada de um pino com nome “ent1”, outra entrada do fio “f1” e no fim uma saída para um pino com nome “saida1”.

input ent1 0 input ent2 1 const con 1 output saida1 13 wire f1

port OR ent2 con f1 port AND ent1 f1 saida1

Quadro 1- Código de implementação do circuito descrito

Fonte: Elaborado pelo autor (2018)

(29)

5 TRANSPILADOR IMPLEMENTADO

Na seção anterior foi comentado que as linguagens de alto nível precisam de compiladores para traduzir todo o algoritmo projetado para a linguagem de máquina. Desde que o controle e a otimização dos recursos computacionais disponíveis vêm se tornando mais eficiente, os compiladores se tornaram necessários pelo fato de que programar em linguagens de baixo nível ficou cada vez mais complicado, na mesma proporção em que surgem novos recursos computacionais (BRANCO; TAMAE, 2008).

5.1 PROCESSO DE TRANSPILAÇÃO

O transpilador implementado, toma como entrada a descrição de um circuito na linguagem proposta neste trabalho. Como saída, o transpilador gera o código em linguagem C de um simulador do circuito descrito. Um exemplo de uso do transpilador é:

Quadro 2 - Exemplo de uso do transpilador usando linha de comando

Fonte: elaborado pelo autor (2018)

O “simulador.exe” é nome do transpilador, o “circuito.txt” indica a entrada da descrição do circuito e “circuito.ino” indica a saída em Linguagem C do Arduino.

O código gerado pode então ser compilado e rodado em um dispositivo a fim de simular o circuito descrito. O gerador de código implementado atualmente permite a geração de um programa fonte que pode ser compilado para o Arduino, a mesma é indicada pelo

“.ino” no final da linha de comando.

No prcesso de geração do código, os fios no transpilador precisam receber os resultados das operações das portas para que sejam redirecionadas posteriormente para a próxima porta. Esses resultados são salvos em um vetor, sendo que cada posição do vetor indica um fio do circuito. Na descrição do circuito abaixo, de um multiplexador de duas entradas, é mostrado como ficará as entradas e saídas no transpilador.

simulador.exe circuito.txt circuito.ino

(30)

Figura 6 - Circuito multiplexador de duas entradas com descrições

Fonte: elaborada pelo autor (2018)

Quadro 3 - Código de descrição do circuito

Fonte: Elaborado pelo autor (2018)

Tabela 4 - Identificação das entradas e saídas no transpilador

Tipo Entrada 1 Entrada 2 Saída

NOT -3 − 0

AND 0 -1 1

AND -3 -2 2

OR 1 2 -14

Fonte: Elaborada pelo autor (2018)

const op1 0 const op2 1 input ent 0 port NOT ent f0 port AND f0 op1 f1 port AND ent op2 f2 port OR f1 f2 saida wire f0

wire f1 wire f2

output saida 13

(31)

Tabela 5 - Valor armazenado para cada fio

Fio Valor

0 0

1 0

2 0

Fonte: Elaborada pelo autor (2018)

O transpilador executa as operações de cada porta na ordem que elas são descritas.

Quando ele chega na primeira porta, verifica na Tabela 4 a identificação de cada entrada, se ela for maior ou igual 0 o valor que ele utilizará está em um fio identificado por aquele número. Se for -1 o valor a ser usado é da constante 0, se -2 o valor é da constante 1 e se for menor que -2 é utilizado uma fórmula (−(𝐼𝐷 + 3)) para dizer de qual pino será retirado o valor. Depois que recebe os valores e realiza o cálculo, a tabela é analisada novamente, se o identificador for igual ou maior que 0, o resultado é salvo no fio com essa identificação, se for menor que 0 o resultado é enviado para o pino correspondente. O código sabe qual o pino correspondente através da fórmula (−(𝐼𝐷 + 1)).

O processo de transpilação finaliza quando os dados são organizados e manipulados no código em linguagem C. Como permite gerar um programa que compile em Arduino, ele também mantém as características, paradigmas e sintaxes da linguagem Arduino.

O pedaço de código que contém as variáveis, estruturas e funções para as operações dos valores são os primeiros a serem escritos no programa fonte em linguagem Arduino, por ser um código que estará presente igualmente em qualquer programa gerado durante a simulação.

Depois é escrita a função setup do Arduino contendo os pinos usados nas descrições do circuito, as informações das portas lógicas e outros dados necessários para inicializar a simulação.

(32)

Quadro 4 - Função setup() gerada no final da transpilação do circuito descrito

Fonte: elaborado pelo autor (2018)

Em seguida é escrita a função loop, onde a simulação necessariamente ocorre, chamando as funções que realizam os cálculos para serem constantemente executadas, mantendo o simulador sempre ativo. Através dessa função que as portas não precisam ser descritas na mesma ordem do circuito, por que, por exemplo, se a primeira porta for executada como uma das últimas, as portas que seguem a ordem original vão ser executadas novamente nas próximas chamadas da função loop, e assim os resultados podem ser passados adiante no simulador.

void setup(){

pinMode(0, INPUT);

pinMode(13, OUTPUT);

portas[0].tipo = NOT;

portas[0].inp1 = IN_PORT(0);

portas[0].out = 0;

portas[1].tipo = AND;

portas[1].inp1 = 0;

portas[1].inp2 = IN_CONST_0;

portas[1].out = 1;

portas[2].tipo = AND;

portas[2].inp1 = IN_PORT(0);

portas[2].inp2 = IN_CONST_1;

portas[2].out = 2;

portas[3].tipo = OR;

portas[3].inp1 = 1;

portas[3].inp2 = 2;

portas[3].out = OUT_PORT(13);

c.portas = portas;

c.fios = fios;

c.n_portas = 4;

}

(33)

Quadro 5 - Função loop() gerada no final da transpilação do circuito descrito

Fonte: elaborado pelo autor (2018)

No final da transpilação, o código gerado identificará o tipo das portas também por números e através desse valor, escolherá qual operação lógica irá utilizar naquele momento.

As portas são AND, OR, NOT, XOR, NAND, NOR e XNOR, os números que as representam são 0 para AND, 1 para OR, 2 para NOT e seguindo a ordem respectivamente. Assim o simulador trabalha com várias listas que representam os dados que foram lidos da descrição do circuito. A seguir as listas criadas em relação a descrição do circuito do Quadro 3.

Lista de Portas:

• Porta 0, tipo 2 (NOT);

• Porta 1, tipo 0 (AND);

• Porta 2, tipo 0 (AND);

• Porta 3, tipo 1 (OR).

Lista de Entradas:

• -3 (pino 0).

Lista de Saídas:

• -14 (pino 13).

Lista de Fios:

• 0 (f0);

• 1 (f1);

• 2 (f2).

Lista de Constantes:

• -1 (constante 0);

• -2 (constante 1).

void loop(){

int i;

for(i = 0; i < c.n_portas; i++){

simula_porta(c, i);

} }

(34)

6 RESULTADOS E DISCUSSÕES

Os testes de simulação foram realizados com programas gerados pelo transpilador e compilados no Arduino. Foram simulados alguns circuitos digitais aleatórios, como também alguns circuitos mais conhecidos, por exemplo: somador e codificador. Para auxiliar na análise dos resultados foi utilizado o programa Logisim, ferramenta usada para simular circuitos lógicos.

Com o Logisim foi possível simular os circuitos que serão testados no programa em Arduino, podendo gerar uma tabela verdade relacionada a esses circuitos. Utilizando LEDs (Light Emitting Diode, no português, diodo emissor de luz) foi possível verificar os valores de saída dos circuitos simulados. No caso, considera-se valor 0 se o LED estava apagado e valor 1 se o LED estava aceso.

6.1 CIRCUITOS ALEATÓRIOS

Como primeiro exemplo a ser testado, foi utilizado um circuito aleatório mostrado na figura a seguir:

Figura 7 - Primeiro circuito aleatório usados nos testes de simulações

Fonte: elaborada pelo autor (2018)

Através do circuito acima, foi gerado a descrição no Quadro 6 para que o programa em Arduino simulasse este circuito.

(35)

Quadro 6 - Descrição do primeiro circuito aleatório simulado

Fonte: elaborado pelo autor (2018)

Tabela 6 - Comparação de resultados do primeiro circuito aleatório simulado no Logisim e no Arduino

ent1 ent2 ent3 ent4 saida (tabela verdade) saida (simulador)

0 0 0 0 0 0

0 0 0 1 0 0

0 0 1 0 0 0

0 0 1 1 0 0

0 1 0 0 0 0

0 1 0 1 0 0

0 1 1 0 1 1

0 1 1 1 0 0

1 0 0 0 0 0

1 0 0 1 0 0

1 0 1 0 0 0

1 0 1 1 0 0

1 1 0 0 0 0

1 1 0 1 0 0

1 1 1 0 0 0

1 1 1 1 0 0

Fonte: eleborada pelo autor (2018)

input ent1 0 input ent2 1 input ent3 3 input ent4 4 output saida 13 wire f1

wire f2 wire f3 wire f4 wire f5

port NOT ent1 f1 port AND f1 ent2 f2 port AND f2 ent3 f3 port OR ent1 ent4 f4 port NOT f4 f5 port AND f3 f5 saida

(36)

Figura 8 - Teste realizado da 7ª linha da tabela verdade do primeiro circuito aleatório

Fonte: elaborada pelo autor (2018)

Outro exemplo de circuito aleatório também foi testado, como mostrado na Figura 9.

Figura 9 - Segundo circuito aleatório usado nos testes de simulação

Fonte: elaborada pelo autor (2018)

(37)

Quadro 7 - Descrição do segundo circuito aleatório simulado

Fonte: elaborado pelo autor (2018)

Tabela 7 - Comparação de resultados do segundo circuito aleatório simulado no Logisim e no Arduino

en1 en2 en3 sa (tabela verdade) sa (simulador)

0 0 0 0 0

0 0 1 1 1

0 1 0 1 1

0 1 1 1 1

1 0 0 1 1

1 0 1 0 0

1 1 0 1 1

1 1 1 0 0

Fonte: elaborada pelo autor (2018)

wire fi0 wire fi1 wire fi2 wire fi3 wire fi4 wire fi5 wire fi6 input en1 0 input en2 2 input en3 4

port XOR en1 en3 fi2 port NOT en1 fi0 port AND fi0 en2 fi3 port AND en1 en2 fi4 port NOT en3 fi1 port AND fi4 fi1 fi6 port OR fi2 fi3 fi5 port OR fi5 fi6 sa output sa 13

(38)

Figura 10 - Teste realizado da 6ª linha da tabela verdade do segundo circuito aleatório

Fonte: elaborada pelo autor (2018)

6.2 CODIFICADOR BINÁRIO-GRAY

O circuito de um codificador binário-Gray também foi utilizado. O código Gray representa uma sequência de números, onde a única característica que distingue os números no código Gray de um código binário é que apenas um bit muda entre dois números sucessivos (TOCCI; WIDMER; MOSS, 2011). A representação do circuito é mostrada logo abaixo, Figura 11, junto com a descrição, Quadro 8, e os resultados da simulação do circuito, Tabela 8.

(39)

Figura 11 - Circuito codificador binário-Gray usado na simulação

Fonte: elaborada pelo autor (2018)

Como o valor de um pino de entrada não pode ir direto para um pino de saída sem ter passado por alguma porta, foi adicionado duas portas NOT e um fio para realizar esta conexão sem alterar os valores (Figura 11).

Quadro 8 - Descrição do circuito codificador binário-Gray simulado

Fonte: elaborado pelo autor (2018)

input ent1 0 input ent2 1 input ent3 2 input ent4 3 output bit3 13 output bit2 12 output bit1 11 output bit0 10 wire fio

port XOR ent4 ent3 bit0 port XOR ent3 ent2 bit1 port XOR ent2 ent1 bit2 port NOT ent1 fio port NOT fio bit3

(40)

Tabela 8 - Comparação dos resultados do circuito codificador binário-Gray simulado no Logisim e no Arduino

(tabela verdade) (simulador) ent1 ent2 ent3 ent4 bit3

0b

0

bit2 0 1 0

bit1 0 0 0

bit0 0 0 0

bit3 0b

0

bit2 0 1 0

bit1 0 0 0

bit0 0 0 0

0 0 0 0 0 0 0 0 0

000 0 0

0 0 1 0

0 00

0 00

0 0 0 00

0 0 0 1 0 0 0 1 0 0 0 1

0 0 1 0 0 0 1 1 0 0 1 1

0 0 1 1 0 0 1 0 0 0 1 0

0 1 0 0 0 1 1 0 0 1 1 0

0 1 0 1 0 1 1 1 0 1 1 1

0 1 1 0 0 1 0 1 0 1 0 1

0 1 1 1 0 1 0 0 0 1 0 0

1 0 0 0 1 1 0 0 1 1 0 0

1 0 0 1 1 1 0 1 1 1 0 1

1 0 1 0 1 1 1 1 1 1 1 1

1 0 1 1 1 1 1 0 1 1 1 0

1 1 0 0 1 0 1 0 1 0 1 0

1 1 0 1 1 0 1 1 1 0 1 1

1 1 1 0 1 0 0 1 1 0 0 1

1 1 1 1 1 0 0 0 1 0 0 0

Fonte: elaborada pelo autor (2018)

Figura 12 - Teste realizado da 10ª linha da tabela verdade do circuito binário-Gray

Fonte: elaborada pelo autor (2018)

(41)

6.3 SOMADOR COMPLETO

A simulação do circuito somador completo foi mais um teste realizado. Esse tipo de circuito faz a adição de dois números binários de um bit com o bit de entrada de transporte (Carry in). Ele gera dois bits de saída, o de soma e o de saída de transporte (Carry out).

Vários somadores combinados podem realizar a soma de dois números de vários bits (COMUNICAÇÕES, 2018). Na Figura 13 é mostrado o circuito do somador completo, no Quadro 9 a descrição do circuito somador e os resultados da simulação na Tabela 9.

Figura 13 - Circuito somador completo usado na simulação

Fonte: elaborada pelo autor (2018)

(42)

Quadro 9 - Descrição do circuito somador completo simulado

Fonte: elaborado pelo autor (2018)

Tabela 9 - Comparação dos resultados do circuito somador completo simulado no Logisim e no Arduino

(tabela verdade) (simulador) entA entB Cin soma Cout soma Cout

0 0 0 0

1 1 1

0 00

1 0

0 1 1 1

0 0 1 0

0 0 1 1 0 1 0

0 1 0 1 0 1 0

0 1 1 0 1 0 1

1 0 0 1 0 1 0

1 0 1 0 1 0 1

1 1 0 0 1 0 1

1 1 1 1 1 1 1

Fonte: elaborada pelo autor (2018)

input entA 0 input entB 1 input Cin 3 wire f0 wire f1 wire f2 wire f3 wire f4

port XOR entA entB f0 port AND entB Cin f1 port AND Cin entA f2 port AND entA entB f4 port XOR f0 Cin soma port OR f1 f2 f3 port OR f3 f4 Cout output soma 6 output Cout 7

(43)

Figura 14 - Teste realizado da 2ª linha da tabela verdade do circuito somador completo

Fonte: elaborada pelo autor (2018)

6.4 FLIP-FLOP RS COM CLOCK

O próximo circuito simulado é o flip-flop do tipo SR com clock. Flip-flop é um tipo de circuito que armazena um único bit, em que esse dado poderá ser enviado através de uma saída Q. O clock é uma entrada que indica quando o flip-flop pode alterar o valor armazenado.

Quando seu valor for alterado de 0 para 1, o valor no flip-flop mudará de acordo com o seu tipo. No tipo SR, quando houver a variação do nível do clock, o valor guardado no flip-flop será mantido se as entradas R (Reset) e S (Set) forem iguais a 0. Se R for 1, durante a variação, o valor guardado se tornará 0, se a entrada S que for 1, o valor armazenado é alterado para 1. Se R e S forem ambas 1, o comportamento não é especificado, se tornando uma opção que deve ser evitada ao se trabalhar com flip-flops (BURCH, 2018).

(44)

Tabela 10 - Comportamento do flip-flop SR

Set Reset Q

0 0 Q

0 1 0

1 0 1

1 1 ??

Fonte: elaborada pelo autor (2018)

Tabela 11 - Comportamento do clock no circuito flip-flop RS

Clock Saída

0 Q

1 FF RS

Fonte: elaborada pelo autor (2018)

O circuito do flip-flop está representado na Figura 15, sua descrição no Quadro 10 e o resultado da simulação na Tabela 12.

Figura 15 - Circuito flip-flop SR com clock usado na simulação

Fonte: elaborada pelo autor (2018)

(45)

Quadro 10 - Descrição do circuito flip-flop SR com clock simulado

Fonte: elaborado pelo autor (2018)

Tabela 12 - Comparação dos resultados do circuito flip-flop SR com clock simulado no Logisim e no Arduino

(tabela verdade) (simulador) set clock reset saidaQ Qinvert saidaQ Qinvert

0 0 0 saidaQ

1 1

Qinvert 00

1 0

saidaQ

1 1

Qinvert 0 1 0 0 1 saidaQ Qinvert saidaQ Qinvert 0 1 0 saidaQ Qinvert saidaQ Qinvert

0 1 1 0 1 0 1

1 0 0 saidaQ Qinvert saidaQ Qinvert 1 0 1 saidaQ Qinvert saidaQ Qinvert

1 1 0 1 0 1 0

1 1 1 1 1 1 1

Fonte: elaborada pelo autor (2018)

input set 0 input reset 1 input clock 2 wire fio0 wire fio1 wire q wire qinv output saidaQ 5 output Qinvert 6

port NAND set clock fio0 port NAND clock reset fio1 port NAND fio0 qinv q port NAND q fio1 qinv port NAND fio0 qinv saidaQ port NAND q fio1 Qinvert

(46)

Figura 16 - Teste realizado da 4ª linha da tabela verdade do circuito flip-flop RS com clock

Fonte: elaborada pelo autor (2018)

Os resultados “saidaQ” e “Qinvert”, na Tabela 12, indicam que não teve alguma alteração no estado que se encontrava o circuito, justamente nas condições em que o clock não tinha variado e que as entradas “set” e ‘reset” estavam ambas desativadas, ou seja, se encontravam com valor 0. A última opção de entrada no teste não apresentou nada irregular, mas durante algum projeto ainda deve ser evitado chegar nesse resultado.

6.5 DISCUSSÕES

Analisando o estado do LED em cada possível combinação de entrada e comparando os resultados com os da tabela verdade geradas pelo Logisim, foi possível perceber que o simulador de circuitos digitais desenvolvido neste trabalho conseguiu atingir os objetivos, que foram:

• Especificar uma linguagem simples para o usuário descrever os circuitos digitais;

• Implementar um transpilador da linguagem especificada para um simulador em linguagem C do circuito descrito;

• Compilar o simulador gerado em uma placa Arduino;

(47)

• Verificar se a placa a Arduino se comporta como o circuito digital descrito.

Foi possível implementar um simulador com base em descrição simples de um circuito e também que esse circuito simulado se comportasse da mesma maneira que o circuito se comportaria realmente.

(48)

7 CONSIDERAÇÕES FINAIS

Neste trabalho, foi especificada uma linguagem de descrição de circuitos lógicos e implementados um parser e um transpilador para a linguagem especificada. O transpilador desenvolvido é capaz de gerar código em C de um simulador do circuito descrito; o código gerado pode ser compilado para a sua posterior execução em uma placa Arduino.

Com o objetivo de testar o transpilador desenvolvido, foram realizados testes com descrições de circuito de alguma complexidade incluindo alguns circuitos combinacionais, um codificador binário-Gray e um flip-flop.

Em todos os testes a placa Arduino simulando o circuito descrito apresentou o comportamento esperado. Era esperado que os resultados da tabela verdade do circuito descrito fossem iguais aos resultados das tabelas geradas pelo programa Logisim.

Considerando os testes realizados, principalmente com alguns circuitos vistos e trabalhados durante as aulas, o simulador desenvolvido torna-se uma grande opção de ferramenta para os professores e alunos utilizarem no decorrer das disciplinas. Usando fios, LEDs, protoboards e as diversas funções que a placa Arduino disponibiliza, realizar as simulações dos circuitos garante uma experiência física completa.

Uma ideia para poder melhorar este projeto futuramente seria empregar algumas ferramentas bastante conhecidas e utilizadas nas mais diversas ocasiões para tornar o simulador de circuitos digitais mais robusto, como o Logisim. Poder aproveitar as ferramentas digitais oferecidas pelo Logisim para que as simulações trabalhadas nesta monografia utilizem diretamente as simulações geradas pelo Logisim. Outra ideia é melhorar a linguagem implementada e o transpilador, para que mais possíveis erros possam ser identificados e corrigidos além de proporcionar ainda mais a experiência ao usuário. Também aproveitar a grande variedade de componentes que podem ser equipados nas placas Arduino, por exemplo, botões e sensores, abrangendo as características físicas do simulador de circuitos digitais, tornando-a mais realista.

Futuramente, depois das melhorias desenvolvidas na linguagem e no transpilador, seria uma ótima opção criar uma IDE, para que os usuários do simulador obtenham mais benefícios e melhorias nos gastos e desempenho, também verificação e correção de erros durante a elaboração dos projetos do usuário.

(49)

REFERÊNCIAS

ALVES, José Carlos. Sistemas Digitais. Porto: Feup/deec, 2004. 120 p.

ARDUINO. About Us. Disponível em: <https://www.arduino.cc/en/Main/AboutUs>. Acesso em: 26 ago. 2018.

BRANCO, Guido Aparecido Junior; TAMAE, Rodrigo Yoshio. UMA BREVE

INTRODUÇÃO AO ESTUDO E IMPLEMENTAÇÃO DE COMPILADORES. Revista Científica Eletrônica de Psicologia, Vila Labienópolis, v. 5, n. 8, p.0-6, fev. 2008.

Semestral. Disponível em:

<http://faef.revista.inf.br/imagens_arquivos/arquivos_destaque/RHXqIjJHvJQhhCK_2013-5- 28-11-13-48.pdf>. Acesso em: 3 jun. 2018.

BURCH, Carl. Flip-Flops D/T/J-K/S-R. Disponível em:

<http://www.cburch.com/logisim/docs/2.7/pt/html/libs/mem/flipflops.html>. Acesso em: 03 set. 2018.

CABOT, Jordi. La diferencia entre Transpilación y Compilación.2017. Disponível em:

<https://ingenieriadesoftware.es/diferencia-transpilacion-compilacion/>. Acesso em: 26 ago.

2018.

CARVALHO, Ricardo de. Javascript Transpiling. 2017. Disponível em:

<http://www.timeraposa.com.br/2017/12/javascript-transpiling/>. Acesso em: 26 ago. 2018.

CHAKRABARTY, Krishnendu. Logic Simulation. Durham: Duke University, 2016. 14 slides, color. Disponível em:

<http://people.ee.duke.edu/~krish/teaching/ECE538/Logic_simulation.pdf>. Acesso em: 12 jun. 2018.

CHEN, Hue-hua Ann. Event-Driven Logic Simulator. 1992. 63 f. Tese (Doutorado) - Curso de Ciência da Computação, Lehigh University, Bethlehem, 1993. Disponível em:

<https://preserve.lehigh.edu/cgi/viewcontent.cgi?article=1134&context=etd>. Acesso em: 12 jun. 2018.

COMUNICAÇÕES, Museu das (Org.). Portas Lógicas II. Disponível em:

<http://macao.communications.museum/por/Exhibition/secondfloor/moreinfo/LogicGates2.ht ml>. Acesso em: 03 set. 2018.

DAMAS, Luís. Linguagem C. 10. ed. Rio de Janeiro: LTC, 2007. 410p.

DEITEL, Paul J.; DEITEL, Harvey M. Como programar Em C. 6. ed. São Paulo: Pearson, 2011. 690 p.

GAVIRA, Muriel de Oliveira. Simulação Computacional como uma Ferramenta de Aquisição de Conhecimento. 2003. 162 f. Dissertação (Mestrado) - Curso de Engenharia de Produção, Escola de Engenharia de São Carlos, São Carlos, 2003.

IDOETA, Ivan Valeije; CAPUANO, Francisco Gabriel. Elementos de Eletrônica Digital.

41. ed. São José dos Campos: Érica, 2012.

Referências

Documentos relacionados

Também em sede do CdA, no qual têm assento a generalidade desses parceiros, num total de 54 membros e na qual se aprovam matérias determinantes para a operacionalização do PO

Minha terra tem primores, Que tais não encontro eu cá; Em cismar – sozinho, à noite – Mais prazer encontro eu lá; Minha terra tem palmeiras, Onde canta o Sabiá..

Dentro da precisão experimental, o valor teórico que obtivemos pela teoria de Stockwell, que é a teoria newtoniana, a mesma teoria de Laplace, está de acordo

 Roteadores e enlaces agem como caixa preta  Sistemas em aplicações P2P comutam as. funções de cliente

Direito Empresarial I (Teoria Geral) Direito Empresarial I (Teoria Geral) Direito Civil VIII (Sucessões) Direito Financeiro e Tributário I Direito Financeiro e Tributário I

Dessa forma, este artigo objetivou caracterizar a mancha de inundação, resultante da simulação do rompimento da Barragem de Itabiruçu em Itabira (MG), analisando

Resolução Unilateral: Verifica-se em situação de incumprimento dos valores mínimos de permanência na Apólice (1.000 euros) exigidos pelo Segurador após o

Através desse trabalho, procuramos compreender o perfil dos empreendedores da cidade de Lagoa d’ Anta, como também o funcionamento dos empreendimentos da mesma, com