Sunteți pe pagina 1din 25

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA

FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

LABORATOR nr. 4
VHDL. Unităţile de proiectare de bază.
Utilizarea mediului de programare Quartus II.

1. Scopul laboratorului
În cadrul acestei lucrări se urmăresc două obiective:
1. prezentarea unităţilor fundamentale de proiectare VHDL şi anume: perechea
entitate/arhitectură, configuraţiile, specificaţiile de pachete şi corpurile pachetelor.
Se vor prezenta declaraţiile acestor elemente cu exemplificări pe circuite reale
simple.
2. se va utiliza mediul de programare Quartus II pentru a creea proiecte simple pentru
porţile ŞI, SAU, NU etc.

2. Consideraţii teoretice
2.1. Structura de bază a unui fişier VHDL
Un sistem digital în VHDL este alcătuit dintr-o entitate de proiectare care poate
conţine şi alte entităţi care mai apoi sunt considerate componente ale entităţilor de nivel
înalt (top-level). Fiecare entitate este modelată de către o declaraţie a entităţii şi de către
un corp de tip arhitectură. Aşa cum s-a mai prezentat, pe de o parte se poate considera
declararea entităţii ca o interfaţă cu lumea exterioară care defineşte semnalele de intrare şi
de ieşire iar pe de altă parte arhitectura care conţine descrierea entităţii care este compusă
din entităţii, procese şi componente interconectate între ele şi care operează concurenţial
aşa cum se arată în figura 2.1. Într-un proiect tipic, vor exista mai multe astfel de entităţi
conectate împreună pentru a realiza funcţia dorită.
Entitatea VHDL
Interfaţa
Porturi (Declaraţia entităţii)

Corpul
(Arhitectura)
Secvenţial
Procese
combinaţionale

Subprograme

Figura 2.1 O entitate VHDL care este alcătuită dintr-o interfaţă (declaraţia entităţii) şi un
corp (descrierea arhitecturală).

VHDL utilizează cuvinte cheie rezervate care nu pot fi utilizate ca nume de semnale
sau ca identificatori. Cuvintele cheie şi identificatorii definiţi de către utilizator sunt cazuri
deosebite. Liniile cu comentarii încep cu două cratime adiacente (--) care vor fi ignorate de
către compilator. De asemenea VHDL ignoră spaţiile. VHDL este un tip de limbaj foarte

1
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR
puternic orientat pe tip care implică declarea întotdeauna a tipului fiecărui obiect care
poate avea o valoare, precum semnalele, constantele şi variabilele.

2.1.1. Declaraţia entităţii


Declaraţia entităţii defineşte NUMELE entităţii şi listează porturile de intrare şi ieşire.
Forma generală este următoarea :

entity NUMELE_ENTITĂŢII is [ generic (declaraţii_generice) ];


port (numele_semnalelor: mode tip;
numele_semnalelor: mode tip;
:
numele_semnalelor: mode tip);
end [NUMELE_ENTITĂŢII] ;

O entitate începe întotdeauna cu cuvântul cheie entity, urmat de către numele


entităţii şi de cuvântul cheie is. Următoarele sunt declaraţiile portului folosind cuvântul
cheie port. O declaraţie a entităţii se termină întotdeauna cu cuvântul cheie end, urmat
opţional [ ] cu entităţii:
 NUMELE_ENTITĂŢII este un identificator selectat de utilizator.
 Numele_semnalelor este alcătuit dintr-o listă comună separată de identificatorul
selectat de utilizator care specifică semnalele interfeţei externe.
 mode: este unul dintre cuvintele rezervate pentru a indica direcţia semnalului:
 in – indică faptul că semnalul este o intrare;
 out – indică faptul că semnalul este o ieşire a entităţii a cărui valoare poate fi
doar citită de către alte entităţi care o utlizează;
 buffer – indică faptul că semnalul este o ieşire a entităţii a cărui valoare
poate fi citită din interiorul arhitecturii entităţii;
 inout – semnalul poate fi o intrare sau o ieşire.
 type (tipul): tipul de semnal definit de utilizator. Exemple de tipuri sunt bit, bit_vector,
