Mostrando postagens com marcador Eletrônica. Mostrar todas as postagens
Mostrando postagens com marcador Eletrônica. Mostrar todas as postagens

Sinal de Interrupção Mascarável

Quando um dispositivo periférico, que está conectado a um microprocessador, utilizar o sinal de interrupção mascarável para solicitar serviços, a sequência de eventos será:

Passo a passo da Interrupção Mascarável no Microprocessador Intel 8086 / 8088

  • O pino de interrupção é ativado pelo dispositivo
  • ACK é enviado, pelo microprocessador, até o dispositivo periférico
  • O topo da pilha passa a ter o IP (Instruction Pointer) e CS (Code Segment) do programa interrompido (para que sua execução volte a ser realizada após a interrupção)
  • Em seguida o microprocessador envia o segundo ACK
  • O dispositivo tem que informar ao microprocessador o tipo de interrupção que deseja
  • O microprocessador, ao saber o tipo de interrupção, acessa a tabela de vetores de interrupção (basta multiplicar o número da interrupção por 4)
  • Após serem lidos da tabela de vetores de interrupção do programa do dispositivo, eles são carregados nos registros IP e CS
  • Feito isso, finalmente o programa do dispositivo é executado
  • Instrução IRET é executada
  • Interrupção terminada, os 4 bytes dos registros IP e CS do programa que foi originalmente interrompido são colocados de volta nos registros IP e CS
  • O programa que estava sendo executado antes da interrupção volta a ser executado pelo microprocessador

8254 - Temporizador/Contador programável de intervalos

Como bem sabemos, absolutamente tudo o que é relacionado aos microprocessadores e suas operações, envolve períodos de tempo (intervalos ou ciclos). As coisas não funcionam de modo contínuo ou aleatoriamente.

O microprocessador Intel 8086, e seus sucessores como 8088, não poderiam ser diferentes.
Se utilizam de clocks para realizar suas rápidas operações, e uma maneira de controlar essas funções, é através do 8254, objeto de estudo desse artigo de nosso curso de microprocessadores.


Temporização e pinagem do 8086/8088

0 8254 é um dispositivo programável, constituído de três contadores de 16 bits, que podem ser programados para criar intervalos de temporização, seja contagem binária ou BCD (binary-coded decimal), contadores estes capazes de trabalhar com até 10 mega hertz (uma verdadeira potência e velocidade para a época, que é uma versão melhorada e mais rápida do 8253).

Como podem ver no datasheet do 8254, ele possui 3 pinos de clock (CLK 0, CLK 1 e CLK 2), um para cada contador.

Obviamente, o 8254 funciona usando um contador de cada vez, e a seleção de qual contador vai ser utilizado é feita através das entradas:
$$A_0 , A_1$$

Ou seja, para:
$$A_0=0 , A_1=0 -> contador 0$$
$$A_0=1 , A_1=0 -> contador 1$$
$$A_0=0 , A_1=1 -> contador 2$$
$$A_0=1 , A_1=1 -> palavra de controle$$

O pino G é a porta (gate), que vai controlar o modo de operação de cada contador.
E o sinal gerado por cada contador sai pelo pino OUT.

O 8254 também possui os pinos de leitura (RD) e escrita (RW), que são conectados ao IORC e ao IOWC, respectivamente, além dos pinos GND (ground ou terra), o Vcc (de 5 volts) e o CS (chip select, que vai habilitar o 8254 quando ele for usado), como de praxe.

Como programar o 8254 - Pinagem

A grande vantagem do temporizador 8254, é o fato de ser possível programá-lo ao modo que quisermos, fazendo dele um contador extremamente poderoso, versátil e flexível.

Sempre que formos usar o 8254, temos que definir se vamos usá-lo para operação de leitura (RD) ou escrita (WR), seu modo de operação e qual contador vamos usar. Isso é feito através das palavras de controle (control word).
Existem 8 palavras de controle, que vamos estudar agora.

BCD
Se BCD=0, a contagem é feita de forma binária. Caso BCD=1, a contagem é do tipo BCD.
Cada contador pode contar de 1 até FFFFH, onde o 0 é FFFFH + 1, que equivale a 10000 em BCD.

Existem 6 modos de operação dos temporizadores do 8254 (modo 0, modo 1, modo 2, modo 3, modo 4 e modo 5).
Portanto, para selecionar cada um deles é necessário ter no mínimo 3 bits, daí a existência do M0, M1 e M2.
No próximo tópico desse artigo, entraremos em detalhes sobres os modos de operação do 8254.

Há dois bits que vão determinar se vamos ler ou escrever, do contador ou para o contador, que são o RW0 e o RW1, além dos dois bits que vão selecionar o contador, que já havíamos discutido, que são os SC0 e SC1.

No controle de leitura e escrita (RD/WR), se tivermos:
00 -> comando para o contador de latch
01 -> leitura/escrita somente do byte menos significativo
10 -> leitura/escrita somente do byte mais significativo
11 -> leitura/escrita do byte menos significativo primeiro, depois o byte mais significativo

Modos de operação do 8254

Vamos agora descrever os mais variados tipos de operação que podemos fazer com cada um dos 3 contadores do 8254, através dos pinos M0, M1 e M2.

Modo 0

Neste modo, o 8254 é um contador de eventos, em que a saída terá valor lógico 0 quando a palavra de controle for escrita, e assim permanece até que uma sequência de X valores ocorra, onde nós escolhemos esse X.
Esse contagem só ocorre enquanto G=1.

Modo 1 

Nesse modo, o 8254 é um monoestável retrigável multivibrador (one-shot).
Através da entrada G, o contador é trigado e pulsa na saída, que se terá valor lógico 0 até o fim da contagem.
Ou seja, podemos fazer com que a saída permaneça em estado baixo durante X valores de clock quando houver um trigger na entrada.

Modo 2 

O contador criar uma série de pulsos de duração de um clock, e o tempo entre os pulsos de clock é escolhida pelo contador.
Por exemplo, se o contador for 5, durante 4 clocks o pulso será alto (valor lógico 1) e será baixo durante 1 período de clock.
Se G=1, a série de pulsos continua indefinidamente.

Modo 3 

É modo gerador de ondas quadradas no pino de saída (OUT), sempre que G=1.
Se o contador tiver um valor par, metade da contagem será com valor alto e metade com valor baixo.
Se o contador armazenar um valor ímpar, saíra um valor alto durante um clock à mais que o número de clocks que estará no valor baixo.
Por exemplo, se o contagem for de 7, a saída será alta durante 4 clocks e baixa durante 3.

Modo 4

Nesse modo, o 8254 produz um pulso único na saída OUT.
Se escolhermos um valor de contagem X, durante X clocks o pulso será alto e depois será baixo por 1 clock (pulso único).
Ou seja, é um one-shot trigger totalmente flexível e manipulável ao bel prazer do programador Assembly.

Modo 5



Exatamente como o modo 4, mas o pulso é gerado através do pino G e não através de programação.

Interface de Entrada e Saída (I/O) do microprocessador 8086

Se a primeira função de um microprocessador é fazer operações (matemática, computacionais), a segunda função dele é trocar essas informações.
De nada adianta realizar cálculos e operações complexas, numa velocidade incrível, se o resultado destes processos não puder ser enviado para o mundo externo.

E é sobre isso que iremos falar nesse artigo sobre o microprocessador Intel 8086/8088, sobre a interface de entrada e saída (I/O).

Instruções de entrada e saída (I/O Instructions)

A maneira mais comum que temos de controlar a entrada e saída é através das instruções IN e OUT, da linguagem de programação Assembly. Elas servem para transferirmos dados, fazer a comunicação, entre o 8086 e os dispositivos de entrada e saída.

