Non ho familiarità con gli strumenti di Xilinx, ma sono con quelli di Altera, quindi ti parlerò dei loro. Xilinx e altri non dovrebbero essere troppo diversi.
Verilog
La prima cosa che dovrai fare è imparare Verilog . Questo ti farà male alla testa perché Verilog (e il VHDL in qualche modo simile) è stato inizialmente progettato come un linguaggio di simulazione , e molti costrutti (come #5
questo significa "attendere 5 fasi temporali", una fase temporale che di solito è un nanosecondo). Quindi ci sono molte restrizioni che devi tenere a mente per rendere sintetizzabile il tuo codice Verilog , ovvero compilabile in un flusso di bit per un FPGA.
Lo shock più grande, tuttavia, è che ciò che scrivi in Verilog (e VHDL) è il comportamento che ti aspetti dal sistema , e il compilatore deduce la logica corretta dalla tua descrizione. Se non stai attento, puoi ottenere molti cattivi bug da questo.
Ad esempio, un infradito D appare come:
always @(posedge RESET or posedge CLK)
begin
if(RESET)
Q <= 1'b0;
else if(CLK_ENA)
Q <= D;
end
Descrive come funziona un DFF e il compilatore deve analizzarlo e capire che si desidera un DFF. Si @(...)
chiama un elenco di sensibilità , che è un elenco di segnali che innescano una rivalutazione del blocco di codice; pertanto, in questo blocco, Q
cambia solo se v'è un fronte di salita sul RESET
o CLK
(questo è per un ripristino attivo alto). Se si dimentica qualcosa nell'elenco di sensibilità (che dovrebbe contenere tutte le variabili del lato destro senza alcuno posedge
o negedge
modificatori per un blocco logico combinatorio) il compilatore sintetizzerà i latch secondo necessità anziché chiamare un errore. Pazzo, ma è così, perché in origine Verilog era un linguaggio di simulazione che nascondeva (e quindi non richiedeva) i dettagli di implementazione. VHDL è lo stesso ma molto più dettagliato.
Infine, una nuova versione di Verilog chiamata SystemVerilog è stata rilasciata qualche anno fa, il che rende molto più semplice la scrittura di codice sintetizzabile . Se possibile, impara questa lingua, poiché Xilinx ISE e Altera Quartus II la supportano entrambe. Il problema principale è l'assoluta mancanza di un buon materiale di riferimento.
La versione SystemVerilog di un DFF pulisce un paio di piccole cose:
always_ff @(posedge RESET, posedge CLK)
begin
if(RESET)
Q <= '0;
else if(CLK_ENA)
Q <= D;
end
Si noti che i segnali nell'elenco di sensibilità sono separati da virgole. Questo perché or
era confuso poiché and
non poteva funzionare lì. Notare anche la sostituzione di 1'b0
(un singolo 0
bit) con '0
(un simbolo che si espande a quanti 0
bit sono necessari in base a ciò a cui è assegnato; molto più flessibile con i moduli parametrizzati). Infine, nota la sostituzione di always
(che potrebbe essere utilizzata per qualsiasi cosa; logica combinatoria, chiavistelli e infradito) con always_ff
cui è necessario sintetizzare il contenuto in infradito. C'è anche uno always_comb
che elimina l'elenco di sensibilità, dal momento che risolve solo le sensibilità dagli ingressi al blocco.
Il software di progettazione Altera si chiama Quartus II e cercherai la Web Edition . (Le edizioni in abbonamento sono piuttosto costose e necessarie solo per i modelli FPGA più veloci o più recenti.)
La parte triste è che non ho trovato un buon libro sull'argomento. Quello che ho imparato l'ho ottenuto mettendo insieme cose da più fonti, come i libri di Verilog che non fanno un buon lavoro nel dirti ciò che è sintetizzabile e cosa non lo è, e il codice di esempio. Quartus II ha un comando "Inserisci modello" che inserisce il codice modello per diverse strutture comuni, dalle infradito D alle macchine a stati.
Demo Hardware
Dopo aver implementato il tuo processore in Verilog, devi crearlo. Per il momento, lascia che Quartus scelga il chip (devi scegliere la famiglia; consiglierei il Cyclone IV) e le piedinature. Una volta che biulds, saprai di quanti chip hai bisogno. Ti dirà quanti elementi logici, infradito, bit RAM, ecc. Hai usato. Assicurati di non superare il 50% su nessuno di questi; se lo sei, guarda il chip scelto dal compilatore e seleziona manualmente il prossimo chip più grande (in elementi logici) che ha almeno altrettanti pin e ripeti fino a ottenere un utilizzo inferiore al 50%.
Quindi vai a fare shopping per una scheda demo che ha un chip grande almeno quanto quello con cui hai finalmente costruito. Verificare che abbia le periferiche e / o i connettori I / O necessari. Non è raro costruire una scheda figlia che si collega a un connettore di espansione per fornire qualsiasi hardware mancante.
Ora che hai scelto il tuo hardware, scopri i veri piedinatura e usa il Pin Planner per mettere i segnali giusti sui pin giusti. La scheda demo avrà una guida per l'utente che ti dirà quali pin sono collegati a quali dispositivi o pin del connettore sulla scheda demo.
Una volta impostati i piedinatura, crealo di nuovo in modo che utilizzi i pin desiderati. Tieni presente che alcuni segnali come gli orologi di sistema necessitano di pin di ingresso dedicati (quindi indirizzano direttamente ai PLL interni).
Usa il programmatore per scaricare il tuo progetto direttamente nell'FPGA (quel registro a turni di cui ho parlato qualche tempo fa). Ora sei nel familiare ciclo di debug di modifica-compilazione-esecuzione. Sbattilo finché non funziona.
Una volta che funziona, è possibile utilizzare il programmatore per scaricare il codice nel dispositivo di configurazione integrato in modo che il programma venga caricato ed eseguito all'accensione.
Questo è stato piuttosto lungo e spero che abbia aiutato alcuni. C'è molto da imparare; non è come imparare un nuovo linguaggio di programmazione tanto quanto è come imparare un nuovo paradigma di programmazione, ad esempio passare da linguaggi procedurali a linguaggi funzionali. Verilog è un linguaggio simultaneo; la maggior parte del codice è sempre in esecuzione.
In bocca al lupo!