Marcelo Samsoniuk escreveu:antes de tentar, dah uma olhada nisso:
http://opencores.org/articles,1004822682
bom, fora a questoes legais, tem uma importante questao funcional: performance!
tem tempo, eu achei alguns posts em foruns sobre o assunto e o povo comentava que a performance do blackARM era decepcionante, coisa da ordem de apenas 15 MHz, o q eh baixo comparado com os tipicos 30MHz que se consegue com um clone de 68000. recentemente eu portei um design nosso de um bus de 8 bits p/ 16 bits, houve uma piora de performance e comecei a entender como a coisa funciona.
e o motivo eh bem simples: em uma FPGA, quando maior a largura do barramento, maior eh o requerimento de tempo extra de setup/hold. se vc tiver uma unica linha, vc consegue fechar o tempo de setup/hold em algo da ordem de 500MHz em uma FPGA barata. se vc tem duas linhas, os tempos de setup/hold delas vao ser diferentes e o tempo total sera a soma dos tempos de setup/hold. com 16 linhas vc chega em algo como 30MHz e com 32 linhas fica nos 15MHz.
a maior parte das FPGAs tem otimizacoes p/ larguras de 16 bits, mas o uso requer uma certe simetria de construcao. quando a logica eh muito complexa (como eh um ARM ou 68000), existe um quebra de simetria e a logica passa a ser descrita de forma assimetrica. o resultado eh aquele espalhamento da temporizacao de setup/hold.
designs simples, como o J1, conseguem manter uma certa simetria, nao apenas melhorando a performance, como tambem ocupando muito menos espaco:
http://excamera.com/sphinx/fpga-j1.html
nao sei quanto o BlackARM ocupava (nos foruns falaram algo da ordem de uma virtex com 1 milhao de gates!), mas p/ ter ideia, um 68000 em verilog consome espaco equivalente a oito cores J1 (uns 500 mil gates). e o J1 roda 3x mais rapido que o 68000.
Depende muito isso do modo que é implementado e o que o bus irá fazer e quantos ciclos de clock ele precisa para isso. Mas realmente não é algo na ordem de 30 - 15Mhz.
Recentemente eu fiz um projeto de uma placa para se conectar ao barramento PCI do computador (usando o PCI Bridge do Open Cores). O projeto foi implementado em um Spartan3. O PCI em si ja é um barramento de 32 bits e funciona à 33Mhz, mas dentro do Core minha lógica toda usava barramentos de 32 Bits à 50Mhz sem problema. E muitas vezes eu usava umas belas de umas lógicas combinatórias. Se colocar um pipeline gigantesco com no máximo um nível ou dois de lógica combinatória entre os FF você consegue 100Mhz fácil.
Essas questões de simetria em um FPGA não são tão críticas assim nessa ordem de frequência. O propagation delay está na ordem de pocos ns. O setup/hold também não é tão crítico. O que normalmente mata são é toda a lógica encadeada formada por LUTs, portas lógicas e MUX. A não ser que o seu FPGA já esteja bem no talo. Dai realmente a frequência começa a cair bruscamente por falta de caminhos.
ABs