IN, em inglês, é dentro.
Ou seja, usamos a instrução IN para entrada de dados.

OUT, em inglês, é fora.
Portanto, usamos, a instrução OU para a saída de dados.

Essas instruções usam o registro acumulador (AX, que é composto pelo AL e o AH) do microprocessador Intel para transferir dados entre o 8086 e os dispositivos de entrada e saída, onde o endereço de I/O fica armazenado no registrador DX.

Exemplos de instruções Assembly de entrada e saída:
IN AH, p8  -> o registro AL recebe o byte de dados da porta p8
IN AX, DX  -> AX recebe o endereço da porta contido em DX
OUT p8, AH -> o byte sai do registrador AH para a porta p8
OUT DX, AX -> o endereço da porta armazenada em AX vai para a porta endereçada por DX

Sempre que alguma dessas instruções rodam, o 8086 terá informações sobre endereço em sua via de endereços (barramento).
Essas informações de endereços são compostas de 8 bits, ou seja 1 byte, que variam de:
$$A_0 - A_7$$

Como a via do microprocessador Intel 8086 é de 16 bits, o seguintes restantes tem valores lógicos nulos, 0:
$$A_8 - A_{15}$$

Esses 8 bits podem selecionar 256 endereços de periféricos de entrada e saída (como mouse, teclado, monitor etc).

Caso usemos as instruções INS e OUTS, esse endereçamento de dispositivos de entrada e saída I/O é feito usando-se o registro DX:

INSB (byte), INSW (word) e INSD (doubleword)
OUTSB, OUTSW e OUTSD

Ao contrário das instruções IN e OUT, as INS e OUTS não transferem dados entre o acumulador (AX) e os dispositivos de entrada e saída, mas entre a memória e os dispositivos, diretamente.
Na memória o endereço fica armazenado nos registradores ES:DI, cujos ponteiros são automaticamente in/decrementados (depende do registro de flag DF).

Modos de endereçamento dos microprocessadores Intel x86

Nesse artigo de nosso curso sobre os microprocessadores Intel x86 (8086 e 8088), vamos estudar os modos de endereçamento usado nas instruções deste processador, como a MOV, JMP e CALL.

Vamos aprender quais tipos de endereçamentos existem, para que cada um serve, onde são usados, como são feito os mais diferentes tipos e modos de endereçamento, bem como suas relações com as instruções Assembly que alteram o fluxo de funcionamento de um programa escrito nessa linguagem, que é a usada nos microprocessadores da Intel.


Modos de endereçamento do 8086

Por que endereçar?

Para ler uma informação na memória, você precisa do endereço dela, de onde começa até onde vai.
Para escrever, você precisa do endereço de onde está a informação e para onde ela deve ir.
Para apagar um dado, você precisa saber o endereço em que ele está.

Resumindo: é preciso endereçar, para praticamente tudo são necessários endereços, sejam nos registros ou na memória, para dados.

Modos e tipos de endereçamento - A instrução MOV
A instrução mais usada no endereçamento de dados é a MOV.
Sua sintaxe geral é a seguinte:

MOV destino, origem

Ou seja, ela move o que está em 'origem' para 'destino'.
É importante salientar que o que está armazenado em 'origem' permanece intacto, e as informações que estão em 'destino' são as informações que estão em 'origem'.
Ou seja, embora o comando MOV se lembre a palavra mover (ou move, em inglês), o que ela faz na verdade é COPIAR informação de um lugar para outro, e não mover, pois os dados permanecem inalterada na origem.

Por exemplo, para colocar os dados do registro BX no registro AX, usamos a instrução MOV da seguinte maneira:
MOV AX, BX

Tipos de endereçamento

A instrução MOV é muita poderosa e flexível, sendo possível usá-la nos seguintes modos de endereçamento:

  • Endereçamento de registro

Nesse modo ocorre de registro ou memória para outro registro ou memória. Ou seja, os dados saem do registro para outro registro ou para outra memória, bem como podem sair da memória para um registro ou para outro local da memória.

  • Endereçamento imediato

Nesse modo, se transfere da fonte de forma imediata, através de um número constante em hexadecimal.
Por exemplo: MOV AH, 2112H
Ou seja, estamos transferindo diretamente do endereço 2112H para o registro AH (poderia ser para outro local na memória).

  • Endereçamento direto

Move uma informação entre um endereço de memória e um registro.

  • Endereçamento indireto de registro 

Ocorre entre registro e local da memória, onde esta é endereçada por um registro de índice ou registro de base, que são BP, BX(BH e BL), SI e DI. Usado em endereços de segmentos de dado do offset.
Por exemplo: MOV AX, [CX]
[CX] é o endereço de offset do segmento de dados, e em AX temos um endereço de memória.

  • Endereçamento de Base+Índice

Igual ao modo de endereçamento indireto de registro, porém ele também usa o registro de índice (SI ou DI).
Por exemplo: MOV [BX + DI], CH

  • Endereçamento relativo de registro 

Também usa registro de índice ou registro de base, mas com algum deslocamento no endereço.
Por exemplo:
MOV AH,[BH + 2]
MOV AH,VETOR[BL]

  • Endereçamento relativo de Base+Índice

Igual ao caso anterior, mas usando ambos registros (de índice e de base), além do deslocamento.
Por exemplo: MOV AX,[BX + SI + 4]

Sistema de memória dos microprocessadores Intel


Eletrônica Progressiva - Apostilas e Tutorias
Como veremos no decorrer dessa apostila de microprocessador Intel 8086/8088, uma das grandes vantagens desse tipo de hardware reside no fato que a estrutura da família dos Intel e Pentium são bastante similares, inclusive aos computadores pessoais atuais. Isso sem contarmos os clones, microprocessadores de outras empresas que tem funcionamento parecido ou igual aos da Intel, como os da IBM.

Embora o 8088 tenha sido lançado há mais de 30 anos, a estrutura da memória continua a mesma. Obviamente, os processadores atuais suportam memórias de tamanho infinitamente maior, além do aumento da velocidade de leitura e escrita (dentre outros detalhes).
Mas a ideia é a mesma.


Divisão da memória dos microprocessadores

Existem duas regiões na memória que são comum: a área do sistema (System Area) e a área de programas transitórios, mais conhecida como TPA (Transient Program Area). Essas são as duas divisões básicas e existentes em todos os microprocessadores.

Os microprocessadores 8086 e 8088 só possuam essas duas áreas na memória, que somavam 1Mb, que era um absurdo em termos de avanço para a época.
Computadores que tinha esses hardwares, como o XT, tinham 384 Kbytes para o sistema e 384 Kbytes para a TPA.

XT com TPA e Systema Area
Os XT da IBM possuíam TPA e System Area como divisões de memória

Porém, como o boom do crescimento dos microprocessadores já estava enorme, alguns computadores Pentium com microprocessadores 80286 possuíam uma tecnologia de extensão de memória, que era uma região conhecida por XMS (Extended Memory System). Exemplo disso foi o poderoso PS/2 da IBM, que podia conter fascinantes 15 Mbytes de memória adicional!
IBM PS/2 com memória estendida
Esse IBM PS/2 possuía uma região de memória estendida, a XMS

A região de área do sistema (System Area)

Essa região da memória é a responsável pela comunicação com o sistema de vídeo (que tinha sua própria BIOS) através de adaptadores de cores (VGA, por exemplo).

Ainda na System Area, a IBM incluiu em seus computadores pessoais a linguagem de programação BASIC no começo da década de 80.
Nessa área existia um importante interpretador de BASIC da Microsoft, o Cassette BASIC, que não necessitava de sistema operacional para ser acessado pois era separado da BIOS.

