Não estou familiarizado com as ferramentas do Xilinx, mas estou com as do Altera, por isso vou falar sobre as ferramentas deles. Xilinx e outros não devem ser muito diferentes.
Verilog
A primeira coisa que você precisa fazer é aprender o Verilog . Isso fará sua cabeça doer porque o Verilog (e o VHDL um tanto semelhante) foi projetado pela primeira vez como uma linguagem de simulação e muitas construções (como o #5
que significa "aguarde 5 etapas de tempo", uma etapa geralmente sendo um nanossegundo). Portanto, há muitas restrições que você deve ter em mente para tornar seu código Verilog sintetizável , ou seja, compilável em um fluxo de bits para um FPGA.
O maior choque, porém, é que o que você escreve em Verilog (e VHDL) é o comportamento que você espera do sistema , e o compilador infere a lógica apropriada da sua descrição. Se você não for cuidadoso, poderá obter muitos erros desagradáveis com isso.
Por exemplo, um flip-flop D se parece com:
always @(posedge RESET or posedge CLK)
begin
if(RESET)
Q <= 1'b0;
else if(CLK_ENA)
Q <= D;
end
Isso descreve como um DFF funciona, e o compilador precisa analisá-lo e descobrir que você deseja um DFF. A @(...)
chamada lista de sensibilidade , que é uma lista de sinais que acionam uma reavaliação do bloco de código; portanto, neste bloco, Q
somente muda se houver uma borda ascendente ativada RESET
ou CLK
(isto é para uma redefinição ativa-alta). Se você esquecer algo da lista de sensibilidade (que deve conter todas as variáveis do lado direito, sem nenhum posedge
ou negedge
modificador para um bloco lógico combinacional), o compilador sintetizará as travas conforme necessário, em vez de chamar um erro. Louco, mas é assim, porque o Verilog era originalmente uma linguagem de simulação que escondia (e, portanto, não exigia) detalhes de implementação. VHDL é o mesmo, mas muito mais detalhado.
Finalmente, uma nova versão do Verilog, chamada SystemVerilog, foi lançada alguns anos atrás, o que torna muito mais fácil escrever código sintetizável . Se possível, aprenda esse idioma, pois o Xilinx ISE e o Altera Quartus II o suportam. O principal problema é a total falta de bom material de referência.
A versão SystemVerilog de um DFF limpa algumas pequenas coisas:
always_ff @(posedge RESET, posedge CLK)
begin
if(RESET)
Q <= '0;
else if(CLK_ENA)
Q <= D;
end
Observe que os sinais na lista de sensibilidade são separados por vírgulas. Isso ocorre porque or
era confuso, pois and
não podia funcionar lá. Observe também a substituição de 1'b0
(um único 0
bit) por '0
(um símbolo que se expande para o número de 0
bits necessário com base no que está sendo atribuído; muito mais flexível com os módulos com parâmetros). Por fim, observe a substituição de always
(que pode ser usada para qualquer coisa; lógica combinatória, travas e chinelos) com a always_ff
qual requer que o conteúdo seja sintetizado nos chinelos. Há também um always_comb
que elimina a lista de sensibilidade, uma vez que apenas elabora as sensibilidades das entradas ao bloco.
O software de design da Altera chama-se Quartus II e você procurará a Web Edition . (As edições de assinatura são bastante caras e necessárias apenas para os modelos FPGA mais rápidos ou mais recentes.)
O triste é que não encontrei um bom livro sobre o assunto. O que eu aprendi foi que reuni coisas de várias fontes, como os livros da Verilog, que não fazem um bom trabalho em dizer o que é sintetizável e o que não é, e o código de exemplo. O Quartus II possui um comando "inserir modelo" que insere o código do modelo para várias estruturas comuns, de flip-flops em D a máquinas de estado.
Hardware de demonstração
Depois de implementar seu processador no Verilog, você precisará construí-lo. Por enquanto, deixe a Quartus escolher o chip (você tem que escolher a família; eu recomendaria o Cyclone IV) e as pinagens. Depois que ele se formar, você saberá quanto chip precisa. Ele informará quantos elementos lógicos, chinelos, bits de RAM etc. você usou. Verifique se você não está acima de 50% em nenhum deles; se estiver, observe o chip que o compilador escolheu e selecione manualmente o próximo chip maior (em elementos lógicos) que possui pelo menos o mesmo número de pinos e repita até obter uma utilização abaixo de 50%.
Depois, compre uma placa de demonstração com um chip pelo menos tão grande quanto o que você finalmente construiu. Verifique se ele possui os periféricos e / ou conectores de E / S necessários. Não é incomum criar uma placa filha conectada a um conector de expansão para fornecer qualquer hardware ausente.
Agora que você escolheu seu hardware, descubra as pinagens reais e use o Pin Planner para colocar os sinais certos nos pinos certos. A placa de demonstração terá um guia do usuário que informa quais pinos estão conectados a quais dispositivos ou pinos de conector na placa de demonstração.
Depois de definir as pinagens, construa-a novamente para usar os pinos desejados. Lembre-se de que alguns sinais, como relógios do sistema, precisarão de pinos de entrada dedicados (para que sejam roteados diretamente para os PLLs internos).
Use o programador para baixar seu design diretamente no FPGA (o registro de turno que mencionei há algum tempo). Agora você está no familiar ciclo de depuração de edição, compilação e execução. Bata nele até que funcione.
Depois de funcionar, você pode usar o programador para fazer o download do código no dispositivo de configuração integrado , para que o programa seja carregado e executado na inicialização.
Isso foi muito longo e espero que tenha ajudado alguns. Há muito o que aprender; não é como aprender uma nova linguagem de programação, é como aprender um novo paradigma de programação, por exemplo, passar de linguagens procedurais para funcionais. Verilog é uma linguagem simultânea; a maior parte do código está sempre em execução.
Boa sorte!