CID Aplicatii 3
Programarea unui FPGA – Introducere
FPGA-ul (Field-programmable gate array) este un circuit programabil, capabil sa implementeze un anumit circuit definit de utilizator si este format dintr-o matrice de blocuri programabile, interconectate intre ele printr-o serie de conexiuni programabile. Aceste blocuri pot implementa atat functii logice, cat si memorii.
Cand se doreste implementarea unui circuit pe FPGA, acesta urmeaza mai multe etape: sinteza, implementarea, generarea fisierului de implementare si programarea.
Sinteza este procesul prin care codul Verilog este transformat intr-un circuit la nivel de porti si registre si este independent de modelul de FPGA folosit.
Implementarea este procesul prin care circuitul obtinut la pasul anterior este transformat in circuit la nivel de blocuri disponibile pe FPGA. Acest pas este dependent de FPGA-ul folosit.
Registrul de Tip D sau bistabilul, este un circuit de memorie ce poate memora date la momentul aparitiei unui eveniment front crescator de ceas (vom discuta despre acesta in detaliu mai tarziu). MUX este un multiplexor si este capabil sa selecteze pentru iesire datele de la bistabil, sau datele de la LUT (Look-Up Table). Acest LUT este o memorie ROM capabila sa stocheze date ce vor fi accesate cu ajutorul intrarilor (intrarile au rol de adresa). LUT-ul este secretul din spatele implementarii functiilor logice. Circuitele implementate pe FPGA nu sunt efectiv porti interconectate intre ele, ci memorii ROM (LUT) care stiu sa memoreze iesirile asociate unor combinatii de intrare.
Asadar, in timpul implementarii, functiile logice sunt transformate in tabele de adevar (pentru fiecare combinatie de intrare se calculeaza iesirea iesirea), care sunt implementate prin LUT-uri.
Circuitul dezvoltat de utilizator trebuie legat apoi la pini fizici ai FPGA-ului, pentru a putea stimula intrarile si a observa starile iesirilor. Aceasta legare la pinii fizici este posibila, deoarece, asa cum am mentionat si mai sus, conexiunile in interiorul FPGA-ului sunt programabile. Pe placa, avem comutatoare si butoane pentru a controla starea intrarilor si LED-uri si afisaje pentru a observa starea iesirilor.
In figura de mai jos este prezentata o schema simplificata a conectarii modulului implementat pe FPGA la pinii fizici. Fiecare pin fizic este codat in tool-ul de sinteza cu un anumit cod. Mentionand in fisierul de constrangeri in dreptul fiecarui bit al fiecarei intrari si iesiri codul aferent pinului fizic, tool-ul va programa conexiunile programabile astfel incat portul modulului sa fie conectat la pinul fizic ales. Mai departe, pe placa de dezvoltare ce contine si FPGA-ul, pinii fizici sunt conectati prin trasee metalice la dispozitivele de control si observatie.
Folosind toate aceste informatii (implementarea circuitului si modul de conectare la porturile fizice ale FPGA-ului) se va genera fisierul de implementare, ce va fi apoi descarcat in memoria SRAM a FPGA-ului, configurand astfel dispozitivul.
Exemplul 1
In exemplul de mai jos, vom descrie comportamental un comparator si il vom testa prin simulare.
Comparatorul pe care il vom descrie este un circuit cu 2 intrari pe 4 biti si 3 iesiri pe un bit.
Implementarea in Verilog a circuitului
module Comparator(
output reg equal,
output reg lower,
output reg greater,
input [3:0] in0,
input [3:0] in1
);
always@(in0 or in1) begin
if(in1 > in0) begin
equal = 0;
lower = 0;
greater = 1;
end else if(in1 == in0) begin
equal = 1;
lower = 0;
greater = 0;
end else begin
equal = 0;
lower = 1;
greater = 0;
end
end
endmodule