Essa região de memória é bem menor que a TPA.


A região TPA

Na TPA (Transient Program Area) era localizado os softwares que comandavam o computador, dentre eles, o mais importante era o sistema operacional, como o PCDOS (Personal Computer Disk Operating System) e o ainda famoso nos dias de hoje MSDOS (Microsoft Disk Operating System).
Mouse de um antigo computador IBM
Mouse do IBM PS/2
Além do essencial SO, a área de programas transientes continha programas que gerenciavam os drivers do microcomputador (como o teclado e mouse), que fazia a comunicação com a BIOS além de fornecer um terminal de comando para contato com o usuário.

Essas eram aplicações essenciais necessárias para o funcionamento de um computador, e ocupavam a menor parte da TPA.
A maior parte era ocupada por programas do usuário, que naquela época não eram muitos, como editores de textos e programas para desenvolvimento (programação).


A história da Computação

Antes de iniciarmos nossos estudos sobre os Microprocessadores 8086/8088, é necessário entendermos a história da computação e a dos microprocessadores, focando na motivação por trás do uso desses hardwares.

Quando se fala em computação, a primeira coisa que nos vem a mente é um monitor, um mouse, um teclado, em um quarto escuro, quando alguém olhando uma chuva de números binários caindo, como efeito Matrix.

Ilusão hacker à parte, especificamente, computação não está ligada com computadores pessoais, e sim a com a Matemática.

Computar, a arte de contar

A história da Computação se confunde com a história da Matemática, pois é, em suma, a história do processo de contagem.
Quando aqueles pastores de ovelhas colocavam uma pedrinha dentro de um saco, a cada vez que uma olha saía para pastar, e tiravam uma pedra do saco quando cada uma voltava, era um método de contagem, conseqüentemente, um método de computação.

Na verdade, podemos ver isso como um algoritmo.
Pois era uma maneira de checar se todas as ovelhas do pastor voltaram (quando não sobrava pedra alguma no saco). Caso sobrasse, alguma havia se perdido na floresta ou iria virar ensopado de alguém.

Um exemplo de computação pré-história são os riscos que os homens das cavernas faziam para enumerar os dias, ou animais ou outra coisa qualquer.
Outro exemplo importante e mais recente foi a invenção dos logaritmos. Uma ideia matemática fantástica que permitia fazer cálculos de expoentes e raízes de uma maneira bem simples e rápida, consultando apenas uma tabela de valores.
Podemos ver, então, esse método do logaritmo como um algoritmo, e a tabela dos logaritmos como um banco de dados.

MicroprocessadoresPorém, o instrumento antigo de contagem mais famoso é, sem dúvidas, o ábaco.
O ábaco é um instrumento totalmente manual, de contagem. Sua ideia é tão simples, ao passo que é poderosa, que ainda é usado em escolas do mundo inteiro como método de aprendizado de crianças, para fazer as famosas ‘continhas’.

Computação Mecânica

Há dois grandes fatores que influenciam na evolução da tecnologia: a preguiça e a curiosidade.
E é difícil distinguir os dois, visto que a curiosidade surge com a vontade de se entender e automatizar as coisas, tentando criar métodos de se fazer algo com o menor esforço possível.

História dos Microprocessadores
Pascaline
Uma grande evolução na arte de contar, foi a máquina Pascaline, também conhecida como calculadora de Pascal, criada pelo Matemático Blaise Pascal, que era uma espécie de ábaco aprimorado, com engrenagens e rodas, que fazia cálculos muito mais complexos e de forma mais automatizada que o ábaco. Pascal é tão importante em Computação que existe uma linguagem de programação dedicada a ele, o Pascal.



Porém, o caso mais fascinante de engenhoca computacional totalmente mecânica, é a máquina criada por Charles Babbage em 1837, a Analytical Engine.

Ela podia operar continuamente, como em um loop de programação, também aceitava dados de entradas (através de cartões furados, que definiam as operações, constantes e variáveis a serem usadas na máquina), além de possuir memória para armazenar 1000 (sim, mil) números de 40 (sim, quarenta) dígitos decimais!
Tutorial de 8086 8088
 Máquina Analítica de Charles Babbage
Cartões furados do Computador Analítico de Charles Babbage
Cartões perfurados de Babbage




















Por ter sido a primeira pessoa a criar um algoritmo para ser rodado na Máquina Analítica de Babbage, muitos consideram a inglesa Ada Lovelace como a primeira programadora da história.
Como verão adiante, as mulheres terão um importante papel na evolução dos computadores.

Os elétrons na Computação

O uso da eletricidade, que quando chegou abalou e transformou completamente o mundo, não poderia ficar de fora da computação, e o uso da energia elétrica foi, e ainda é, amplamente uso nesse ramo.

Inicialmente, a eletricidade foi amplamente usada para automatizar as máquinas mecânicas, como as máquinas perfuradoras de cartões, que perfuravam os cartões usando um motor movido a energia elétrica.

Essa inovação ocorreu no final do século XX, e a empresa pioneira nesse setor foi a International Business Machines Corporation (hoje conhecida como IBM), que passou a comercializar máquinas perfuradoras de cartões, que foram muito utilizada até a chegada das máquinas eletrônico-digitais.

Essas máquinas eletrônicas chegaram, mais especificamente, no começo da década de 40 do século passado, na Alemanha, durante a 2ª Guerra Mundial, e seu primeiro advento foi o computador Z3, que fez cálculos de trajetórias de mísseis.

Apostila de Arduino
Z3

Porém, como muita coisa em época de guerra, há controvérsias, e alguns afirmam que o computador britânico Colossus, usado para quebrar códigos da Alemanha, foi o primeiro dispositivo eletrônico-digital a ser inventado.
Curso de Arduino
O Colossus era operador por duas mulheres


Porém, essas máquinas eram totalmente específicas em suas funções.
Faziam algo que foram programadas para serem feitas, e nada mais.
É aí que entra o ENIAC (Eletronics Numerical Integrator and Calculator), uma máquina de 30 toneladas, com mais de 17 mil tubos à vacuuo e centenas de milhares de quilômetros de fios, que era possível de ser programável para fazer diversas funções.

Essa programação era possível de ser feita reorganizando os fios do ENIAC, o que era extremamente cansativo, demorado e financeiramente inviável.

Apostila de Eletrônica
O pequeno ENIAC, também governado por mulheres

Logo, era necessário algo que fosse facilmente programável. E é aí que entram os microprocessadores na história.

Como usar um cabo USB para gerar voltagem de 5V (volts)

Poucas pessoas sabem, mas o cabo USB possui uma tensão de 5V. E isso não é coincidência ou à toa.



A maioria dos dispositivos eletrônicos e digitais requerem 5V, e como a porta USB tem uma infinidade de usos, essa voltagem foi escolhida para que o maior número de aparelhos possam se conectar a ela sem maiores problemas.

Um exemplo disso são os celulares, que podem ser recarregados pela porta USB, pois eles também necessitam de 5V para recarregarem suas baterias.


  • Consiga um cabo USB e corte a ponta que não é a ponta que conecta no computador

  • Note que verá dois fios: um preto e um vermelho. Pois bem, o preto é o TERRA (COM ou Ground), e o vermelho é o de 5V




  • Conecte os fios no seu protoboard ou dispositivo que queira energizar e terá a voltagem necessária


Memória RAM: O que é, para que serve

Sem dúvidas, a maior característica de memórias do tipo RAM é a sua flexibilidade em permitir que informações sejam alteradas (escritas) e lidas (sem haver destruição - são apenas copiadas) de qualquer bloco de memória, de qualquer tamanho e ordem.


SRAM: static RAM