boolean, caracter, std_logic şi std_ulogic :
 bit – poate avea valoarea 0 şi 1 ;
 bit_vector – este un vector al valorii bitului (de ex. bit_vector(0 to 7)) ;
 std_logic, std_ulogic, std_logic_vector, std_ulogic_vector : pot avea 9 valori
pentru a indica valoarea şi puterea unui semnal. Sunt preferate tipurile
Std_logic şi std_ulogic în loc de bit sau bit_vector.
 Boolean – poate avea valoarea ADEVĂRAT şi FALS ;
 Integer (întreg) – poate avea o scară de valori întregi;
 Real – poate avea o scară de valori reale;
 Character (caracter) – afişează orice caracter;
 Time (timp) – pentru a indica timpul.
 generic: declaraţiile generice sunt opţionale şi determină constantele locale utilizate
pentru temporizarea şi mărimea (de ex. mărimea magistralei) entităţii. Un generic
poate avea o valoare implicită. Sintaxa pentru generic este următoarea:

generic (
numele_constantei: tip [ :=valoare] ;
numele_constantei: tip [ :=valoare] ;
:
numele_constantei: tip [ :=valoare] ) ;
2
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR
Ca un exemplu, o să considerăm un circuit simplu care avertizează pasagerii unei
maşini atunci când uşa maşinii este deschisă sau nu este pusă centura de siguranţă în
momentul în care cheia maşinii este introdusă în contact pentru pornire. La nivelul
comportamental aceasta poate fi scrisă astfel :

Warning = Ignition_on AND (Door_open OR Seatbelt_off)

DOOR B1

IGNITION WARNING

SBELT
B2

Figura 2.2. – Reprezentarea structurală a unui circuit “BUZZER”.

-- comentariu: exemplu de circuit buzzer din figura 2.2


entity BUZZER is
port (DOOR, IGNITION, SBELT : in std_logic ;
WARNING: out std_logic);
end BUZZER;

Entitatea este numită BUZZER şi are trei porturi de intrare, DOOR, IGNITION şi
SBELT şi un port de ieşire, WARNING. De notat că numele BUZZER este un identificator.
Intrările sunt indicate prin cuvântul cheie in iar ieşirile prin cuvântul cheie out. Din moment
ce VHDL este un tip de limbaj foarte puternic, fiecare port este definit de către un tip. În
acest caz, vom specifica tipul std_logic. Acesta este tipul preferat al semnalelor digitale. În
comparaţie cu tipul bit care poate avea doar valorile 0 şi 1, tipurile std_logic şi std_ulogic
pot avea nouă valori. Acest lucru e important pentru a descrie un sistem digital care include
corect valorile binare ‘0’ şi ‘1’, la fel ca şi valoarea necunoscută X, valoarea neiniţializată U,
“-” pentru “nu contează”, Z pentru impendanţă înaltă şi câteva simboluri pentru a indica
puterea semnalului (de ex. L pentru 0 slab, H pentru 1 slab, W pentru valoare slabă
necunoscută). Tipul std_logic este definit în pachetul std_logic_1164 din librăria IEEE.
Tipul defineşte setul de valori pe care un obiect le poate avea. Acesta are avantajul că
poate ajuta la crearea de modele şi ajută la reducerea erorilor. De exemplu, dacă cineva
încearcă să asigneze o valoare ilegală unui obiect, compilatorul va semnaliza eroarea.
Alte câteva exemple de declaraţii a entităţii sunt următoarele :
- multiplexor cu 4 intrări şi 1 ieşire în care fiecare intrare este un cuvânt pe 8 biţi :

entity mux4_to_1 is
port (I0, I1, I2, I3 : in std_logic_vector (7 downto 0) ;
OUT1: out std_logic_vector (7 downto 0));
end mux4_to_1;

3
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

- un exemplu de declaraţie a entităţii a unui bistabil D flip-flop cu setarea şi resetarea


intrărilor este:

entity dff_sr is
port (D, CLK, S, R: in std_logic;
Q, Qnot: out std_logic);
end dff_sr;

2.1.2. Corpul arhitecturii


