int clock = 200; // milissegundos
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, LOW);
delay(clock);
digitalWrite(LED_BUILTIN, HIGH);
delay(clock);
}
/*
CPU de 1 bit feita com relés
(by Dante Meira)
"O que eu não posso criar, eu não entendo"
(Richard Feynman)
Esta CPU é construída com relés. O Arduino Nano
serve apenas como clock do sistema, sendo
a frequência regulada pelo cógido acima. Nem mesmo
a alimentação elétrica do circuito vem do Arduino,
e sim do símbolo VCC um pouco abaixo do LED que
indica o clock.
Arquitetura de 1 bit, conjunto de instruções
com dois opcodes, 0 e 1. Memória de dois
endereços de 1 bit cada, os quais podem ser
"programados" utilizando os botões SET e
RESET do circuito de latch de cada um. Isso
cria a possibilidade de 4 "programas" diferentes.
A CPU possui um CIR (CURRENT INSTRUCTION
REGISTER) de 1 bit, um MAR (MEMORY ADDRESS
REGISTER) de 1 bit, e um INSTRUCTION POINTER
(Program Counter) de 1 bit, os três constituídos
de um flip flop cada um.
Entre o MAR e o Instruction Pointer há um
somador do tipo half adder para incrementar
o Instruction Pointer a partir do valor do
MAR. Se o valor do Instruction Pointer já
for 1, o valor máximo, ele recebe 0, criando
um loop infinito. O half adder é feito de uma
única porta XOR construída com dois relés.
A modificação do valor do MAR para o valor que
está no Instruction Pointer só ocorre quando o
clock está alto. Já a modificação do valor do
Instruction Pointer para o valor do MAR incremen-
tado pelo half adder só ocorre quando o clock
está baixo (efeito obtido com um inversor lógico
do sinal do clock).
O valor armanezado no MAR determina se o CIR
recebe o valor armazenado no endereço 0 ou no
endereço 1 da memória.
Para permitir uma melhor visualização das
diferenças entre as duas instruções possíveis
foi colocado um "display" formado por 12 LEDs
RGB. O circuito decodificador das instruções, que
neste caso é constituído de apenas um único
relé, faz com que os LEDS brilhem na cor amarela
quando a instrução no CIR é 0 e brilharem na cor
azul quando a instrução no CIR é 1. Desta forma,
"programando" os dois endereços de memória é
possível criar o efeito dos LEDs alternarem entre
azul e amarelo, permancerem sempre no amarelo ou
permanecerem sempre no azul.
00 = sempre no amarelo
01 e 10 = alternando entre azul e amarelo,
11 = sempre no azul
*/