É um tipo de memória que armazena, de forma constante (até o computador ser desligado), informações.

O principal exemplo de memória do tipo SRAM é algo que já estudamos aqui no Eletrônica Progressiva: os Latches.
Nesse tipo de memória, cada célula pode ser representada por um latch, que armazena 1 ou 0.

Na verdade, as memórias SRAM estão ajustadas de modo semelhante ao tabuleiro de xadrez, mostrado em nosso artigo introdutório sobre memória.

Um exemplo prático, e real, pode ser entendido da seguinte maneira:
Empilhe 8 tabuleiros de xadrez.
Agora, o address bus selecionará uma linha e uma coluna de um tabuleiro e irá pegar os 8 bits (1 bit de cada tabuleiro) ou 1 byte.

Armazenamento e Memória Digital

Já falamos sobre Latches e Flip-Flops, que podem ser usados para reter informações.
Vamos agora, nesse artigo do site Eletrônica Progressiva, explicar sobre os tipos mais importantes de armazenamento de informações: memória RAM, ROM e Discos Rígidos.

O que é a memória

Em Eletrônica/Elétrica/Computação, memória é um elemento que armazena informação.
Como sabemos, o menor elemento de armazenamento é o bit, que armazena 1 ou 0.

A memória nada mais é que um conjunto de células, onde cada um desses pequenos blocos armazena uma informação. Podemos fazer uma analogia de uma memória com o tabuleiro de Xadrez:


É como se em cada casa do tabuleiro, um bit pudesse armazenado.

Note que cada linha, ou cada coluna, possui 8 casas. Logo, cada fila pode armazenar 8 bits ou 1 byte.
Como temos 8 filas (8 linhas ou 8 colunas), nosso bloco de memória tem a capacidade de 64 bits, ou 8 bytes.
Se tivéssemos 10 tabuleiros desses, teríamos a capacidade de armazenas 80 bytes de informação na nossa memória.

Endereços de memória - Data Bus

E assim como no xadrez, cada célula de memória também possui um endereço, para que possamos identificar e manipular cada bloco desses.
As operações que envolvem endereço são, sem dúvidas, umas das mais importantes em termos de eletrônica digital, pois escrever é o ato de colocar determinadas informações na memória e ler é o ato de copiar determinadas informações.

A importância dos endereços advém do fato de existirem um número enorme de informação nas memórias, por isso temos que saber exatamente onde escrever e de onde copiar os bits.

Essas informações percorrem um trecho chamado data busque é o responsável por 'carregar' as informações (bits), seja pra escrever ou ler dados. O data bus é formado por linhas paralelas que carregam, simultaneamente, a informação. Note que, quanto maior o número de linhas (ou seja, quanto mais larga for a banda), mais rápido e eficiente será o processamento.

Além do data bus, existe o address bus, que recebe um conjunto de bits que representam um local na memória, onde vamos atuar. Assim como no data bus, quanto maior o número de linhas, mais capacidade o address bus terá de selecionar endereços de memória.

Por exemplo, se o address bus tiver 4 faixas, onde cada uma recebe um bite de informação, ele poderá acessar 2^4 = 16 endereços, o que é bem pouco. Porém, se tiver 32 bits, poderá acessar mais de 4 bilhões de endereços de memória.


Memória RAM e Memória ROM: o que são, para que servem e qual a diferença entre RAM e ROM

A memória RAM (random-access memory: memória de acesso aleatório), como o próprio nome diz, é aquela em que qualquer endereço de memória pode ser acessado de uma maneira igual (probabilidade iguais), seja para operações de leitura ou escrita. Outra grande característica é ter seus dados perdidos quando o computador é desligado.

A memória ROM (read-only memory: memória somente de leitura), como o próprio nome diz, é um tipo de memória onde seus dados podem ser lidos, mas não podem ser escritos, pois os dados são escritos lá de maneira permanente.

Latches SR (Set e Reset) NAND e NOR

O que são Latches

Latches são dispositivos de armazenamento temporário de 1 bit de informação.
São formados por circuitos com portas lógicas, onde a saída de uma porta é ligada na entrada de outra.
Assim, a saída sempre depende de valores de saídas anteriores. Ou seja, é baseado em estados anteriores.

O termo SR de Latch SR vem de Set e Reset, que são estados que serão explicados em breve.

Existem depois tipos de Latch SR.

1. Latch SR, formado por portas NOR

Fonte: http://en.wikipedia.org/wiki/Latch_(electronics)


2. Latch !SR, formados por portas NAND
Leia !SR como S e R BARRADOS!
Fonte: http://en.wikipedia.org/wiki/Latch_(electronics)
Esse tipo de dado é chamado de estado Baixo (active-LOW), pois a saída é HIGH quando
Vamos explicar o funcionamento de um Latch, usando o da figura acima, iniciando com entradas !S e !R em estado HIGH (ou 1).


Caso 1: Entradas HIGH e saída Q HIGH
!S=1
!R=1
Q=1

Como impomos Q=1, as entradas da porta NAND de baixo serão 1 e 1, então a saída será 0.
Logo, !Q=0

Quando Q=1, dizemos que o Latch está no estado SET.

Note que, quando !S e !R são 1, as saídas Q e !Q permanecem como estavam antes.


Caso 2: Entradas HIGH e LOW
Após setar (estado SET) o Latch, no caso passado, fazemos com que a entrada !R que antes era HIGH, receba um valor LOW por um certo período (tem que haver uma variação).

Isso fará com que a porta NAND de baixo tenha saída 1, e !Q seja HIGH: !Q = 1
Como !Q é entrada na porta NAND de cima, essa porta terá entradas 1 e 1, resultando em saída 0.
Logo Q=0.

Quando a saída é LOW (Q=0), dizemos que o estado do Latch é RESET.

Terminada essa variação, o valor de !R volta a ser HIGH, mas o Latch continua em reset.


Caso 3: Entradas LOW e HIGH
Agora vamos fazer com que !S (que antes era HIGH) receba um pulso e passe a ser LOW, temporariamente.

Essa mudança faz com que a saída da porta NAND de cima seja 1, assim: Q=1
Esse valor 1 é mandado para a porta de baixo, que terá entradas 1 e 1, resultando em saída 0: !Q=0

Como Q=1, o Latch está no estado SET.
Após o pulso, !S volta a ser HIGH.


Caso 4: Entradas LOW e LOW
Vamos agora colocar um valor LOW na entrada !S, após o caso passado.
Isso fará com que a saída da porta NAND de cima seja HIGH, ou seja, Q=1

Com Q=1, as entradas na porta NAND de baixo serão 1 e 0, resultando em saída LOW, ou !Q=1

Porém !Q (Q barrado) deve ser sempre o oposto de Q, mas nesse caso: Q=!Q=1
Dizemos que esse estado é inválido.
Ou seja, entradas LOW e LOW (0 e 0) são uma combinação restrita, ou inválida, no Latch tipo !SR.
Se você jogar valor LOW e LOW nas entradas !S e !R é impossível prever o que vai acontecer, pois isso força que as saídas Q e !Q sejam 1, ao mesmo tempo, como se houvesse uma disputa. E ficará 1 o sinal que chegar antes.

Transformada de Fourier de tempo contínuo - Representando sinais aperiódicos

Vimos, até o presente momento, sobre os sinais peridódicos, como os sinais trigonométricos e suas representações usando exponenciais complexas.
A importância deles dispensa comentários. Porém, não são os únicos.

Periodicidade nos remete a 'perfeição', é algo mais teórico. Na natureza mesmo, a maioria dos sinais são aperiódicos. E como tais, devem ser estudados e analisados.

