Sunteți pe pagina 1din 10

Aplicaţii FPGA- 2.

Circuite secvenţiale si proiectare ierarhizata: numărător afişabil

LUCRAREA 2. Numărător binar bidirecţional, proiectarea ierarhizată

1. Descrierea aplicaţiei
La fel ca in orice limbaj evoluat de programare proiectarea ierarhizată a aplicaţiilor in
VHDL, prin utilizarea modulelor, permite descrierea proiectului pe mai multe nivele,
îmbunătăţeşte lizibilitatea şi permite reutilizarea unor module.
Un proiect ierarhizat este alcătuit din mai multe module. O aplicaţie poate fi descrisă
la nivelul cel mai de sus (top) printr-o sursă VHDL. În această sursă se definesc interfeţe
corespunzătoare cu alte module situate pe nivele inferioare, module care descriu părţi
componente ale aplicaţiei.
Nu există o limită a numărului de nivele ierarhice pe care un proiect poate să-l conţină.
Principalul avantaj al proiectării ierarhizate a unei aplicaţii este acela că încurajează
modularizarea. Alt avantaj este că permite organizarea proiectului pe nivele
corespunzătoare de abstractizare şi detaliu precum si reutilizarea unor module.
În sursa VHDL de pe nivelul top se vor utiliza cuvintele cheie (instrucţiunile)
component şi PORT MAP pentru a instanţia modulele de pe nivelele inferioare.
Vom ilustra conceptele de ierarhizare, modularizare şi reutilizare cu o aplicaţie care
presupune implementarea unui numărător binar de patru biţi (cu 16 stări), bidirecţional (poate
număra in sus sau in jos), resetabil (poate fi adus in starea iniţială, starea 0). Vectorul de ieşire
al acestuia este adus ca intrare într-un decodificator hex -> 7 segmente (îl vom reutiliza pe cel
descris în lucrarea precedentă) pentru a putea vizualiza (afişa) starea numărătorului. In figura
următoare este prezentată aplicaţia din punct de vedere funcţional.

Numărător binar 4biti Decodificator [s6..s0] Afisor LED

Dec7seg
num
Clock
cnt0 d0
cnt1 d1
Up_down cnt2 d2
cnt3 d3
Reset

Ieşirile numărătorului cnt3..cnt0 care sunt si intrările d3..d0 ale decodificatorului, vor
fi conectate prin intermediul unor noduri interne ale sistemului (de tip signal).
Intrările Clock - semnalul de ceas al numărătorului, Up_down - sensul de numărare şi
Reset - aducerea numărătorului in starea 0, vor fi generate cu ajutorul butoanelor si
comutatoarelor de pe modulul DIO-1, testarea finală a aplicaţiei cu ajutorul sistemului de
dezvoltare fiind similară cu cea de la lucrarea precedentă.

Aplicaţia va fi descrisă cu ajutorul a trei module VHDL:


- un modul top numit legate (destul de sugestiv…)
- un modul dec7seg cuprinzând decodificatorul (va fi reutilizat cel din lucrarea
anterioară)
- un modul numit num care descrie numărătorul binar bidirecţional

1
Aplicaţii FPGA- 2. Circuite secvenţiale si proiectare ierarhizata: numărător afişabil

Se va începe cu iniţializarea proiectului care este similară cu cea din exemplul


precedent (lucrarea 1).
Din meniul File se alege New Project, apoi se va da un nume proiectului în câmpul
Project name, de exemplu numbin. Din panoul Property Name se aleg şi se selectează
consecutiv:
Device Family: Spartan2E
Device: xc2s200e-7pq208 (circuitul utilizat pe sistemul de dezvoltare)
Synthesis Tool : XST VHDL
După finalizare se apasă butonul OK.

Din directorul ../dec7seg al proiectului anterior (lucrarea 1) se va copia in directorul


nou creat …/numbin al proiectului curent fişierul sursă dec7seg.vhd (cel pe care îl vom
reutiliza).

Vom începe prin a adăuga proiectului nostru numbin o sursă VHDL deja existentă.
Se face click dreapta pe obiectul xc2s200e-7pq208 –XST VHDL şi din meniul pop-up se
selectează Add Source.
În noua fereastră Add Existing Sources se va selecta fişierul dec7seg.vhd si se va
apăsa butonul Open.
Având selectat modulul dec7seg se lansează doar sub-procesul Check Syntax care
trebuie sa se finalizeze cu succes.