Corpul arhitecturii specifică cum funcţionează un circuit şi cum este implementat.
Aşa cum s-a prezentat mai devreme, o entitate sau un circuit poate fi specificat într-o
varietate de moduri, precum cel comportamental, structural (componente interconectate)
cât şi combinaţi ale acestora.
Corpul arhitecturii arată după cum urmează:

architecture numele_arhitecturii of Numele_entităţii is


-- Zona de declaraţii
-- declaraţiile componentelor
-- declaraţiile semnalelor
-- declaraţiile constantelor
-- declaraţiile funcţiilor
-- declaraţiile procedurilor
-- declaraţiile tipurilor

:
begin
-- Stări sau instrucţiuni concurente

:
end numele_arhitecturii;

a. Modelul comportamental (behavioral)


Corpul arhitecturii pentru exemplul din figura 2.1, descris la nivel comportamental
este următorul :

architecture comportamentală of BUZZER is


begin
WARNING <= (not DOOR and IGNITION) or (not SBELT and
IGNITION) ;
end comportamentală;

Linia de început a corpului arhitecturii defineşte numele arhitecturii, de ex.


comportamental (behavioral) şi o asociază cu entitatea BUZZER. Numele arhitecturii poate
fi orice identificator legal. Corpul principal al arhitecturii începe cu cuvântul cheie begin şi

4
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR
oferă o expresie booleană a funcţiei. Simbolul “<=” reprezintă un operator de asignare şi
oferă valoarea expresiei de la dreapta semnalului spre stânga. Corpul arhitecturii se
termină cu un cuvânt cheie end urmat de către numele arhitecturii.
Sunt date câteva exemple după cum urmează :
- descrierea comportamentală a porţii ŞI cu două intrări:

entity AND2 is
port (in1, in2: in std_logic;
out1: out std_logic);
end AND2;

architecture comportamentală_2 of AND2 is


begin
out1 <= in1 and in2 ;
end comportamentală_2;

- un exemplu de poartă XNOR cu două intrări :


entity XNOR2 is
port (A, B: in std_logic;
Z: out std_logic);
end XNOR2;

architecture comportamentală_xnor of XNOR2 is


-- declaraţia semnalului (a semnalelor interne X,Y)
Signal X, Y: std_logic;
begin
architectureX structurală
<= A and ofB; BUZZER is
Y <= (not A) and (not B);
-- Declaraţii
Z <= X or
component Y;
AND2
end comportamentală_xnor;
port (in1, in2: in std_logic;
out1: out std_logic);
end component;
Liniile de cod din corpul arhitecturii realizează utilizarea operatorilor logici. Operatorii
logici permişi sunt: and, or, nand, nor, xor, xnor şi not. În plus, sunt permise şi alte tipuri
component
de operatori OR2
cum ar fi relaţionali, de deplasare şi aritmetici.
port (in1, in2: in std_logic;
out1: out std_logic);
b. Descrierea structurală
end component;
Circuitul din figura 2.1 poate fi de asemenea descris utilizând şi un model structural
care specifică ce porţi sunt utilizate şi cum sunt ele interconectate. Următorul exemplu
component
prezintă acest lucru : NOT1
port (in1, in2: in std_logic;
out1: out std_logic);
end component;
-- declaraţia semnalelor utilizate pentru interconectarea porţilor
Signal DOOR_NOT, SBELT_NOT, B1, B2: std_logic;
begin
-- liniile de cod ale instanţierilor componentei
U0 : NOT1 port map (DOOR, DOOR_NOT);
U1 : NOT1 port map (SBELT, SBELT_NOT);
U2 : AND2 port map (IGNITION, DOOR_NOT, B1);
U3 : AND2 port map (IGNITION, SBELT_NOT, B2);
5
U4 : OR2 port map (B1, B2, WARNING);

end structurală;
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

După început (header) urmează partea declarativă care oferă componentele


