Escolar Documentos
Profissional Documentos
Cultura Documentos
Rio de Janeiro
Junho de 2018
Del Rei, Pedro Guimarães
Simulador Interativo de Eletrônica Digital/ Pedro
Guimarães Del Rei. – Rio de Janeiro: UFRJ/ Escola
Politécnica, 2018.
X, 53: il.; 29,7 cm.
Orientador: José Arthur da Rocha
Projeto de Graduação - UFRJ/Escola Politécnica/
Curso de Engenharia Eletrônica e de Computação, 2018
Referências Bibliográficas: p. 59.
1. Eletrônica Digital 2. Simulador Educativo.
3. Orientação a Objeto. I. Arthur da Rocha, José. II.
Universidade Federal do Rio de Janeiro, Escola
Politécnica, Curso de Engenharia Eletrônica e de
Computação. III. Simulador Interativo de Eletrônica
Digital.
iii
iv
AGRADECIMENTO
Dedico este trabalho aos meus mestres pela paciência e aos meus pais por sempre
acreditarem em mim.
v
Resumo do Projeto de Graduação apresentado à Escola Politécnica/UFRJ como parte
dos requisitos necessários para a obtenção do grau de Engenheiro Eletrônico e de
Computação.
Junho/2018
vi
Abstract of Undergraduate Project presented to POLI/UFRJ as a partial fulfillment of the
requirements for the degree of Engineer.
Junho/2018
This project consists in a digital electronics simulator, where the user can mount circuits
in one or more protoboards and create additional integrate circuits as he or she wishes.
The focus was in creating a system with a simple learning curve, making efforts on
creating a simple and intuitive interface, visually like the digital electronics lab.
The simulator was able to calculate correctly all the circuits tested, had a satisfactory
response time and was able to replace all the simulators used for academic purposes.
vii
Sumário
1 Introdução 1
1.1 – Tema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 - Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.3 - Desenvolvimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.4 - Descrição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 Os Componentes 3
2.1 - A Fonte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 - A Protoboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.3 - O Fio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.4.1.1 - AND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.4.1.2 - NAND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4.1.3 - OR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.4.1.4 - NOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.4.1.5 - NOT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4.1.6 - XOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4.1.7 - Multiplexador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4.1.8 - Demultiplexador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
viii
2.4.1.11 - Componente Fictício - Decimal para BCD . . . . . . . . . . . . . . . . . 14
2.5 - LED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.8 - Resistor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.9 - Label . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2.1 – Atributos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.2.1.1 – Nome . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.2.1.2 – ConnectorsName . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.2.1.3 – Tabela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4 O Sistema 26
4.1 - A Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
ix
4.1.1 - A Lista de Componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.1.2 - O Console . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5 Desenvolvimento 35
5.2.1 – Seleção . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5.2.2 – Posicionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.2.3 - Conexão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.3.1 – Coroutines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
x
5.3.2.3 – Demais Componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.4.2 – MonoBehaviour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.4.3 – BoxColliders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.4.4 – GameObjects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.6.1 – Protoboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6 Testes Realizados 50
xi
7 Conclusões 56
7.1 - Aprendizados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Bibliografia 57
A Manual do Usuário 58
xii
SIGLAS
xiii
Capítulo 1
Introdução
1.1 – Tema
1.2 – Objetivo
1.3 – Desenvolvimento
1
Após a implementação veio a fase de testes e ajuste fino, onde foram feitas
melhoras de desempenho do sistema e, como consequência a revisão do escopo inicial.
1.4 – Descrição
2
Capítulo 2
Os Componentes
É definido como componente tudo aquilo que pode ser utilizado na montagem
de um circuito. Neste capítulo será feita uma apresentação de cada um dos componentes
inicialmente implementados no sistema, que podem ser encontrados e selecionados
utilizando a lista de componentes ou o console, ambos apresentados no terceiro
capítulo.
2.1 – A Fonte
3
2.2 – A Protoboard
2.3 – O Fio
O fio conecta duas entradas da protoboard e/ou da fonte, fazendo com que os
dois pontos tenham a mesma tensão. No projeto foram implementados dois tipos de fios
diferentes: os fios chamados de banana - que são cabos mais grossos utilizados para
conectar nas entradas da fonte e nos bornes da protoboard - e os fios comuns, utilizados
para conectar as demais entradas da protoboard. A cor do fio pode ser alterada pelo
usuário.
4
2.4 – Circuitos Integrados
2.4.1.1 – AND
A função lógica AND (ou E em português) é uma operação lógica que gera nível
lógico 1 em sua saída quando todas as entradas estão também em nível lógico 1. Sua
tabela verdade para duas entradas é indicada na Tabela 2.1.
Tabela 2.1 – Tabela verdade da operação lógica AND para duas entradas
Entrada 0 Entrada 1 Saída
0 0 0
0 1 0
1 0 0
1 1 1
5
Foi escolhido o CI DM7408 Quad 2-Input AND Gates, que possui 4 portas
lógicas AND de duas entradas e 14 pinos com a pinagem conforme indicada na Figura
2.3.
2.4.1.2 – NAND
NAND (ou Não-E) pode ser obtido colocando uma porta AND e uma porta NOT
em cascata. Ela tem o nível lógico 1 na saída se tiver nível lógico 0 em pelo menos uma
das entradas. Sua tabela verdade é exatamente a oposta da tabela verdade do AND.
Tabela 2.2 – Tabela verdade da operação lógica NAND para duas entradas
Entrada 0 Entrada 1 Saída
0 0 1
0 1 1
1 0 1
1 1 0
Para este CI foi escolhido o DM7400 Quad 2-Input NAND Gates que possui 4
portas lógicas NAND e com a pinagem conforme indicada na Figura 2.4.
6
2.4.1.3 – OR
OR (ou OU) é uma função lógica básica que tem nível lógico 1 em sua saída se
pelo menos uma das entradas estiver com nível lógico 1. Para duas entradas, sua tabela
verdade é conforme a Tabela 2.3.
Para este CI foi escolhido o DM74LS32 Quad 2-Input OR Gate, que possui 4
portas lógicas OR e com a pinagem conforme indicada na Figura 2.5.
2.4.1.4 – NOR
Tabela 2.4 – Tabela verdade da operação lógica NOR para duas entradas
Entrada 0 Entrada 1 Saída
0 0 1
0 1 0
1 0 0
1 1 0
7
Foi escolhido o 74HC02 Quad 2 Input NOR Gate, que possui 4 portas lógicas
NOR com a pinagem indicada pela Figura 2.6.
2.4.1.5 – NOT
NOT (ou Não ou Inversor) é uma operação de uma entrada e uma saída que tem
em sua saída sempre em nível lógico oposto do nível lógico da entrada.
Foi escolhido o DM7404 Hex Inverting Gates, que possui 6 portas lógicas NOT
ligadas conforme indicado na Figura 2.7.
2.4.1.6 – XOR
XOR (ou OU exclusivo) é a operação cuja saída tem nível lógico 1 (H – HIGH)
quando o nível lógico de suas entradas é diferente. A tabela verdade de um XOR com
duas entradas é conforme a Tabela 2.6.
8
Tabela 2.6 – Tabela verdade de um XOR com duas entradas
Entrada 0 Entrada 1 Saída
0 0 0
0 1 1
1 0 1
1 1 0
Foi escolhido o DM7486 Quad 2-Input Exclusive-OR Gate, que possui 4 portas
lógicas XOR ligadas conforme indicado na Figura 2.8.
2.4.1.7 – Multiplexador
9
Foi implementado o CI DM74150 com 16 entradas, 4 linhas seletoras e 1 saída
com sua pinagem indicada na Figura 2.9. Note que o pino denominado de Strobe nada
mais é do que o Enable, ou seja, o pino que habilita o CI (em nível lógico 0).
É importante observar que sua saída tem o nível lógico ativo baixo (L – low
level). Para melhor entendimento do funcionamento dos componentes, é possível
consultar a Tabela 2.7b
10
2.4.1.8 – Demultiplexador
11
2.4.1.9 – Decodificador Binário - Decimal
Esse componente converte um sinal binário para um sinal próprio para ser
utilizado em um display de 7 segmentos (descrito em 2.6).
12
Foi escolhido o CI DM9368 7-Segment Decoder, com 4 entradas, um Latch
Enable, uma entrada RBI (Ripple Blanking Input) e uma entrada RBO (Ripple Blanking
Output). Sua pinagem é conforme a Figura 2.12.
O pino Latch Enable, quando ativo (nível lógico 0), faz com que o decodificador
funcione normalmente, com o valor das saídas definido pelo valor das entradas. Caso
ele esteja inativo (nível lógico 1), as saídas do CI serão correspondentes ao último valor
aplicado nas entradas com a entrada Latch Enable ativa.
A entrada RBI zera as saídas (estado lógico indefinido) caso esteja ativa
enquanto as demais entradas estiverem em estado lógico 0. Neste caso, a saída RBO
estará em nível lógico 0 (para todas as outras possibilidades, a saída RBO estará em
estado lógico 1).
Essa entrada pode ser utilizada para ocultar zeros à esquerda. Para isso, deve-se
conectar a saída RBO do dígito à esquerda na entrada RBI do dígito anterior (menos
significativo) e assim sucessivamente, com a exceção do LSB, que mantém o RBI em
estado lógico 1, e do MSB, que deve ficar com o RBI aterrado.
A tabela verdade do DM9368 está indicada na Tabela 2.10.
13
Tabela 2.10 – Tabela verdade do DM9368.
Fonte: Farchild [5].
Foi criado ainda um Codificador de Decimal para BCD fictício, definindo-se sua
pinagem e tabela verdade.
O codificador de decimal para BCD criado, tem a tabela verdade contraposta em
relação ao decodificador BCD para decimal DM7442A, conforme informado na Tabela
2.11 enquanto a pinagem permanece idêntica à do decodificador, presente na Figura
2.12.
14
Tabela 2.11 – Tabela verdade do Codificador Decimal - BCD.
15
tipo D, cada um com uma entrada preset, uma entrada clear e uma saída complementar,
ou seja, uma saída com o valor invertido em relação à saída comum.
Este CI é “Positive-Edge-Triggered” ou seja, é ativado com transições positivas
do clock.
Conforme indicado na Tabela 2.12, o estado onde o preset (PR) e clear (CLR)
estão no nível lógico 0 (L - low) é instável e não deve ser utilizado.
16
Tabela 2.13 – Tabela verdade do FFP J-K
J K Saída
0 0 Q0
0 1 0
1 0 1
1 1 Q0’
2.5 – LED
17
2.6 – Display de 7 Segmentos
Figura 2.15 – Pinagem dos displays com anodo comum (à esquerda) e catodo comum (à direita)
18
Figura 2.16 – Pinagem do Display de 7 segmentos com 4 entradas.
2.8 – Resistor
2.9 – Label
19
Capítulo 3
20
3.2 – O Conteúdo do Arquivo
O conteúdo do arquivo deverá ser iniciado pelo caractere “{“ e terminar com
“}”. Entre esses caracteres, ele deve conter 3 atributos específicos.
3.2.1 – Atributos
De maneira sucinta, os atributos são campos com nome e valor que, no software,
serão convertidos em atributos de uma classe. Eles não precisam estar ordenados, mas o
formato de cada um deve ser seguido de maneira estrita.
O nome do atributo sempre vem primeiro e entre aspas, seguido de dois pontos
(“:”) e o seu valor. Os atributos são separados por vírgula e o usuário pode também
separá-los por quebra de linha (ou “enter”), para facilitar a visualização de seu
conteúdo.
3.2.1.1 – Nome
O primeiro atributo é o “nome”. Ele indica qual o nome que será exibido
quando a ponta de prova apontar para este componente. O usuário pode colocar um
nome diferente do nome do arquivo, caso desejar. Seu valor deve estar entre aspas,
conforme o exemplo mostrado na Figura 3.3a.
21
3.2.1.2 – ConnectorsName
22
Tabela 3.1 – Relação entre índices das entradas e saídas e os seus posicionamentos na tabela verdade.
Tabela Verdade
Índice das Entradas Índice Índice das Saídas
... 3 2 1 0 0 1 2 3 ...
Valor das Entradas Valor das Saídas
... 0 0 0 0 0 Y0 Y16 Y32 Y47 . . .
... 0 0 0 1 1 Y1 Y17 Y33 Y48 . . .
... 0 0 1 0 2 Y2 Y18 Y34 Y49 . . .
... 0 0 1 1 3 Y3 Y19 Y35 Y50 . . .
... 0 1 0 0 4 Y4 Y20 Y36 Y51 . . .
... 0 1 0 1 5 Y5 Y21 Y37 Y52 . . .
... 0 1 1 0 6 Y6 Y22 Y38 Y53 . . .
... 0 1 1 1 7 Y7 Y23 Y39 Y54 . . .
... 1 0 0 0 8 Y8 Y24 Y40 Y55 . . .
... 1 0 0 1 9 Y9 Y25 Y41 Y56 . . .
... 1 0 1 0 10 Y10 Y26 Y42 Y57 . . .
... 1 0 1 1 11 Y11 Y27 Y43 Y58 . . .
... 1 1 0 0 12 Y12 Y28 Y44 Y59 . . .
... 1 1 0 1 13 Y13 Y29 Y45 Y60 . . .
... 1 1 1 0 14 Y14 Y30 Y46 Y61 . . .
... 1 1 1 1 15 Y15 Y31 Y47 Y62 . . .
Caso o pino seja uma entrada, seu índice indicará sua posição (0 sendo o LSB e
N sendo o MSB) no valor binário do índice (linha) da tabela verdade, enquanto para
uma saída, o índice indicará sua posição (coluna) da tabela verdade. O índice, neste
último caso, é contado da esquerda para a direita, enquanto que, para as entradas, a
contagem é feita da esquerda para a direita, conforme mostra a tabela.
O texto indicativo não é aplicado para os pinos VCC e GND. Estes pinos são
obrigatórios para todos os CIs. Caso contrário, o componente não poderá ser ativado.
Segue, na Figura 3.5, um exemplo do atributo “connectorsName” para um CI
com duas entradas e uma saída.
23
3.2.1.3 – Tabela
Figura 3.6 – O atributo “tabela” para um componente com a tabela verdade da Tabela 2.15.
24
Figura 3.7 – Pinagem de um AND de duas entradas e saídas complementares.
Tabela 3.3 – Tabela verdade de um AND de duas entradas e duas saídas complementares.
Y0 !Y0
L H
L H
L H
H L
25
Capítulo 4
O Sistema
4.1 – A Interface
26
Figura 4.2 – A lista de componentes.
4.1.2 – O Console
O console pode ser ocultado a qualquer momento pelo usuário para ter uma
visão mais limpa da área de trabalho (ao iniciar o sistema, o console estará
inativo).
27
4.1.3 – A Área de Trabalho
28
4.1.5 – O Painel de Cores
LEDs, fios e labels podem ter suas cores alteradas utilizando o console ou então
o painel de cores.
Para utilizar o painel de cores, basta selecionar um componente e selecionar a
cor desejada.
Para montar um circuito o usuário deve inicialmente selecionar pelo menos uma
protoboard (pela lista ou console) e posiciona-la(s) na área de trabalho. É importante
ressaltar que o número de protoboards utilizáveis é ilimitado.
29
Após posicionar a protoboard, o usuário pode selecionar qualquer componente
na listagem e conectá-lo a ela, desde que os furos selecionados estejam livres. O
contorno branco em volta do furo indica que a entrada selecionada da protoboard está
livre para ser conectada.
30
Figura 4.10 – Um fio ligando os dois pinos do CI conectado.
Caso os dois pontos conectados pelo fio tenham suas tensões definidas, e
diferentes, ocorrerá a queima deste fio, conforme mostrado na Figura 4.11. O fio
queimado não funcionará mais, ou seja, não conectará mais dois pontos da protoboard, e
deverá ser removido do circuito.
Caso o fio conecte duas saídas de CIs diferentes, o usuário será informado pelo
console que fez uma conexão incorreta e que deve refazer a conexão corretamente
(Figura 4.12).
31
Caso desejado, a visualização do circuito ainda pode ser melhorada nomeando
linhas da protoboard, por meio das labels.
Figura 4.14 – A fonte ligada (indicada pelo display aceso) e conectada à protoboard.
Figura 4.15 – As entradas (labels vermelhas) e saídas (labels azuis) identificadas no circuito
montado.
As entradas e saídas podem ter seus nomes redefinidos pelo usuário para auxiliar
na visualização de seu Datasheet (Figura 4.16).
33
Figura 4.16 – As entradas e saídas do circuito podem ser renomeadas.
34
Ao finalizar esta etapa e consequentemente o encapsulamento, o circuito
montado será salvo e o usuário retornará para a tela inicial, onde poderá encontrar o
novo CI na lista de componentes.
Capítulo 5
Desenvolvimento
35
Para tal, foi utilizado o Piskel – um software para criação desenhos pixelados –
por ser gratuito e open source. O conhecimento prévio do autor também foi um fator
determinante para a escolha.
O software fornece algumas ferramentas como camadas, palheta de cores e
algumas teclas de atalho que facilitam a criação de desenhos e o tornam mais vantajoso
do que o Paint (software de criação de desenhos da Microsoft).
Quanto à representação lógica, resolveu-se tomar proveito da semelhança
comportamental dos CIs e optar por uma linguagem de programação com orientação a
objeto.
O principal conceito da orientação de objetos é o de herança, onde – de maneira
sucinta – uma classe B, se herdada da classe A, tem acesso a alguns métodos presentes
na primeira, fazendo com que não seja necessário reescrever partes do código.
5.2.1 – Seleção
A seleção é a etapa onde o usuário escolhe o componente que utilizará. Para isso
ele deve procurar o componente na listagem de componentes e selecioná-lo (clique com
o botão esquerdo do mouse).
Os componentes da lista de componentes estão em uma lista de ListItem. Esta
classe possui como atributos o nome do componente, palavras-chave e o objeto que será
instanciado ao selecioná-lo.
36
Para listar também os componentes adicionados pelo usuário (pertencentes a
pasta CustomCI), um método é invocado ao iniciar o sistema, onde é feita uma
varredura na pasta e cada arquivo de extensão json é convertido para um ListItem.
Ao selecionar um componente, o componente é instanciado na área de trabalho e
o usuário pode posicioná-lo.
5.2.2 – Posicionamento
37
O método Update é um método não implementado, onde seu comportamento é
descrito pelo desenvolvedor ao implementá-lo. No caso mostrado na Figura 5.2, o
método foi implementado com o objetivo de atualizar a posição do componente não
conectado à cada frame.
38
protoboard. Caso seja, o método SelectSlot é invocado, este método salva o slot para
caso o usuário deseje conectar o componente.
5.2.3 – Conexão
39
informação de cada conector é passado para o respectivo slot conectado
(SlotBehaviour), que passa para sua respectiva linha (RowBehaviour).
A linha adiciona/remove o conector em uma lista de conectores conectados
(connectedConnectors) e em seguida recalcula-se o seu novo estado.
Para que o sistema consiga simular circuitos em tempo real, o cálculo deve ser
feito a cada alteração, seja esta uma conexão ou uma remoção de um componente da
protoboard ou ao desligar ou ligar a fonte.
Ao se alterar um circuito, todas as linhas afetadas varrem a lista de conectores
conectados em busca de um conector que seja uma saída (ou output). Ao encontrá-la, a
linha define seu estado como sendo o mesmo deste conector (caso ela não encontre, o
seu estado será indefinido) e em seguida varre a lista de conectores e, para cada um
40
destes (com a exceção do output), invoca o método SetState de cada conector. Cada um
informa o seu componente de que houve uma alteração no circuito e caso algum estado
tenha sido alterado, o componente toma as devidas providências.
5.3.1 – Coroutines
O cálculo do circuito é feito em cascata, onde uma alteração em uma linha pode
alterar o estado da linha seguinte e assim sucessivamente até chegar no final do circuito.
Por isso, estes cálculos podem ser bastante demorados e afetarem o desempenho do
sistema. Para melhorar a performance, foram utilizadas Coroutines.
Coroutines possibilitam que os métodos possam ser interrompidos e retomados
após um determinado período. Isso faz com que operações demoradas não atrapalhem o
desempenho do sistema.
Os métodos ConnectDisconnect de todas as classes são Coroutines. Portanto ao
conectar um componente, visualmente ele é conectado, mas logicamente a conexão é
parcelada nos frames seguintes, fazendo com que o sistema não trave enquanto calcula
os estados resultantes ao fazer uma conexão.
Uma conexão em cascata como o da Figura 5.8 causa uma reação em cascata
onde cada linha atualiza o estado do fio que atualiza o estado da linha seguinte e assim
41
adiante. Sem o uso da Coroutine seria impossível calcular os estados resultantes e
mostrar visualmente a conexão sem um atraso perceptível.
42
5.3.2.1 – Componentes Combinacionais
43
Ao invés de consultar a tabela verdade, o seu comportamento foi todo
programado, checando o valor das entradas (J e K ou D e o Clock) e setando o valor das
saídas com base no valor do Clock e do estado anterior.
Como o sistema trabalha apenas com situações ideais, não é preciso representar
os estados com valores inteiros ou decimais (representando as tensões), porém não é
possível representá-los utilizando variáveis binárias (booleanas), pois além dos estados
lógicos 1 (High) e 0 (Low), existe ainda o estado “indefinido” (quando não há uma
tensão definida). Portanto, foi utilizada a classe DBBool para representar os estados
lógicos, que possui 3 estados: True (High), False (Low) e Null (Indefinido).
44
5.3.4 – Tabela Verdade
Tabela 5.1 – Array contendo a tabela verdade do AND com duas entradas.
Linha Val. Binário Array
I X1 X0 Y0
0 00 0
1 01 0
2 10 0
3 11 1
45
Figura 5.12 – A consulta da tabela verdade.
46
5.4.2 – MonoBehaviour
5.4.3 – BoxColliders
5.4.4 – GameObjects
47
GameObjects possibilitam ainda realizar uma espécie de herança múltipla
(quando uma classe herda de uma ou mais classes), o que não seria permitido em C# ao
se atribuir mais de um script a ele.
48
5.6 – Composição dos Componentes
5.6.1 – Protoboard
49
Capítulo 6
Testes Realizados
Figura 6.1 – Tempos de resposta do TTL7408 (cima), TTL74151 (meio) e TTL7473 (baixo).
O teste de stress foi feito de três maneiras diferentes: Na primeira, foi medido o
tempo de resposta da protoboard para uma variação encadeada de estados.
50
Já no segundo teste de stress foi medido o tempo de carregamento de um
circuito com vários componentes.
O terceiro e último teste consistiu no cálculo de tempo levado para encapsular
um circuito com 10 entradas e 10 saídas.
Figura 6.3 – Tempo de resposta para a transição de estado no circuito da Figura 6.2.
51
6.2.2 – Segundo Teste de Stress
Figura 6.5 – Tempo de resposta para o cálculo de uma tabela verdade com 10 entradas e 10
saídas.
52
6.3.1 – Teste da década
Figura 6.6 – Conexões entre FFPs J-K e a porta lógica NAND, formando uma década.
53
Os resultados foram satisfatórios: A década conta corretamente, porém,
exibe o número 10 (1010 em binário) rapidamente antes de retornar para o zero. Isso
acontece, pois, as mudanças de estado são calculadas em tempo real e a mudança de
estado só chega ao NAND depois de chegar nos Flip-Flops. O tempo de duração do
número 10 é o tempo em que a transição de estado demora para chegar no NAND, que
não é a mesma dos Flip-Flops.
54
Figura 6.9 – MUX 2:1 montado na protoboard, onde o CI laranja é o AND TTL7408, o CI
amarelo é o NOT TTL7404 e o azul, o OR TTL7432.
55
Capítulo 7
Conclusões
7.1 – Aprendizados
56
Bibliografia
[1] TOCCI, Ronald J, WIDMER, Neal S., MOSS, Gregory L., Sistemas Digitais:
Princípios e Aplicações. 11a ed. São Paulo: Pearson, 2011, pp 101.
57
Apêndice A
Manual do Usuário
O sistema não precisa ser instalado. Para inicia-lo, basta executar o arquivo
“Simulador.exe”.
Ao executar o arquivo, o usuário terá de escolher uma entre as resoluções
disponíveis. Deve-se escolher a resolução 1024 x 768 (a opção “Windowed” é
opcional).
58
A.2 – Utilização do Sistema
A.2.2 – Console
59
Selecionar (Select) + <componente>: Seleciona o componente. Caso
este componente for uma label, o comando deve ter mais um argumento,
sendo este o nome de identificação da label;
Gerar (Generate) + <nome do novo CI>: Inicia o processo de
encapsulamento de circuitos. O nome do CI deve ser único, não havendo
nenhum outro CI criado ou circuito salvo com o mesmo nome;
Sair (Exit): Sai da aplicação.
A área de trabalho é onde o usuário pode montar o circuito. Para isso, ele deve
primeiro selecionar pelo menos uma protoboard (por meio da lista ou console) e
posiciona-la em qualquer lugar da área de trabalho com o botão esquerdo do mouse.
Para conectar qualquer outro componente na protoboard, deve-se primeiro
posiciona-lo corretamente, com todos os seus conectores acima de pinos livres da nela
(indicados pelo contorno branco como na figura A.2). Posicionado o componente
corretamente, o usuário pode conecta-lo, assim como a protoboard, pressionando o
botão esquerdo do mouse.
Para desconectar um componente para reposiciona-lo ou remove-lo, basta clicar
nele com o botão esquerdo do mouse. A seleção de um componente pode ser cancelada
e o componente removido com a tecla “Esc” do teclado.
60
Caso uma saída do chip seja conectada em uma linha com uma tensão já
definida, o usuário será informado de que fez uma conexão incorreta pelo console e
caso a conexão não seja consertada, o sistema poderá calcular o circuito incorretamente.
Para selecionar um fio, o usuário deve clicar nas duas entradas da protoboard (ou
da fonte). Existem dois tipos de fio, o fio “Banana” que serve para conectar na fonte e
nos bornes da protoboard e o fio “Comum” utilizado para as demais entradas da
protoboard. O tipo de fio é selecionado automaticamente assim que o usuário seleciona
a primeira entrada.
Para alterar a cor de um fio/LED/label, utiliza-se o painel de cores. Clicando
com o botão direito do mouse em qualquer um desses componentes, o painel se abrirá e
o usuário pode escolher a cor desejada.
Para utilizar a ponta de prova, basta pressionar a tecla “Alt” esquerda do teclado
e apontar o mouse no componente / entrada que deseja obter informações.
61
Caso não haja nenhum problema durante a simulação do circuito, a etapa de
pinagem se inicia. O usuário deve selecionar uma das entradas/saídas/VCC/GND e
posicionar no pino desejado arrastando com o botão direito do mouse o seu nome e o
soltando em cima do “Slot” referente ao pino.
62
A primeira linha contém o nome do CI (Importante: o nome do arquivo deve
ser igual ao nome do CI também).
A segunda linha indica a pinagem do CI, onde a contagem ocorre conforme a
Figura A.5. Ao nome das entradas e saídas foi adicionado os caracteres “X +
<índice>” (no caso das entradas) e “Y + <índice>” (no caso das saídas),
indicando se são entradas ou saídas e a sua ordem na tabela verdade. No
exemplo da Figura A.5, vê-se que a primeira coluna da tabela verdade então
se refere à saída “Y0Q” e a segunda coluna à saída “Y1Q”. As entradas
VCC e GND são obrigatórias ou o CI não ficará ativo.
A ultima linha contém a tabela verdade do CI, onde cada índice contem o
valor de cada saída separado por “.”. O valor “-1” indica o valor lógico 0 (L
– LOW), o valor “1” indica o valor lógico 1 (H – HIGH) e o valor “0” indica
o valor lógico “NULL” ou indefinido.
Entradas Saídas
B A !Q Q
0 0 0 0
0 1 0 1
1 0 1 0
1 1 1 1
63
O arquivo deve ser salvo como “<Nome do Componente>.json” e colocado na
pasta correta (CustomCI). O sistema reconhecerá o componente assim que for
inicializado.
Caso o componente não funcione de maneira esperada, deve-se rever o seu
conteúdo para se certificar de que este está correto.
64