Vom edita (introduce) acum şi sursa noului modul corespunzător numărătorului binar.
Se face din nou click dreapta pe obiectul xc2s200e-7pq208 –XST VHDL şi din meniul
pop-up se selectează New Source. În fereastra New (în panoul din stânga) se selectează
VHDL Module şi apoi se va da un nume fişierului sursă în câmpul File Name, cum ar fi
num. Se verifică să fie bifat checkbox-ul Add to Project şi apoi se va trece la fereastra
următoare cu Next .
În noua fereastră Define VHDL Source în care apare şi numele fişierului sursă definit
anterior şi asociat modulului curent (Entity Name), se apasă Next (nu vom defini aici interfaţa
externă ci la editarea sursei) si apoi fereastra se închide cu butonul Finish .
Se începe editarea şi completarea machetei fişierului sursă pentru modul, machetă care
apare acum în panoul editorului astfel:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

--numarator binar 4 biti


-- bidirectional
-- cu intrare reset

entity num is
Port ( clk : in std_logic;
reset : in std_logic;
up_down : in std_logic;
cnt : inout std_logic_vector(3 downto 0));
end num;
--reset activ in "1"
-- up_down: "0"-up, "1"-down
--semnal de ceas activ pe frontul crescator _|

architecture Behavioral of num is

2
Aplicaţii FPGA- 2. Circuite secvenţiale si proiectare ierarhizata: numărător afişabil