(porţile) care urmează să fie utilizate în descrierea circuitelor. În exemplul nostru, am folosit
o poartă AND cu două intrări, o poartă OR cu două intrări şi un invertor. Aceste porţi
trebuie să fie prima dată definite, adică vor avea nevoie de o declaraţie a entităţii şi un corp
al arhitecturii. Acestea pot fi stocate într-unul dintre pachetele la care se face referire la
începutul fişierului (vezi exemplele care urmează). Declaraţiile pentru componente ne oferă
intrările (de ex. in1, in2) şi ieşirea (de ex. out1). Mai departe, trebuie definite legăturile
interne (numele semnalelor). În exemplul nostru aceste semnale sunt denumite
DOOR_NOT, SBELT_NOT, B1, B2. De notat că întotdeauna trebuie să se declare tipul de
semnal.
Liniile de cod de după cuvântul cheie begin oferă instanţierile componentelor şi
descriu modul cum sunt acestea interconectate. O linie de cod care instanţiază o
componentă creează un nou nivel în ierarhie. Fiecare linie începe cu numele instanţei (de
ex. U0) urmată de ’:’, de numele componentei şi de cuvântul cheie port map. Acest cuvânt
cheie defineşte cum sunt conectate componentele. În exemplul anterior, acest lucru e
posibil prin asocierea poziţiei : DOOR corespunde intrării, in1, a porţii NOT1 şi
DOOR_NOT corespunde ieşirii. Similar, pentru poarta AND2 primele două semnale
(IGNITION şi DOOR_NOT) corespund intrărilor in1 şi respectiv in2, iar semnalul B1
corespunde ieşirii out1. O cale alternativă este să se utilizeze asociaţia explicită dintre
porturi, aşa cum se prezintă mai departe :
etichetă: numele-componentei port map (port1=>semnal1, port2=>semnal2,…portn=>semnaln);

U0 : NOT1 port map (in1 => DOOR, out1 => DOOR_NOT);
U1 : NOT1 port map (in1 => SBELT, out1 => SBELT_NOT);
U2 : AND2 port map (in1 => IGNITION,6 in2 => DOOR_NOT, out1 => B1);
U3 : AND2 port map (in1 => IGNITION, in2 => SBELT_NOT, out1 => B2);
U4 : OR2 port map (in1 => B1, in2 => B2, out1 => WARNING);
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

De notat că ordinea în care aceste linii de cod sunt scrise nu au nici o legătură în
execuţie din moment ce aceste linii de cod sunt concurenţiale şi de aceea sunt executate
în paralel.

2.1.3. Librăria şi pachetele: library şi cuvântul cheie use


O librărie poate fi considerată ca un loc în care compilatorul îşi stochează informaţia
despre o descriere a proiectului. Un pachet VHDL este un fişier sau un modul care conţine
declaraţiile comune ale obiectelor utilizate, tipurilor de date, declaraţiile componentelor,
semnalelor, procedurilor şi funcţiilor care pot fi împărţite între diferite modele VHDL.
Am menţionat anterior că std_logic este definit în pachetul ieee.std_logic_1164 din
librăria ieee. Pentru a utiliza std_logic este nevoie să se specifice librăria şi pachetul. Acest
lucru este făcut de la începutul fişierului VHDL utilizând cuvintele cheie library şi use după
cum urmează :
library ieee;
use ieee.std_logic_1164.all;
Extensia .all indică să se utilizeze tot pachetul ieee.std_logic_1164.
Xilinx Foundation Express vine cu câteva pachete pentru librăria ieee cum ar fi:
 pachetul std_logic_1164: defineşte tipurile de date standard;
 pachetul std_logic_arith: furnizează funcţia aritmetică, conversia şi comparaţia tipurile
signed, unsigned, integer, std_logic, std_ulogic şi std_logic_vector, std_logic_unsigned;
 pachetul std_logic_misc: defineşte suplimentar tipurile, subtipurile, constantele şi
funcţiile pentru pachetul std_logic_1164.
Pentru a utiliza oricare dintre acestea trebuie să se includă clauzele library şi use:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
Librăria rezumat (synopsis) are pachetul de atribute:
library SYNOPSYS;
use SYNOPSYS.attributes.all;
Sintaxa de declarare a unui pachet este următoarea :
-- declaraţia pachetului
package numele_pachetului is
declaraţiile pachetului
end package numele_pachetului ;
-- declaraţiile corpului pachetului
package body numele_pachetului is
declaraţiile corpului pachetului
end package body numele_pachetului;

