terça-feira, 13 de outubro de 2009

Stallman e o hardware livre

Hoje em dia, é difícil achar quem trabalhe com computação e não saiba quem é o Richard Stallman. A primeira vez que vi o nome dele foi lendo os sources do bison, e não demorou muito pra descobrir que ele era o cabeça por trás de vários softwares que eu usava, como o gcc e o emacs. E não apenas isso, ele também foi o criador do conceito de software livre e do projeto GNU.

Mas mesmo com todo o seu talento, o Stallman não escapa de ser uma espécie de Michael Jackson da computação. Embora seja inegável que ele é um gênio que influenciou toda uma indústria, também não há como negar que ele não é exatamente um modelo de conduta. Na verdade, conta-se que pessoalmente ele é bastante desagradável, e sua higiene pessoal é de deixar o Cascão com inveja.


Além disso, de vez em quando o Stallman também vacila. Por exemplo, em 1999 perguntaram pra ele se algum dia seria possível ter hardware livre, assim como havia o software livre. Ele respondeu com um artigo sobre o assunto, sendo que em um dado ponto ele escreve que "você não pode baixar hardware pela net, e nós não temos copiadores automáticos para hardware (talvez quando tivermos nanotecnologia)".

O vacilo do Stallman é que você não precisa de nanotecnologia, desde 1985 já existe uma tecnologia que permite o surgimento do hardware livre: a FPGA.

A FPGA é um chip reprogramável. Ela sai da fábrica vazia, mas você pode reprogramá-la pra virar, por exemplo, uma CPU. Se você mudar de idéia, pode reprogramá-la mais uma vez, e ela vira uma memória. Ou um processador de vídeo, ou um controlador de rede, o que der na telha!

Pra entender como isso é possível, vamos voltar lá pra linha de produção. Chips são feitos em um substrato de silício apelidado de bolacha. O mapa com os circuitos que compõem o chip é impresso sobre a bolacha com um processo químico parecido com a revelação de filmes fotográficos. A parte importante é notar que esse processo é uma espécie de carimbo: você faz centenas de cópias iguais do circuito sobre a bolacha, e, depois de carimbado, não dá mais pra mudar o que foi impresso.


Bolacha (wafer)

Mas se o circuito é carimbado e não pode ser mudado, como podemos reprogramar o hardware? Há pelo menos duas maneiras de fazer isso. Para exemplificar, vamos imaginar que queremos implementar uma função booleana qualquer, como a função abaixo:


S = ((not A and B) or (A and not B)) and C

Esse é um circuito combinatório simples, então podemos levantar a tabela da verdade dele:


Agora fica clara qual é a sacada, basta interpretar esse circuito como se fosse uma memória! No caso, a tripla ABC é como se fosse um bus de endereçamento para oito posições de memória, onde cada palavra tem um único bit: a saída S. Memórias reprogramáveis nós sabemos fazer, certo? Nosso circuito reprogramável pode ser implementado como uma simples memória RAM.

A segunda maneira é lembrando que existem portas lógicas que exibem universalidade. Aquela mesma equação booleana pode ser implementada usando apenas portas NAND:


Novamente, a idéia se apresenta. Podemos carimbar na bolacha um monte de portas NAND, e, para reprogramar basta mudar a conexão entre elas (por exemplo, usando uma RAM que funcionaria como se fosse um array de ponteiros).

As FPGAs utilizam uma mescla dos dois métodos. Elas são formadas de uma série de elementos repetidos, chamados CLB (configurable logic block). No modelo que eu uso em casa, cada CLB é formado de quatro slices, e esse aqui é o conteúdo de um terço de cada slice:


Parte de um slice da Spartan 3E

Os slices são levemente mais complicados que uma porta NAND, mas isso permite que você consiga aproveitar melhor a arquitetura. Às vezes, dá pra colocar um bom pedaço de lógica em um único slice. Além disso, se você prestar atenção no slice, tem um bloco chamado LUT (look-up table), que é essencialmente aquela RAMzinha do primeiro método.

Para completar, no canto direito tem um flip-flop tipo D. Até agora, estávamos falando apenas de circuitos combinatórios, mas FPGAs podem usar esses flip-flops para fazer circuitos sequenciais também. Alguns modelos de FPGA vão além, e possuem até mesmo DACs e PLLs que podem ser usados para sintetizar circuitos analógicos.


A FPGA também tem uma outra vantagem, que pra mim é fundamental. Embora eu adore eletrônica, sou muito ruim para soldar componentes (nunca aprendi como fazer isso tendo só dois braços). Mas as FPGAs não são programadas com soldas, ao invés disso, elas são programadas com descrições em texto, muito parecidas com as linguagens de programação. Após finalizar a descrição, que é uma espécie de código-fonte do hardware, você usa um compilador e faz upload para a placa, sem precisar de estanho e nem de ferro de solda.

E melhor, essas descrições em texto podem ser compartilhadas como qualquer arquivo texto. Aplique nelas uma licença apropriada, e temos então o hardware livre que queríamos! Hoje em dia, existem até repositórios de hardware livre, como o Open Cores, de onde você pode baixar de tudo, desde clones do Z80 até aceleradores de H264.

Se você ainda não conhecia FPGAs, deve estar bem curioso pra saber como você pode brincar com isso. No próximo post eu vou fazer um pequeno tutorial de como criar um circuito do zero, então fique ligado no blog :)