begin
process (reset,clk,up_down)
begin
if reset='1' then
cnt <="0000";
elsif (clk'event and clk ='1') then --front crescator!
if up_down ='0' then
cnt <= cnt+1;
else
cnt <= cnt-1;
end if;
end if;
end process;
end Behavioral;

Având selectat modulul num se lansează doar sub-procesul Check Syntax care trebuie sa
se finalizeze cu succes.
După finalizare şi salvare arborescenţa surselor deja existente in proiect (Sources in
Project) trebuie sa fie ca in figura următoare.

Vom defini acum modulul top in care se va face instanţierea si interconectarea


modulelor de pe nivele inferioare si in care se va defini interfaţa externa a aplicaţiei.

Se face din nou click dreapta pe obiectul xc2s200e-7pq208 –XST VHDL şi din
meniul pop-up se selectează New Source. În fereastra New (în panoul din stânga) se
selectează VHDL Module şi apoi se va da un nume fişierului sursă în câmpul File Name,
care in cazul nostru o sa fie legate. Se verifică să fie bifat checkbox-ul Add to Project şi apoi
se va trece la fereastra următoare cu Next .
În noua fereastră Define VHDL Source în care apare şi numele fişierului sursă definit
anterior şi asociat modulului curent (Entity Name), se apasă Next (nu vom defini aici interfaţa
externă ci la editarea sursei) si apoi fereastra se închide cu butonul Finish .
Se începe editarea şi completarea machetei fişierului sursă pentru modulul top (legate),
care apare acum în panoul editorului:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity legate is
Port (ceas: in std_logic;

3
Aplicaţii FPGA- 2. Circuite secvenţiale si proiectare ierarhizata: numărător afişabil

reset: in std_logic;
sus_jos: in std_logic;
comenzi_anozi: out std_logic_vector(3 downto 0);
segmente: out std_logic_vector(6 downto 0) );
end legate;

architecture structura of legate is

--declarare componente
--decodif 7 seg
component dec7seg
port(
d : in std_logic_vector(3 downto 0);
s : out std_logic_vector(6 downto 0);
c: out std_logic_vector(3 downto 0)
);
end component;
--num. binar 4 biti
component num
port(
clk : in std_logic;
reset : in std_logic;
up_down : in std_logic;
cnt : inout std_logic_vector(3 downto 0)
);
end component;

--pentru conexiunile interne num. - dec.


signal date_intern : std_logic_vector (3 downto 0);

--instantiere componente
begin

d1: dec7seg PORT MAP( d => date_intern,


s => segmente,
c=> comenzi_anozi);

n1: num PORT MAP( clk => ceas,


reset => reset,
up_down => sus_jos,
cnt => date_intern);

end structura;

Având selectat modulul legate se lansează sub-procesul Check Syntax care trebuie să
se finalizeze cu succes. Daca nu, se vor corecta erorile si se repetă operaţia.

Iniţial, după adăugare, modulul apare pe acelaşi nivel cu modulele deja definite
(dec7seg si num) dar după editarea corespunzătoare si verificarea cu succes a sintaxei (Check
Sintax) el va fi recunoscut ca un modul de tip top (vezi ierarhia din figura următoare).

4
Aplicaţii FPGA- 2. Circuite secvenţiale si proiectare ierarhizata: numărător afişabil

2. Sinteza si implementarea

Atenţie!!, in momentul in care se vor lansa procesele „Synthesize”, „Implement


Design” sau „Generate Programming File” este esenţial să fie selectat obiectul
corespunzător modulului top (legate in cazul nostru), deoarece aceleaşi procese sunt
disponibile şi pentru modulele de pe nivelele inferioare în cazul în care unul din acestea este
selectat. Într-o astfel de situaţie lansarea proceselor are ca rezultat generarea de erori.

Înainte de trece mai departe se vor executa următoarele :


- in directorul aferent proiectului .../numbin se va crea un fişier de tip text cu click
dreapta, New, Text Document
- numele si extensia fişierului vor fi modificate in numbin.xcf
- conţinutul său se editează (cu Notepad-ul) si va fi:

NET "ceas" LOC = "P149" ;


BEGIN MODEL "legate"
NET "ceas" clock_buffer = ibuf;
END;

Având selectat modulul legate, se va face click dreapta pe procesul Synthesize si din
meniul pop-up se va alege câmpul Properties. In fereastra Process Properties si in tab-ul
Synthesis Options in câmpul Property Name: Synthesis Constraint File prin intermediul lui
Value se va alege (se deschide o fereastra de tip Select File) fişierul creat anterior:
numbin.xcf. Check-box-ul Use Synthesis Constraint File trebuie sa fie bifat. Se iese
apăsând butonul OK.
Scopul acestei operaţii (de fapt este vorba de eliminarea unei constrângeri la nivelul
procesului de sinteză) este de a se putea utiliza la implementare ca intrare de ceas pentru
numărător semnalul provenind de la unul din butoanele de pe modulul DIO-1, buton care nu
este adus pe unul din pinii circuitului FPGA dedicaţi pentru semnale de ceas

5
Aplicaţii FPGA- 2. Circuite secvenţiale si proiectare ierarhizata: numărător afişabil

In continuare vom asigna conexiunile exterioare ale aplicaţiei (vom constrânge


conexiunile externe ale circuitului FPGA) pentru ca aplicaţia noastră sa poate fi utilizată pe
platforma hardware disponibilă (DIIE+DIO-1).

Se selectează modulul legate, apoi se da click dreapta si in meniul pop-up se


selecteaza New Source. In fereastra New se selectează tipul Implementation Constraint
File căruia i se va da numele d2E. Rezultatul va fi crearea unui fişier d2E.ucf care va fi
asociat aplicaţiei si care va fi editat in continuare.

Procedura este identică cu cea din lucrarea precedentă.


Se dă un dublu- click pe numele fişierului nou creat, se va deschide fereastra
editorului de constrângeri Xilinx Constraints Editor, iar aici se va selecta Tab-ul Ports.
Singura coloană care se va edita este Location având ca referinţă tabelele si descrierea
interfeţei date in continuare. Se selectează celula (cu click) si se editează sau se poate face
dublu click pe celula, in fereastra deschisa Location se completează câmpul Location sub
forma Pnumar_pin.(ex. P124). După finalizare si verificare se iese cu OK.

Intrările ceas si reset pentru numărător vor fi generate cu ajutorul a 2 butoane BTN1 si.
BTN4) din cele 5 butoane-taste (BTN1..BTN5) aflate pe modulul DIO-1. Conexiunea (To
connector) pentru fiecare din butoane este adusă prin intermediul conectorilor de expansiune
pe sistemul DIIE si de aici la pinul corespunzător (P…) al circuitului FPGA.

6
Aplicaţii FPGA- 2. Circuite secvenţiale si proiectare ierarhizata: numărător afişabil

Inversorul cu intrare de tip trigger Schmitt (74HC14) este folosit pentru


„deparazitarea” intrării si asigurarea protecţiei la descărcări electrostatice (ESD) a pinului
circuitului FPGA. Se poate observa din schemă că ieşirea (To connector) este in starea „0”
pentru buton neapăsat, trecând in „1” la apăsarea butonului.

Intrarea sus_jos este generată cu ajutorul comutatorului SW1 (utilizat si in aplicaţia


anterioară).

Intrări numărător Sursa Pini FPGA