7
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR
De exemplu, funcţiile de bază pentru componentele AND2, OR2, NAND2, NOR2, XOR2
etc., sunt necesare ca să fie definite înainte să fie utilizată una din ele. Acest lucru poate fi
făcut într-unul dintre pachet, de ex. funcţia_de_bază (base_func) pentru fiecare dintre
aceste componente, după cum urmează :

-- declaraţia pachetului
library ieee ;
use ieee.std_logic_1164.all ;
package basic_func is

-- declaraţia pentru AND2


component AND2
generic (DELAY: timp :=5ns);
port (in1, in2: in std_logic; out1: out std_logic);
end component;

--declaraţia pentru OR2


component OR2
generic (DELAY: timp :=5ns);
port (in1, in2: in std_logic; out1: out std_logic);
end component;

end package basic_func ;

-- declaraţiile corpului pachetului


library ieee ;
use ieee.std_logic_1164.all;
package body basic_func is

-- poartă AND cu două intrări


entity AND2 is
generic (DELAY: timp);
port (in1, in2: in std_logic; out1: out std_logic);
end AND2;
arhitecture model_conc of AND2 is
begin
out1 <= in1 and in2 after DELAY;
end model_conc;

-- poartă OR cu două intrări


entity OR2 is
generic (DELAY: timp);
port (in1, in2: in std_logic; out1: out std_logic);
end OR2;
arhitecture model_conc2 of AND2 is
begin
out1 <= in1 or in2 after DELAY;
end model_conc2;

end package body basic_func;

8
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR
De notat că s-a inclus o întârziere (delay) de 5 ns. Totuşi, ar trebui de notat că
specificaţiile întârzierii sunt ignorate de către Foundation synthesis tool. A trebuit să
utilizăm tipul predefinit std_logic care este declarat în pachetul std_logic_1164. S-au inclus
în acest pachet library şi clauza use. Acest pachet are nevoie să fie compilat şi plasat
într-o librărie. O să numim aceasta library my_func. Pentru a utiliza componentele acestui
pachet, o dată ce a fost declarat, se utilizează library şi clauza use :

library ieee, my_func;


use ieee.std_logic_1164.all, my_func.basic_func.all;

Liniile de cod library şi use sunt conectate la o linie de cod a entităţii subsecventă.
Linia de cod library şi use trebuie să se repete pentru fiecare declaraţie a entităţii.

3. Utilizarea mediului de programare Quarus II


3.1. Pornirea aplicaţiei Quartus II
După instalarea tipică, iconiţa Quartus II ar trebui să fie vizibilă pe fiecare desktop.
Pentru pornirea software-ului trebuie să se dea un dublu clic pe iconiţă şi să se aştepte
până când apare fereastra cu numele Quartus II.
NOTĂ: Pentru computerele mai lente este posibil să dureze câteva secunde până când
apare fereastra. A nu se da mai multe dublu clicuri pe iconiţă pentru a se evita deschiderea
mai multor ferestre Quartus II.
Prima fereastra care va fi afişată după deschiderea mediului de programare Quartus
II este de obicei fereastra Getting Started With Quartus II Software (figura 3.1.).

Figura 3.1. – Fereastra Getting Started

9
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Din fereastra Getting Started se poate :


- crea un proiect nou (Create a New Project)
- deschide un proiect deja existent
 Prin selectarea opţiunii Open Existing Project sau
 Prin selectarea numelui proiectului din lista aplicaţiilor deschise recent;
- deschide tutorialul interactiv (Open Interactive Tutorial).

3.2. Crearea unui proiect nou


Pentru crearea unui nou proiect se selectează opţiunea Create a New Project
(New Project Wizard) din fereastra Getting Started sau din meniul File al mediului de
programare Quartus II. În fereastra care se deschide se selectează directorul de lucru
pentru proiect, se introduce un nume pentru proiectul curent, apoi se introduce un nume
pentru entitatea principală a proiectului. Fereastra ar trebui să arate ca în figura 3.2. Se dă
clic pe butonul Next pentru a continua.