Esta seção, sobre A Transformada de Fourier, visa fazer isso: manusear matemáticamente os sinais para obter uma série de propriedades e resultados desejados.



- Introdução e definição

Para representar os sinais periódicos, usamos exponenciais complexas harmonicamente relacionadas, através de uma combinação linear dessas frequências.
Nos sinais aperiódicos, que veremos agora, a idéia é semelhante, porém os harmônicos estão infinitesalmente próximos, e a soma (combinação linear) se torna uma integral.

A Transformada de Fourier nos mostra, portanto, esse espectro de harmônicos, enquanto a Transformada inversa de Fourier nos diz os coeficientes do sinal, em forma de combinação linear das exponenciais.

A série de Fourier: Sinais Periódicos de Tempo Discreto

Vamos ver agora como se comporta a representação dos sinais periódicos que são discretos, quando o representamos na série de Fourier, suas principais características e as diferenças e semelhanças em relação aos sinais de tempo contínuo.

Definição da série de Fourier para sinais de tempo discreto e periódicos

Analogamente ao sinal contínuo, o sinal periódico de tempo discreto S[n] é aquele tal que:
$$S[n] = S[n + N] $$

Quando N é um inteiro positivo e é o menor valor que satisfaz a equação acima, dizemos que N é o período de S[n] ou número de amostra, e a frequência fundamental do sinal é dada por:
$$\omega_0 = \frac{2\pi}{N} $$

Logo, podemos representar toda a gama de sinais que são periódicos de período N e que tem frequências dada por: 
$$\omega_k = \frac{2k\pi}{N} $$

Fazendo uma análise matemática dessa expressão é possível notar que os valores da frequência vão se repetir. Na verdade, só temos N valores distintos de frequência possíveis, devido ao fato do período ser sempre um inteiro.

Um fato importante, em relação aos sinais de tempo contínuo, é que o sinais de tempo discreto são representados por uma série finita, pois só existem um número finito de frequências.

Fazendo a manipulação algébrica através do somatório de todos os sinais harmônicos, chegamos a série de Fourier para sinais periódicos de tempo discreto:
$$ S[n] = \sum_{k=\left \langle N \right \rangle} a_k e^{jkw_0N}$$
$$ a_k = \frac{1}{N} \sum_{n=\left \langle N \right \rangle}x[n] e^{-jkw_0n} $$

Ou seja, aqui, temos que escolher um intervalo qualquer de N valores consecutivos para representarmos um sinal sob a forma de série de Fourier e para descobrir os coeficientes da série.

Propriedades da série de Fourier em sinais de tempo contínuo

Mostraremos aqui algumas propriedades que podem, e devem ser usadas, nas séries de Fourier onde o tempo é contínuo, pois evitam trabalho e cálculos desnecessários, visto que podemos simplificar e fazer algumas deduções.

Propriedade da Linearidade

Sejam:
$$A(x)$$ e $$B(x)$$
dois sinais periódicos de tempo $$T$$, cujos coeficientes da série de Fourier são
$$a_n$$ e $$b_n$$ .

Se o sinal:
$$C(x)$$
é dador por uma combinação linear dos sinais A(x) e B(x):
$$C(x) = k_1 A(x) + k_2 B(x) $$ , onde $$k_1$$ e $$k_2$$ são constantes
, os coeficientes da série de Fourier também o serão.

Isso quer dizer que, sejam:
$$c_n$$
os coeficientes da série de Fourier do sinal de C(x), eles podem ser representados por:

$$c_n = k_1 a_n + k_2 b_n $$

Propriedade da reflexividade do tempo

Refletir o tempo é fazer com que o tempo 't' receba os valores '-t'. É como se rebatéssemos o gráfico em relação ao eixo y.

Sabemos que a definição da série de Fourier é dada por:
$$ x(t) = \sum_{n=-\infty}^{n=+\infty}a_n e^{i \,n \omega_0 \, t}$$

Vamos ver o que acontece com o sinal quando ocorre a reflexão no tempo:
$$ x(-t) = \sum_{n=-\infty}^{n=+\infty}a_n e^{-i \,n \omega_0 \, t}$$

Vamos chamar esse novo sinal, x(-t), de y(t) e '-n'  de 'k', para que y(t) fique na forma da série de Fourier:
$$ y(t)= \sum_{k=-\infty}^{k=+\infty}a_{-k} e^{i \,k \omega_0 \, t}$$

Ou seja, quando refletimos o tempo refletimos também os índices.

Assim, se o sinal S(x) possui índices $$a_n$$
O sinal S(-x) terá índices $$a_{-n}$$

Isso é interessante. Mas importante mesmo é a relação com a paridade.
Se o sinal for par, ou seja:
$$ x(t) = x(-t) $$
$$ a_n = a_{-n}$$
Os coeficientes da série de Fourier também serão pares!

E caso o sinal seja ímpar:
$$ x(t) = -x(-t) $$
$$ a_n = -a_{-n}$$
Os coeficientes da série de Fourier também serão ímpares!

E qual a utilidade disto?
Ora, se souber $$a_n$$ , saberá $$a_{-n}$$ e não terá que fazer cálculos desses índices separados, à toa.
Portanto, antes de calcular os índices da série de Fourier para tempo contínuo, verifique a propriedade de reflexão no tempo. Assim, saberá a paridade dos coeficientes da série .

Deslocamento de tempo

Seja A(t) um sinal dado em função do tempo.
Deslocar o sinal em um valor de tempo $$t_0$$ significa analisar o seguinte sinal resultante:
$$A(t - t_0)$$

Se os coeficientes da série de Fourier do sinal A(t) são dados por:
$$ a_n = \frac{1}{T} \int_T A(t) e^{-i \,n \omega_0 \, t} dt$$

Então os coeficientes da série do sinal $$A(t - t_0)$$ serão dados por:
$$ a'_n = \frac{1}{T} \int_T A(t - t_0) e^{-i \,n \omega_0 \, t} dt$$

Como é possível notar pela fórmula acima, embora tenhamos deslocado o sinal, seu período continua sendo T.
O que faz sentido. Veja 'deslocamento' como um deslocamento físico mesmo. É como se você pegasse o sinal da função e simplesmente colocasse ele em outro local do plano cartesiano.
Vendo assim, é fácil ver a razão do período continuar sendo o mesmo.

Fazendo a substituição:
$$y = t - t_0$$

Isolando 't' e integrando em relação à y, chegamos a :
$$ a'_n = e^{-i \,n \omega_0 \, t_0} a_n$$

Ou seja, quando deslocamos um sinal de um tempo $$t_0$$
Estamos alterando seus coeficientes de um fator: $$e^{-i \,n \omega_0 \, t_0}$$
Note, porém, que esse fato tem módulo unitário.

Logo, deslocar um sinal no tempo não irá alterar o módulo dos coeficientes da série de Fourier.

Propriedade da série de Fourier: alterando a escala do tempo do sinal em um fator

Seja o sinal A(t) e um número positivo real k que será o fator.
Segundo a definição de série de Fourier, podemos expressar a série na forma:
$$ A(t) = \sum_{n=-\infty}^{n=+\infty}a_n e^{i \,n \omega_0 \, t}$$

Ao alterarmos a escala do tempo em um fator kA(kt) , também alteramos seu período, que agora é: 
$$\frac{T}{k}$$

Como a frequência fundamental é dada por:
$$ w_0 = \frac{2\pi}{T}$$

A nova frequência será:
$$w = \frac{2\pi}{\frac{T}{k}} = k w_0$$

Então, o novo sinal da série de Fourier será dado por:
$$ A(kt) = \sum_{n=-\infty}^{n=+\infty}a_n e^{i \,n k\omega_0 \, t}$$

