Documente Academic
Documente Profesional
Documente Cultură
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.
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ă.
1
Aplicaţii FPGA- 2. Circuite secvenţiale si proiectare ierarhizata: numărător afişabil
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;
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 _|
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.
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;
--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;
--instantiere componente
begin
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
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
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
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).
8
Aplicaţii FPGA- 2. Circuite secvenţiale si proiectare ierarhizata: numărător afişabil
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