Figura 3.2. – Directorul de lucru şi numele proiectului

În fereastra următoare se pot include în proiect eventualele fişiere de design


existente şi / sau să se specifice librării noi, diferite de cele implicite (figura 3.3.). Pentru a
continua se dă clic pe butonul Next.

10
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Figura 3.3. – Adăugarea de fişiere noi sau selectarea altor librării

În cea de-a treia fereastră a wizardului se selectează dispozitivul hardware utilizat.


La Device family se selectează Cyclone III, la Target device se selectează Specific device
selected in „Available devices” list, iar in zona Show in „Available device” list se selectează
pentru Package - FBGA, pentru Pin count - 324, iar pentru Speed grade se va selecta
Fastest. Din zona Available devices se va selecta circuitul EP3C25F324C6, acesta fiind
circuitul de pe plăcile de dezvoltare Cyclone III Starter Kit. Această fereastră este
prezentată în figura 3.4.
Pentru a continua se apasă butonul Next.

11
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Figura 3.4. – Selecţia circuitului FPGA corespunzător

În cea de-a patra fereastră a wizardului se pot selecta unelte EDA adiţionale faţă de
cele incluse deja în mediul de programare Quartus II. Astfel se pot selecta unelte pentru
introducerea schemelor şi sinteză, pentru simulare sau pentru analiza temporară.
Deoarece noi vom utiliza uneltele incluse în mediul de programare Quartus II, în această
fereastră nu vom face nicio setare. Fereastra este prezentată în figura 3.5.
Pentru continuare se dă clic pe butonul Next.

12
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Figura 3.5. – Selecţia uneltelor EDA externe

În ultima fereastră a wizardului avem prezentat un sumar al selecţiilor făcute până


acum. Pentru a termina procesul de creare al unui proiect nou se dă clic pe butonul Finish.

Figura 3.6. – Sumarul setărilor efectuate

13
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

3.3. Implementarea schemei


După crearea noului proiect se intră în fereastra de lucru a mediului de dezvoltare
Quartus II, după cum se poate observa în figura 3.7.

Figura 3.7. – Fereastra de lucru a programului Quartus II

Pentru a putea implementa o schemă nouă, va trebui creat un fişier nou, de tipul
Block Diagram / Schematic File. Pentru aceasta, din meniul File al mediului de dezvoltare
se alege opţiunea New. Din fereastra nou deschisă se alege opţiunea Block Diagram /
Schematic File din cadrul opţiunii Design Files, după cum se poate observa în figura 3.8.
Dând clic pe butonul OK se va deschide foaia de lucru pentru introducerea schemei.
Se va salva fişierul cu schema bloc prin selecţia opţiunii Save as… din meniul File al
mediului de dezvoltare Quartus II. De reţinut că numele fişierului .bdf trebuie să fie numele
declarat la crearea proiectului pentru entitatea principală.
După salvarea fişierului cu schema bloc se poate trece la implementarea efectivă a
schemei. Pentru a se introduce o componentă în schemă, se dă dublu clic pe foaia de
lucru. Se deschide astfel fereastra de selecţie a simbolurilor din cadrul bibliotecilor.
Se selectează din lista de biblioteci megafunctions->gates şi se selectează
biblioteca lpm_and corespunzătoare porţii logice ŞI (figura 3.9.). Se dă clic pe butonul OK.
Se va deschide o nouă fereastră, ce ne permite configurarea componentei selectate la
pasul anterior (figura 3.10.).

14
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Figura 3.8. – Crearea fişierului cu diagrama bloc

Figura 3.9. – Selectarea componentei dorite

15
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR
În această fereastră selectăm tipul de fişier de ieşire în limbaj HDL în care va fi
convertită schema noastră. Putem selecta AHDL, VHDL şi Verilog. Se va selecta limbajul
VHDL. Numele fişierului de ieşire va rămâne cel selectat implicit, nu se va modifica. Pentru
a merge mai departe, se va da clic pe butonul Next.

Figura 3.10. – Managerul de componente

Noua fereastră ce apare ne permite selecţia parametrilor componentei selectate