Ceas BTN1 P149
Reset BTN4 P152
sus_jos SW1 P126

Comenzi anozi afişor (vectorul Anod comun Pini FPGA


comenzi_anozi)
comenzi_anozi 0 a1 P160
comenzi_anozi 1 a2 P162
comenzi_anozi 2 a3 P164
comenzi_anozi 3 a4 P166

Comenzi segmente (vectorul Segment Pini FPGA


segmente)
segmente 0 a P127
segmente 1 b P132
segmente 2 c P134
segmente 3 d P136
segmente 4 e P139
segmente 5 f P141
segmente 6 g P146

Conţinutul fişierului *.ucf, un fişier de tip text, poate fi ulterior vizualizat si editat.
Se selectează obiectul d2E.ucf si pentru acesta va fi disponibil un singur proces User
Constraints, cu mai multe sub-procese din care vom alege Edit Constraints (Text). Se
lansează cu un dublu-click si in fereastra editorului vom putea vizualiza si eventual modifica
conţinutul acestuia.

7
Aplicaţii FPGA- 2. Circuite secvenţiale si proiectare ierarhizata: numărător afişabil

O altă informaţie interesantă care se poate vizualiza după finalizarea sintezei este o
schemă logică structurală a aplicaţiei (de fapt o descriere schematică la nivel RTL – Register
Transfer Logic). Pentru aceasta este suficient să se lanseze sub-procesul View RTL
Schematic (cu dublu-click sau click dreapta si Run) un sub-proces al lui Synthesize.

In fereastra care se deschide (Xilinx ECS) poate fi vizualizată reprezentarea modulului top (ca
in figura următoare).

Navigarea la nivelul ierarhiei se poate realiza cu butoanele in jos -Push (spre


nivelele inferioare) sau in sus –Pop (spre nivelele inferioare). Dacă pentru prima schemă
apărută se apasă butonul Push (sau se dă un dublu-click pe schemă) va fi prezentată o noua
schemă ce cuprind modulele instantiate la nivelul modulului top.

8
Aplicaţii FPGA- 2. Circuite secvenţiale si proiectare ierarhizata: numărător afişabil

Finalizarea cu succes a tuturor proceselor lansate (Sythesize si Implement Design) este


identificată de apariţia în panoul de raportare a unui mesaj de forma: PAR completed
successfully (de fapt se indica finalizarea cu succes a sub-procesului Place and Route).

3. Generarea fişierului bitstream si programarea circuitului.

Ultima etapă corespunde si ultimului proces care trebuie parcurs în secvenţă şi anume
generarea fişierului de programare. Se lansează procesul Generate Programming File. În
principiu nu există nici un motiv pentru ca acest proces să nu se finalizeze corect, mesajul din
fereastra de raportare fiind de forma: … Saving bit stream in "legate.bit"…. Bitstream
generation is complete…Completed process "Generate Programming File"...
De reţinut ca informaţia necesară programării se afla in fişierul legate.bit!
In condiţiile respectării ordinii de conectare descrise la lucrarea precedentă
(punctul 10), se lansează sub procesul Configure Device(Impact) (un sub-proces al lui
Create Programming File). Etapele parcurse sunt identice cu cele descrise in lucrarea
precedentă diferind numai numele fişierului de programare legate.bit in acest caz.
După finalizarea programării aplicaţia este funcţională putând fi testată.

4. Testarea aplicaţiei
Corespondenţa între mărimile de intrare ale numărătorului nostru şi semnalele
provenind de la cele doua butoane si un comutator este (vezi figura):

Ceas BTN1
Reset BTN4
sus_jos SW1

Prin apăsarea o singură dată a butonului BTN1 se generează un puls de ceas, care
trebuie sa aibă ca efect incrementarea sau decrementarea numărătorului..
Prin apăsarea butonului BTN4 se generează un puls de reset care trebuie sa aibă ca
efect aducerea imediată in 0 a numărătorului. Prin poziţionarea comutatorului cu translaţie
SW1 se stabileşte sensul de numărare.
Se va verifica astfel (prin intermediul valorii afişate) că numărătorul parcurge toate
cele 16 stări in sens crescător si respectiv toate cele 16 stări in sens descrescător. Pentru stări
diferite de starea 0 se va verifica ca semnalul de reset aduce numaratorul in starea 0.

9
Aplicaţii FPGA- 2. Circuite secvenţiale si proiectare ierarhizata: numărător afişabil

10

S-ar putea să vă placă și