Ou seja, os coeficientes $$a_n$$ permanecem inalterados. Porém a frequência do sinal mudou.

Aplicando o conjugado complexo

Segundo a definição de série de Fourier, podemos expressar a série na forma:
$$ A(t) = \sum_{n=-\infty}^{n=+\infty}a_n e^{i \,n \omega_0 \, t}$$

Aplicando o conjugado em ambos lados:
$$ A^{*}(t) = \sum_{n=-\infty}^{n=+\infty}a_n^* e^{-i \,n \omega_0 \, t}$$

Fazendo:
$$k=-n$$

Temos:
$$ A^{*}(t) = \sum_{k=-\infty}^{k=+\infty}a_{-k}^* e^{i \,k \omega_0 \, t}$$

Logo, quando aplicamos o conjugado em uma série de Fourier, estamos aplicando o complexo conjugado em seus coeficientes e estamos também aplicando a propriedade da reflexão.

Caso o sinal seja real:
$$A(t) = A^*(t)$$
Então:
$$a_n=a^*_{-n}$$
$$a^*_n = a_{-n}$$
Chamamos essa última relação de simetria conjugada.


Com base nisso e na propriedade da reflexividade, é fácil mostrar que:

Caso o sinal seja real e par, os coeficientes da série de Fourier são reais e pares:
simetria conjugada: $$a^*_n = a_{-n}$$
reflexividade do sinal par: $$ a_n = a_{-n} $$
Logo, os coeficientes são reais: $$a_n = a^*_n $$



Caso o sinal seja real e ímpar, os coeficientes da série de Fourier são ímpares e imaginários:
simetria conjugada: $$a^*_n = a_{-n}$$
reflexividade do sinal ímpar: $$ a_n = - a_{-n} $$
Logo, os coeficientes são puramente imaginários: $$a_n = - a^*_n $$


Note também que, em qualquer dos casos, o módulo do coeficientes da série de Fourier permanecem inalterados quando aplicamos a propriedade da simetria conjugada.

Produto de Sinais

Sejam dois sinais de tempo contínuo, de mesmo período T: $$A(t)$$ e $$B(t)$$
com coeficientes da série de Fourier dados, respectivamente, por: $$a_n$$ e $$b_n$$

O n-ésimo coeficiente do produto: $$A(t) . B(t) $$ , que também possui período T, é dado por:
$$c_n = \sum_{k=-\infty}^{k=\infty} a_k . b_{n -k} $$

Essa relação não só parece como pode ser vista como uma soma de convolução discreta dos coeficientes das sequências de Fourier que representam sinais.
Outra forma de obter essa relação é simplesmente multiplicando as representações dos sinais A(t) e B(t) sob a forma de série de Fourier e rearranjando e agrupando seus termos.


A relação de Parseval

A relação de Parseval é famosa, e muito útil, porque relaciona diretamente o sinal com seus coeficientes e é obtida através do cálculo da potência média de um intervalo de período do sinal, resultando na expressão de Parseval:
$$ \frac{1}{T} \int_T \left\vert A(t) \right\vert^2 dt = \sum_{n=-\infty}^{n=\infty} \left\vert a_n \right\vert^2$$

Onde A(t) é o sinal de tempo contínuo de período T, de coeficientes da série de Fourier $$a_n$$.
Um detalhe importante e que torna a equação de Parseval bem abrangente é o fato que ela é válida para qualquer sinal periódico, visto que expressão foi obtida pelo cálculo da potência média de um sinal periódico qualquer.

Condições de Dirichlet | Séries de Fourier

Nem toda função periódica pode ser representada pela série de Fourier.
O rigor matemático impõe algumas condições e critérios para que possamos usar a tão famosa e útil série, e nem mesmo o próprio Fourier foi capaz de desenvolver as condições em que as séries eram válidas.

Houveram muitas discussões, principalmente envolvendo a questão das descontinuidades.
Mas coube ao matemático alemão Dirichlet a formalização das condições:



Primeira condição:
"O sinal deve ser absolutamente integrável". 

Isto é, se o sinal é s(t):
Então a integral
$$\int_T |s(t)| dt $$
deve existir.

Se tal integral, que representa o sinal, deve existir, é fácil concluir que os coeficientes que representam a série de Fourier também devem.
Trocando em miúdos: tanto a integral como os coeficientes não tendem ao infinito.

Segunda condição:
Em um intervalo qualquer sinal, não deve existir infinitos pontos de máximo e mínimo.

Por exemplo, funções trigonométricas do tipo:
$$ \sin{(k/t)} $$
Para k inteiro, no intervalo t de ente 0 e 1. Pois nesse intervalo a função varia entre infinitos valores de máximo e mínimo e não há como representar tal função usando os coeficientes da série de Fourier.
Veja como a função se comporta quando se aproxima de 0, para:
$$ f(t) = \sin{(\pi/t)} $$

Veja como se faz no Wolfram Alpha: www.wolframalpha.com/input/?i=sin(pi/t),+from+t=0+to+1


Terceira Condição:
"Em um intervalo finito qualquer do sinal, não devem existir infinitas descontinuidades."

Funções desse tipo não são 'normais' na natureza. São, geralmente, casos de estudo teórico e é intuitivo entender o motivo de função com infinitas descontinuações (ou seja, saltos no gráfico, sem motivos aparente) não serem possíveis de serem representadas pela série de Fourier.
Embora seja possível utilizar a série de Fourier em sinais com número finito de descontinuidade, não é possível em sinais mais 'aleatórios', com infinitos casos de singularidades.
Essa incerteza no cálculo de descontinuidades infinitas se deve ao fato de que a equação da série de Fourier tende para a média dos valores na borda da descontinuidade, não sendo possível garantir tal convergência em casos de infinitas descontinuidades.


Definindo série de Fourier: Sinais Periódicos de Tempo Contínuo | Séries de Fourier

Nesse artigo definimos a série de Fourier e o motivo dela ser usada para representar sinais periódicos de tempo contínuo. Além de mostrar sua utilidade e onde é empregada.

Relembrando do 2o grau, o período de uma função é o menor número positivo T tal que:
x(t) = x(t + T)

Já a frequência associada a um tempo $$ t $$ é dada por:
$$ \omega = 2 \pi /t $$

Vamos usar o exemplo mais simples de equação exponencial periódica:
$$ x(t) = e^{i \omega_0 t} $$

Esse $$\omega_0$$ significa frequência fundamental. É a frequência associada ao período $$ T $$ :
$$ \omega = 2 \pi /T $$

Agora analisemos o sinal:  (*)
$$ s(t) = e^{i \,n \omega_0 \, t} , para n = 0, \pm 1 , \pm 2, \pm 3 ... $$

Vamos pegar a parte exponencial e ver melhor:
$$ e^{i \,n \, \omega_0 t} =  e^{i \,n 2 \pi /T \, t} =  e^{i \, 2 \pi /(T/n) \, t} $$

Note que nesse sinal, para cada valor de $$ n $$, o sinal vai ter uma frequência múltipla de $$ \omega_0 $$ .
Ou seja, são todos possuem período $$ T $$ também, pois os sinais terão período dado por $$ (T/n) $$ , e $$ T $$ é múltiplo de $$ (T/n) $$ .
A esse conjunto de sinais, definido pela equação (*), dizemos que são um conjunto harmonicamente relacionado, e usaremos bastante em nosso estudo de séries de Fourier.

Nesse conjunto de equações, que formam o sinal, para:

$$ n = \pm 1 $$, dizemos se tratar do primeiro harmônico ou fundamentais
$$ n = \pm 2 $$, dizemos se tratar do segundo harmônico.
e assim sucessivamente.