(figura 3.11.). Vom seta numărul de intrări al porţii logice ŞI ca fiind 2, iar lăţimea intrărilor
va fi setată la 1 bit. Pentru a continua se apasă butonul Next.

Figura 3.11. – Configurarea componentei

16
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR
Următoarea fereastră ce se deschide ne indică fişierele necesare simulării schemei.
Tot aici putem selecta dacă să generăm sau nu netlista pentru simularea temporală şi
pentru estimarea resurselor ocupate de componenta noastră (figura 3.12.).

Figura 3.12. – Setările pentru simulator

Ultima fereastră ne afişează lista fişierelor ce vor fi create. Dacă dorim să creăm şi
alte fişiere, le putem selecta aici din listă, bifând corespunzător căsuţa din faţa numelui
fişierului. Pentru terminarea operaţiunii de selectare şi configurare a componentei, se dă
clic pe butonul Finish.
După închiderea ferestrei de configurare, se revine în foaia de lucru curentă a
mediului de programare Quartus II (figura 3.14). Componenta selectată este activă şi o
putem plasa pe foaia de lucru dând un singur clic pe aceasta. După plasarea componentei
va trebui să plasăm şi pinii pentru conectarea porţii în exterior. Pentru aceasta vom da
dublu clic pe suprafaţa liberă a foii de lucru, intrând astfel în fereastra de selecţie a
simbolurilor din biblioteci (figura 3.15.). De această dată vom selecta din lista de biblioteci
primitives->pin->input pentru a selecta pinii de intrare, respectiv output pentru pinii de
ieşire. Se dă clic pe butonul OK şi se revine în foaia de lucru, cu pinul activ. Pentru
plasarea pinului, se dă clic pe foaia de lucru în locul dorit. Se repetă operaţiunea până sunt
plasaţi toţi pinii.

17
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Figura 3.13. – Lista fişierelor ce vor fi create

Figura 3.14. – Plasarea componentei pe foaia de lucru

18
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Figura 3.15. – Selectarea pinilor

După plasarea tuturor pinilor pe foaia de lucru se trece la conectarea lor cu


terminalele porţii logice. Pentru aceasta se dă clic pe butonul Orthogonal Node Tool aflat în
lista de butoane din partea stângă a foii de lucru şi se unesc, pe rând, terminalele porţii
logice cu terminalele pinilor corespunzători (figura 3.16.). Pentru schimbarea numelor
pinilor, se dă dublu clic pe fiecare pin în parte şi, în fereastra de configurare ce se
deschide, se introduce numele dorit pentru fiecare pin.

Figura 3.16. – Schema finală

19
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR
După terminarea implementării schemei se trece la analiza şi elaborarea ei. Din
meniul Processing se selectează submeniul Start cu opţiunea Start Analysis & Elaboration
(figura 3.17.).

Figura 3.17. – Pornirea etapei de analiză şi elaborare

Pentru a putea realiza simularea funcţională trebuie să creăm un fişier cu stimulii


pentru intrări. Pentru a realiza acest lucru, din meniul File se selectează opţiunea New. În
fereastra care apare selectăm opţiunea Vector Waveform File din meniul Verification /
Debugging Files, apoi facem clic pe butonul OK.
În fereastra nou apărută introducem intrările porţii logice ŞI, cu numele selectate
pentru pinii de intrare, apoi generăm forma de undă dorită pentru fiecare intrare în parte
folosind butoanele din partea stângă a ferestrei de lucru (figura 3.18.).
După setarea semnalelor pentru cele două intrări, se salvează fişierul selectând
opţiunea Save as… din meniul File. Numele fişierului .vwf va fi acelaşi cu al schemei .bdf.

20
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Figura 3.18. – Crearea fişierului cu stimulii de intrare

Pentru simularea funcţională a schemei se va deschide simulatorul încorporat în