Sabendo de período, harmônico e conjunto de equações harmonicamente relacionadas, podemos apresentar a tão famosa série de Fourier.

A série de Fourier


Definimos como série de Fourier uma combinação linear desse conjunto de equações harmonicamente relacionadas, e representaremos da forma:

$$ x(t) = \sum_{n=-\infty}^{n=+\infty}a_n e^{i \,n \omega_0 \, t}$$

Ou seja, qualquer função periódica (como as trigonométricas) pode ser representada dessa forma.

Podemos dizer então, que uma função, como seno e cosseno, é uma combinação linear de exponenciais.
A genialidade por trás da série é que ela nos permite ver algumas funções e sinais, como de uma tangente por exemplo, de uma maneira diferente: através de exponenciais, e estas permitem um algebrismo mais fácil além de outras características que serão detalhadas em breve.

Por hora, precisamos focar em outro detalhe: descobrir os índices $$ a_n $$ , que são chamados de coeficientes da série de Fourier.

Para isso, multiplicaremos ambos os lados por $$ e^{-j k \omega_0 t} $$ e integrando ambos os lados no intervalo de um período.
Para resolver a integral, basta transformar a exponencial para a forma trigonométrica e integrar, que teremos o par de equações que define a serie de Fourier:

$$\begin{cases}
x(t) = \sum_{n=-\infty}^{n=+\infty}a_n e^{i \,n \omega_0 \, t} \\

a_n = \frac{1}{T} \int_T x(t) e^{-i \,n \omega_0 \, t} dt
\end{cases} $$

O coeficiente $$a_0$$ tem um valor especial, constante, dado por:
$$ a_0 = \frac{1}{T} \int_T x(t) dt  $$

e é chamado de nível dc e $$a_0$$ é o valor médio de x(t).

A série de Fourier não é apenas mais uma representação do sinal periódico. Se ela é tão famosa e usada,  devem existir razões, além da facilidade do algebrismo e análise gráfico do sinais.
É fácil encontrar na literatura, como no Oppenheim, a demonstração que os coeficiente da série de Fourier em uma combinação linear finita são os que minimizam o erro.

O que isso quer dizer?
Obviamente que não vamos representar um sinal com infinitos coeficientes (se existirem, muitas vezes boa parte deles são nulos). Então é comum representar o sinal usando somente alguns coeficientes.
O que é possível demonstrar é que, quanto mais coeficientes da série de Fourier nós utilizarmos, mais perfeita e mais próxima nossa representação é do sinal real.

- Exemplos

Vamos representar o sinal função: $$ f(x) = x $$
Em intervalos de valor $$2 \pi $$ :


A medida que formos adicionando mais coeficientes da série de Fourier, mais nosso sinal (em vermelho) irá se aproximar da função real, veja:




O site do MIT fez um aplicativo em Java que mostra esse efeito:
http://ocw.mit.edu/ans7870/18/18.06/javademo/FourierSeries/
Você coloca a equação e escolhe o número de termos da série de Fourier que desejar, e vai ver a aproximação desenhada em cima da função real.

Autovalor e Autofunção de um sistema | Séries de Fourier

Vamos mostrar a importância dos números complexos em sistemas invariantes no tempo (LIT).


Usaremos a notação:

$$e^{s t}$$, para sinais de tempo contínuo
$$z^n$$, para sinais de tempo discreto
onde s e z são números complexos.
Em vez de falar o porque do uso de exponenciais em sistemas do tipo LIT, vamos mostrar o que ocorre quando um desses não números são entrada.
Seja x(t)= $$e^{s t}$$ a entrada e h(t) a resposta ao impulso de tal sistama LIT.
Da convolução, sabemos:

$$ y(t) = \int_{-\infty}^{+\infty}h(\rho) x(t-\rho)\,d\rho $$

Fazendo as substituições com os nossos dados:

$$ y(t) = \int_{-\infty}^{+\infty}h(\rho) e^{s(t - \rho)} d\rho $$

$$ y(t) = \int_{-\infty}^{+\infty}h(\rho) e^{st} e^{s\rho} d\rho $$

$$ y(t) =  e^{st}  \int_{-\infty}^{+\infty}h(\rho) e^{-s\rho} d\rho $$

Vamos definifir a função:
$$A(s)= \int_{-\infty}^{+\infty}h(\rho) e^{-s\rho} d\rho $$

Do cálculo integral, por h(t) ser uma resposta ao impulso e que o módulo função exponencial é um número real, a integral converge.
Assim, a função A(s) existe, e é uma constante complexa que depende de s.

Podemos escrever a saída da seguinte formato:
$$ y(t) = A(s) e^{s t} $$

Aqui chegamos em uma importante conclusão, apenas olhando para a equação anterior:
A resposta do sistema para uma entrada exponencial $$ e^{s t} $$, é essa mesma entrada mudada de um fator A(s). Ou seja, ocorre uma mudança de amplitude.

De outra forma: quando a entrada é uma exponencial, a saída é a mesma exponencial multiplicada por um fator, A(s).
Notou a importância dos complexos como entrada de sistemas invariantes no tempo (LIT)?

A(s) é chamado de autovalor e o sinal é uma autofunção do sistema.
Conclusão importante: exponenciais complexas são autofunções de sistemas do tipo LIT.

Analogamente, para o caso discreto:
$$ x[n] = z^n $$

Definição de convolução:
$$ y[n] = \sum_{k=-\infty}^{k=+\infty}h[k] x[n - k] $$

Substituindo os valores:
$$ y[n] = \sum_{k=-\infty}^{k=+\infty}h[k] z^{n - k} $$

$$ y[n] = \sum_{k=-\infty}^{k=+\infty}h[k] z^{n - k} $$

$$ y[n] = \sum_{k=-\infty}^{k=+\infty}h[k] z^n z^{ - k} $$

$$ y[n] = z^n \sum_{k=-\infty}^{k=+\infty}h[k] z^{-k} $$

Autovalor no caso discreto:
$$ A[z] = \sum_{k=-\infty}^{k=+\infty}h[k] z^{-k} $$

Microprocessador 8086/8088, parte 3: Arquitetura de Via

Na época, os computadores mais famosos eram os da via S-100, que possuíam a placa mãe que continha a via. Nela, havia diversos conectores, que cruzavam e ligavam as linhas de sinal (trilhas) da via. Então, as placas de via do S-100 eram encaixadas nestes conectores. Placas que possuíam as mais diversas funções, como a de memória, a unidade central de processamento - CPU -, controladores de dispositivos (monitores, entradas pra disquete, teclado) e as interfaces lógicas de E/S.








A via principal desses computadores eram divididas em subvias: de alimentação, de controle, de endereço e de dados:


Subvia de Alimentação

Leva a corrente aos diversos componentes do computador. O CPU 8080, por exemplo, exigia três tensões de alimentação diferentes adicionalmente à linha de retorno(terra).


Subvia de Controle

Ela que leva e traz informação dentro da via, como os comandos, direcionamento de dados, sinais de ocupado, interrupções e sinal do relógio (temporização).


Subvia de Endereço

Essa via leva sinais de controle, sinais de seleção que são necessários para diferenciar os diversos dispositivos, desde os de E/S como as células de memória do computador. Por exemplo, para mover uma determinada informação de uma célula pra outra: o endereço da primeira célula é colocado na via de endereço ; os dados são movidos da primeira célula ; o endereço da segunda célula de memória é colocado na via de endereço; os dados são movidos da via de dados até a segunda célula. O endereço é transmitido em código binário, onde cada condutor carrega um sinal que corresponde a um dígito binário, onde voltagem elevada indica 1 binário e voltagem reduzida indica 0 binário. Porém, devido as perdas e imperfeições, se trabalha com faixas de voltagem. Os antigos 8 bits tinham 16 linhas, portanto podiam representar 2^16 = 65536 endereços diferentes. Porém, com o barateamento das células, era comum ter mais de 100.000 células de memória, necessitando de mais vias. Então a IEEE propôs o padrão para a via de S-100 em 24 linhas de sinalização de endereço. Assim, se tornou possível quase 17 milhões de endereçamento.


Subvia de Dados

Leva a informação propriamente dita.
No 8088, por exemplo, a via de dados tinha 8 trilhas, logo era possível levar unidades de dados com cada uma consistindo de 8 dígitos binários. Apenas uma unidade de dados era levado ao mesmo tempo nesta via.

Microprocessador 8086/8088, parte 2 : Perspectivas

    O grande salto na evolução foi o fato destes microprocessadores tratarem informações em múltiplos de 16 bits, ao invés de 8 bits. Antes, 255 era o maior número representado com 8 bits. Com os de 16 bits, esse número aumentou para 65535, o que aumentou a precisão na forma de representação dos números.

O 8086/8088 continua a usar o conjunto de instrução com orientação de bytes. Ou seja, uma instrução em linguagem de máquina para o 8086/8088 utiliza de 1 a 6 bytes de memória. Além disso, o processador pega as instruções com razão de 2 bytes por vez.

Para que ocorresse essa evolução toda, foi necessário um novo processo de manufatura de silício, denominado HMOS, implementado no 8086, que permitiu a colocação de um maior número de transistores, cerca de 70mil. Com este número de transistores, foi possível a inclusão de instruções de multiplicação e divisão direto na pastilha(onde ficam os transistores) e de uma sofisticada estrutura de interrupção.

O aumento na memória também foi significativo, pois antes a memória chegava ao ápice de 64000 bytes. Com 16 bytes era possível ter milhões de bytes, para ler e escrever, o que permitiu a criação de programas mais sofisticados, inclusive sistemas operacionais completos que podiam lidar com essa nova geração de softs.

A grande mudança porém, foi o fato de possuírem pastilhas para funções específicas, como as usadas para lidar com ponto flutuante e funções trigonométricas, quem era opcionais. Ou seja, para E/S, não era necessário a utilização do processador. Essa subdivisão de tarefas veio a se tornar mais comum com o tempo, em todo o ramo tecnológico, em contrapartida aos microprocessadores anteriores, que faziam sozinhos todos os cálculos do sistema.   

Esses processos 'extras' eram feitos no co-processador, que são microprocessadores dedicados, voltados para finalidades específicas. Um exemplo da época, é a pastilha matemática 8087, da Intel, que possui sua própria linguagem de programação.

Essas novas pastilhas de 16 bits permitiam que os programas se movimentassem facilmente pela memória, permitindo que os programas se reconfigurassem no ato da execução, sendo possível a realocação de programas e a utilização de programas de diferentes fornecedores. Eram os primórdios da portabilidade.

As unidades de 16 bits também iniciaram o que hoje chamamos de 'Tratamento de erros', ou seja, quando encontrava alguma instrução absurda, como divisão por zero, o processo era interrompido, uma mensagem enviada ao console e o controle retornava pro usuário.

Por conta desse grande potencial para a época, o sucesso do 8086 foi enorme na utilização de computadores para objetivos pessoais, como: automóveis, fliperamas, lava-louças, rádio, secretárias eletrônicas, máquinas de escrever e a comunicação por som. Além do cunho pessoal, o setor de serviços ganhou muito com os microprocessadores de 16 bits. As aeronaves, por exemplo, se tornaram mais automatizadas, seguras e passaram a ter rotas e dados de vôo muito mais precisos.

E em 1981, um marco na história de todos, na sua também, que está lendo isso através de um computador: a IBM lança seu primeiro computador pessoal, utilizando o 8086. Ele rodava os programas feitos em 8 bits e também foi usado o 8088, que diferenciava-se do 8086 por usar externamente uma via de dados de 8 bits, o que facilitou o uso das comuns e baratas pastilhas de de memória e de E/S de 8 bits, o que deixa o 8088 compatível com várias vias de 8 bits existentes. Porém, internamente, ele é igual ao 8086.


- Visão preliminar do 8086/8088

    O 6 de 8086 se refere a 16bits, e o 8 do 8088 se refere a 8 bits. Ou seja, se referem à    largura da via de dados do hardware. No demais, incluindo o tamanho de dados e instrução, é tudo igual.   

Ambos usam o conceito 'fila de instrução', que é uma parte da pastilha que armazena bytes de uma instrução. Assim, quando o processo anterior terminar, não será necessário pegar muitos bytes de memória, pois toda a instrução já se encontra na fila. Isso faz com que as vias de dados e endereço não estejam sob uso excessivo (comum nos dispositivos de 8 bits, que estão sempre acessando a memória).     A fila do 8086 tem 6 bytes de largura, ao passo que a do 8088 possui apenas 4 bytes, o que evidencia a eficiência do 8086, pois com uma maior largura de banda da via, o número de operações num mesmo intervalo de tempo aumenta, liberando a via para que outros dispositivos possam usá-la.

O 8086 também possui novos registradores. Os registradores do 8080 (HL, BC e DE) são agora BX, CX e DX, que podem ser tratados como pares de registradores de 8 bits como também registradores de 16 bits em relação às operações de 16 bits. O acumulador do 8080, registrador A, tem agora 16 bits e é agora denominado AX, mas ainda pode ser usado como acumulador de 8 bits na parte inferior. Há novos registradores de 16 bits no 8086, os registradores de segmento, CS, DS, SS e ES. Existem ainda o apontador de pilha, o apontador de base e dois registradores de indexação, o de fonte e o de destino.



Para mais detalhes de um Simulador de Microprocessador 8086:


    Não podemos deixar de cita os co-processadores 8087, que fornece operações em ponto flutuante mais rápidas para o 8086 e o 8089, que é o Processador de E/S, que torna mais eficiente a movimentação do bloco de dados.

- Software do 8086

    Com a chegada do 8086/8088, a preocupação maior foi converter os programas do antigo 8080 para este novo e também que, na época, já existiam diversos sistemas operacionais para os computadores de 16 bits e, assim como ainda hoje, existiam diversos problemas de compatibilidade entre os SO. Os sistemas operacionais mais comuns da época eram o CP/M, OASIS, ISIS-II e o UNIX). Mas naquela época a coisa era mais restrita. Uma vez escolhido o SO, já estava escolhida a faixa de programas que você poderia usar.


Booting do CP/M


    Um SO que foi criado para o 8086 foi o MS-DOS, da Microsoft, que foi escrito em C e podia ser compilado para funcionar no Z8000 e no 68000, ou seja, em quase todos os 16 bits lançados. Como foi parcialmente modelado do CP/M-80 (8080), os programas de 8 bits que funcionaram no CP/M eram traduzidos para a codificação do 8086 e rodavam no MS-DOS.

Porém, a característica mais marcante no MS-DOS foram os gráficos, que eram independentes do do dispositivo. Assim, os programadores poderiam escrever gráficos sem ter que se preocupar com um computador específico em mente, pois o MS-DOS usava o protocolo de apresentação PLP. Assim, os projetistas de hardware faziam um display que interpretava comandos do PLP, e os programadores simplesmente usavam PLP em seus softwares. A Apple já possuía excelentes possibilidades gráficas, mas extremamente ligadas ao seu hardware. A IBM também passou a usar uma versão do MS-DOS.     Em pouco tempo o MS-DOS tomou o lugar do CP/M-86 e se tornou o SO mais popular para computadores 16 bits.


Booting do MS-DOS