mediul de dezvoltare Quartus II prin selectarea opţiunii Simulator Tool din meniul
Processing. Se va deschide fereastra simulatorului (figura 3.19).
La opţiunea Simulation mode se va selecta Functional, iar la opţiunea Simulation
input se va selecta fişierul cu stimulii pentru intrări creat anterior. Apoi se va da clic pe
butonul Generate Functional Simulation Netlist. După terminarea generării netlistei
funcţionale se poate porni simularea dând clic pe butonul Start.
După încheierea simulării se poate vedea raportul simulării dând clic pe butonul
Report. Se va deschide o nouă fereastră în care apar semnalele de intrare generate
anterior şi semnalul de ieşire obţinut în urma simulării (figura 3.20.). Se poate observa
astfel dacă schema funcţionează corect.

21
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Figura 3.19. – Setarea şi pornirea simulării

Figura 3.20. – Raportul simulării

22
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR
După efectuarea cu succes a simulării, se poate trece la implementarea practică a
schemei în circuitul FPGA de pe placa de dezvoltare Cyclone III. Pentru aceasta este
necesar ca pinii din schemă să fie atribuiţi unor pini fizici ai circuitului FPGA. Acest lucru se
realizează prin selectarea opţiunii Pins din meniul Assignments. Se va deschide o fereastră
în care vom putea selecta ce pini fizici vor corespunde intrărilor şi ieşirilor schemei (figura
3.21.).
Pentru a putea observa funcţionarea schemei după încărcarea ei în circuitul FPGA,
se vor conecta cele două intrări ale porţii logice ŞI la două dintre butoanele programabile
de către utilizator, iar ieşirea acesteia se va conecta la unul din LED-urile programabile de
către utilizator.
Pinii corespunzători celor 4 LED-uri programabile de către utilizator sunt:

LED PIN
LED1 P13
LED2 P12
LED3 N12
LED4 N9

Pinii corespunzători celor 4 butoane programabile de către utilizator sunt:

Buton PIN
Buton1 F1
Buton2 F2
Buton3 A10
Buton4 B10

ATENŢIE. LED-urile sunt active (se aprind) pe 0 logic. Intrările corespunzătoare


butoanelor sunt în starea 1 logic atunci când butoanele nu sunt apăsate şi trec în 0 logic
atunci când butoanele sunt apăsate.

După încheierea etapei de asignare a pinilor, pentru a putea încărca şi rula aplicaţia
pe circuitul FPGA, trebuie realizată compilarea proiectului în vederea obţinerii fişierului .sof
(SRAM Object File), fişier necesar programării sistemului Cyclone III. Pentru aceasta se va
selecta opţiunea Start Compilation din meniul Processing.
După terminarea compilării şi obţinerea fişierului .sof, se selectează din meniul
Tools opţiunea Programmer. În fereastra care se deschide se apasă butonul Hardware
Setup pentru a se configura interfaţa USB-Blaster necesară comunicării cu kitul de
dezvoltare Cyclone III. În acest moment, placa trebuie să fie conectată pe USB şi
alimentată. Se selectează interfaţa USB-Blaster şi se închide fereastra apăsând butonul
OK. În fereastra programatorului se selectează modul de conectare ca fiind modul JTAG,
se încarcă dacă este necesar fişierul .sof obţinut la compilare şi se dă clic pe butonul Start.
După încărcarea 100% a programului se poate testa pe placă funcţionarea schemei
implementate, respectiv a porţii logice ŞI.

23
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Figura 3.21. – Asignarea pinilor

Figura 3.22. – Programarea kitului de dezvoltare Cyclone III

24
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA
FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

4. Desfăşurarea lucrării
1. Se vor crea proiecte pentru fiecare din porţile logice fundamentale ŞI, SAU,
NU, SAU-NU, ŞI-NU, SAU-EXCLUSIV. Se vor compila, se va simula funcţional
funcţionarea lor şi se vor implementa pe kitul de dezvoltare Cyclone III Starter
Kit. Intrările porţilor logice se vor conecta la butoanele utilizator, iar ieşirile
acestora se vor conecta la LED-uri.

2. Se va crea o entitate numită BUZZER (exemplul prezentat în documentaţia


laboratorului). Se va compila şi se va simula funcţionarea ei şi se va captura
fişierul Waveform corespunzător. Se va implementa pe kitul de dezvoltare.

25

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