trei_unu

21
Xilinx ISE este un mediu de programare care poate fi folosit la proiectarea şi simularea sistemelor digitale [8]. În terminologia Xilinx, un circuit digital este reprezentat de un proiect. Un proiect poate conţine mai multe fişiere sursă: 1. modele scrise în VHDL, ABEL, Verilog, scheme logice, graf de tranziţie a stărilor. 2. pachete în care se definesc constante şi variabile 3. programe de test scrise în VHDL, ABEL, Verilog sau de tip forme de undă În această carte vom lua în considerare modelarea circuitelor digitale folosind VHDL, scheme logice şi grafuri de tranziţie a stărilor. Simularea se va face fie folosind un test bench de tip forme de undă fie unul scris în VHDL. 3.1 Crearea unui proiect nou Pentru a forma un proiect nou se parcurg următoarele etape [8]: 1. Selectaţi File > New Project…. Va apărea fereastra de dialog New Project Wizard. 2. Tastaţi titlul proiectului în câmpul Project Name. Să presupunem că titlul este tutorial. 3.Introduceţi sau căutaţi o locaţie pentru noul proiect. Se va crea automat un subdirector cu numele proiectului. În acest caz, tutorial. 4. Verificaţi faptul că în câmpul Top-Level Source Type este selectat HDL. 5. Click Next pentru a deschide fereastra de dialog Device Properties. 6. Introduceţi proprietăţile dorite. Pentru acest exemplu, introduceţi următoarele: a. Product Category: All b. Family: Spartan3 3.2 CREAREA UNEI SURSE VHDL / 46

description

vhdl

Transcript of trei_unu

Page 1: trei_unu

Xilinx ISE este un mediu de programare care poate fi folosit la proiectarea şi simularea sistemelor digitale [8]. În terminologia Xilinx, un circuit digital este reprezentat de un proiect. Un proiect poate conţine mai multe fişiere sursă:

1. modele scrise în VHDL, ABEL, Verilog, scheme logice, graf de tranziţie a stărilor.

2. pachete în care se definesc constante şi variabile3. programe de test scrise în VHDL, ABEL, Verilog sau de tip forme de undă

În această carte vom lua în considerare modelarea circuitelor digitale folosind VHDL, scheme logice şi grafuri de tranziţie a stărilor. Simularea se va face fie folosind un test bench de tip forme de undă fie unul scris în VHDL.

3.1 Crearea unui proiect nou

Pentru a forma un proiect nou se parcurg următoarele etape [8]:1. Selectaţi File > New Project…. Va apărea fereastra de dialog New Project Wizard.2. Tastaţi titlul proiectului în câmpul Project Name. Să presupunem că titlul este

tutorial.3. Introduceţi sau căutaţi o locaţie pentru noul proiect. Se va crea automat un

subdirector cu numele proiectului. În acest caz, tutorial.4. Verificaţi faptul că în câmpul Top-Level Source Type este selectat HDL.5. Click Next pentru a deschide fereastra de dialog Device Properties.6. Introduceţi proprietăţile dorite. Pentru acest exemplu, introduceţi următoarele:

a. Product Category: Allb. Family: Spartan3c. Device: XC3S200d. Package: FT256e. Speed Grade: -4f. Top-Level Module Type: HDLg. Synthesis Tool: HDLh. Simulator: ISE Simulator (VHDL/Verilog)i. Verificaţi că este selectat câmpul Enable Enhanced Design

SummaryPastraţi valorile implicite în celelalte câmpuri.Când tabelul este completat, trebuie să arate în felul următor:

3.2 CREAREA UNEI SURSE VHDL / 46

Page 2: trei_unu

7. Click Next pentru a trece la fereastra Create New Source in New Project Wizard.

3.2 Crearea unei surse VHDL

Pentru a forma un fişier sursă VHDL se parcurg următorii paşi [8]:

1. Click butonul New Source din ferestra de dialog New Project Wizard2. Selectaţi VHDL Module ca tip de sursă3. Introduceţi numele fişierului. Presupunem că acesta este counter.4. Verificaţi căsuţa Add to project să fie selectată5. Click Next6. Declaraţi porturile circuitului pe care îl proiectaţi şi completaţi informaţia de

port după cum se indică în figura de mai jos.

/ Cap 3 TUTORIAL XILINX ISE 9.2i47

Page 3: trei_unu

7. Click Next, apoi Finish în fereastra de dialog New Source Information pentru a finaliza procesul de formare a şablonului sursei.

8. Click Next, apoi Next, apoi Finish.

Fişierul sursă, conţinând entitatea şi arhitectura, se va afişa în spaţiul de lucru (Workspace); counter va apărea în fereastra Sources, ca în figura de mai jos.

3.4 EDITAREA FINALĂ A SURSEI VHDL / 48

Page 4: trei_unu

3.3 Folosirea construcţiilor predefinite pentru a scrie programul VHDL

Următorul pas în crearea unei surse noi este completarea descrierii de entitate şi a celei de comportament, folosind instrucţiunile limbajului VHDL.

Există şi posibilitatea alegerii unor construcţii predefinite în ISE, după care să se adapteze programul obţinut la cerinţele utilizatorului. Vom arăta cum se procedeaza în acest din urmă caz [8].

1. Plasaţi cursorul chiar sub declaraţia begin din interiorul arhitecturii.2. Deschideţi fereastra de construcţii predefinite din Edit > Language

Templates….3. Folosind casuţa +, identificaţi următorul exemplu de cod:VHDL > Synthesis Constructs > Coding Examples > Counters > Binary > UP/Down Counters > Simple Counter4. Având Simple Counter selectat, selectaţi Edit > Use in File sau, folosiţi

butonul Use Template in File din toolbar. În acest fel, se copiază construcţia predefinită în fişierul sursă pentru numărătorul counter.

5. Închideţi Language Templates.

3.4 Editarea finală a sursei VHDL

1. Adăugaţi următoarea declaraţie de semnal imediat sub declaraţia de arhitectură şi înainte de prima declaraţie begin:

signal count_int: std_logic_vector(3 downto 0) := "0000";

2. Particularizaţi sursa counter înlocuind numele semnalelor şi ale porturilor cu cele pe care le-aţi introdus deja:

- înlocuţi toate apariţiile <clock> cu CLOCK- înlocuiţi toate apariţiile <count_direction> cu DIRECTION- înlocuiţi toate apariţiile <count> cu COUNT_INT

3. Adăugaţi următoarea linie imediat sub declaraţia end process;

COUNT_OUT <= count_int;

4. Salvaţi fişierul selectând File > Save

Dupa ce aţi terminat, fişierul sursă counter ar trebui să arate în felul următor:

/ Cap 3 TUTORIAL XILINX ISE 9.2i49

Page 5: trei_unu

library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;-- Uncomment the following library declaration if instantiating-- any Xilinx primitive in this code.--library UNISIM;--use UNISIM.VComponents.all;

entity counter isPort ( CLOCK : in STD_LOGIC;DIRECTION : in STD_LOGIC;COUNT_OUT : out STD_LOGIC_VECTOR (3 downto 0));

end counter;

architecture Behavioral of counter issignal count_int : std_logic_vector(3 downto 0) := "0000";begin

process (CLOCK)beginif CLOCK='1' and CLOCK'event thenif DIRECTION='1' thencount_int <= count_int + 1;

elsecount_int <= count_int - 1;

end if;end if;end process;

COUNT_OUT <= count_int;end Behavioral;

Aţi creat astfel o sursă VHDL pentru proiectul tutorial.

3.5 Simularea unui proiect

Verificarea funcţionalităţii folosind simularea comportamentală

Se formeaza un test bench de tip forme de undă care conţine intrări (stimuli) pe care le puteţi folosi pentru a verifica funcţionalitatea modulului counter. Test bench-ul de tip forme de undă este o reprezentare grafică a unui test bench.

Se generează acest test bench – forme de undă în felul următor [8]:1. Selectaţi fişierul VHDL counter din fereastra Sources2. Creaţi o nouă sursă de tip test bench selectând Project > New Source3. În fereastra New Source Wizard, selectaţi Test Bench WaveForm ca tip

de sursă, şi introduceţi numele, de exemplu counter_tbw, în câmpul File Name

4. Click Next

3.5 SIMULAREA UNUI PROIECT / 50

Page 6: trei_unu

5. Pagina Associated Sources arată că asociaţi test bench-ul de tip forme de undă cu fişierul sursă counter. Click Next

6. Pagina Summary arată că sursa va fi adaugată la proiect, şi se afişează directorul sursă, tipul şi numele. Click Finish.

7. Este nevoie să setaţi frecvenţa semnalului de ceas, timpul de setup si întârzierile la ieşire în fereastra de dialog Initialize Timing, înainte de a se deschide ferestra de editare a fişierului test bench – forme de undăCerinţele pentru acest proiect sunt:

- numărătorul trebuie să funcţioneze corect cu o frecvenţă de ceas = 25 MHz

- intrarea DIRECTION va fi validă cu 10 ns înainte de apariţia frontului crescător al semnalului CLOCK

- ieşirea COUNT_OUT trebuie să fie validă la 10 ns după frontul crescător al semnalului CLOCK

Cerinţele corespund cu valorile de mai jos.Completaţi câmpurile din fereastra Initialize Timing, cu următoarele date:

- Clock Time High: 20 ns- Clock Time Low: 20 ns- Input Setup Time: 10 ns- Output Valid Delay: 10 ns- Offset: 0 ns- Global Signals: GSR(FPGA)Observaţie: Când GSR(FPGA) este setat, se adaugă automat 100 ns la valoarea offsetului- Initial Length of Test Bench: 1500 ns

Păstraţi valorile implicite în celelalte câmpuri

/ Cap 3 TUTORIAL XILINX ISE 9.2i51

Page 7: trei_unu

8. Click Finish pentru a termina iniţializarea9. Zonele colorate cu verde, care preced fronturile crescătoare ale CLOCK

corespund valorii Input Setup Time din fereastra de dialog Initialize Timing. Activaţi portul DIRECTION pentru a defini stimuli pentru numărătorul counter după cum urmează

- Click pe zona verde la aproximativ 300 ns pentru a seta DIRECTION la valoarea 1, astfel încât numărătorul să numere înainte

- Click pe zona verde la aproximativ 900 ns pentru a seta DIRECTION la valoarea 0, astfel încât numărătorul să numere înapoi

3.5 SIMULAREA UNUI PROIECT / 52

Page 8: trei_unu

10. Salvaţi formele de unda11. În fereastra Sources, selectaţi Behavioral Simulation pentru a vedea că test

bench-ul a fost adăugat automat la proiect.12. Închideţi fişierul test bench.

Generarea unui fişier test bench cu auto-verificare

Adăugaţi valorile aşteptate ale ieşirilor pentru a încheia formarea fişierului test bench – forme de undă. Această operaţie va transforma fişierul într-o entitate care se auto-verifică.

Valorile de ieşire se pot edita manual sau automat. Generarea automată are loc prin rularea procesului Generate Expected Results. Apoi, inspectaţi valorile de ieşire pentru a fi siguri că acestea sunt cele pe care le aşteptaţi.

Pentru a forma automat un fişier test bench cu auto-verificare, se parcurg urmatoărele etape [8]:

1. Verificaţi că Behavior Simulation este selectat din lista din fereastra Sources.

2. Selectaţi fişierul counter_tbw în fereastra Sources3. În tabul Processes, click + pentru a extinde procesul Xilinx ISE Simulator şi

click dublu pe procesul Generate Expected Simulation Results. Acest proces simulează proiectul.

4. Se deschide fereastra de dialog Expected Results. Selectaţi Yes pentru a adnota rezultatele la test bench.

/ Cap 3 TUTORIAL XILINX ISE 9.2i53

Page 9: trei_unu

5. Click + pentru a extinde bus-ul COUNT_OUT şi observaţi tranziţiile care corespund valorilor Ouput Delay (celule galbene) specificate în fereastra de dialog Initialize Timing.

6. Salvaţi fişierul test bench – forme de undă şi închideţi.Aţi format astfel un fişier test bench cu auto-verificare.

Simularea funcţionării proiectului

Verificaţi faptul că proiectul counter funcţioneză conform aşteptărilor. Se parcurg următoarele etape [8]:

1. În fereastra Sources selectaţi Behavioral Simulation şi counter_tbw2. În tabul Processes, click + pentru a extinde procesul Xilinx ISE Simulator;

click dublu pe procesul Simulate Behavioral Model.Se deschide ISE Simulator şi se execută simularea până la sfârşitul fişierului test bench.

EXERCIŢII ŞI PROBLEME / 54

Page 10: trei_unu

3. Pentru a vedea rezultatele simulării, selectaţi tabul Simulation şi folositi zoom pentru a vedea şi nota momentele tranziţiilor.

Formele de undă care se obţin la simulare ar trebui să arate în felul următor:

4. Verificaţi că numărătorul numără înainte şi înapoi, după cum trebuia. Notaţi rezultatele.

5. Închideţi fereastra de simulare. Dacă apare mesajul “You have an active simulation open. Are you sure you want to close it?”, click Yes.

Aţi încheiat simularea proiectului cu ajutorul ISE Simulator.

Exerciţii şi probleme

3.1 Cine este fabricantul familiei Spartan3? Ce dispozitive fac parte din această familie? Prezentaţi o schemă bloc a dispozitivului XC3S200. Descrieţi funcţionarea acestui dispozitiv. Este un CPLD, FPGA, PLA sau PAL?

3.2 Identificaţi alte familii de dispozitive programabile realizate de acelaşi fabricant?

3.3 Identificaţi alţi fabricanţi de dispozitive programabile şi listaţi câteva dispozitive?

3.4 Prezentaţi schema bloc a circuitului descris în acest capitol precum şi schema logică (circuitul este format din mai multe componente elementare).

/ Cap 3 TUTORIAL XILINX ISE 9.2i55

Page 11: trei_unu

3.5 Comentaţi în scris fişierul sursă VHDL al numărătorului.3.6 De ce este nevoie de introducerea semnalului count_int? Nu cumva este

posibil să se folosească numai semnalul COUNT_OUT? 3.7 După ce a fost scrisă sursa VHDL pentru numărător, se poate face sinteza

circuitului proiectat. Mai întîi se compilează sursa creată. Pentru aceasta, selectaţi sursa *.vhd în ferestra Sources, tab-ul Synthesis/Implementation trebuie să fie setat. În fereastra Proceses, click pe + din dreptul Synthesize-XST, apoi dublu click pe Synthesize-XST. Dacă apar erori la compilare acestea trebuie eliminate. După ce compilarea s-a efectuat cu succes, se face sinteza circuitului, adică se obţine schema cu elemente din dispozitivul care a fost selectat atunci când s-a format proiectul curent. Schema se obţine cu dublu click pe View RTL Schematic.

3.8 Prezentaţi schema circuitului de numărare la toate nivelurile de ierarhizare.3.9 Prezentaţi în scris care sunt semnificaţiile câmpurilor Clock Time High,

Clock Time Low, Input Setup Time, Output Valid Delay, Offset, Initial Length of Test Bench din fereastra Initialize Timing.

3.10 Folosiţi un Marker pentru a observa valorile de intrare şi de ieşire la anumite momente din timpul de simulare. Folosiţi un Measure Marker pentru a măsura intervalul de timp între două evenimente.

3.11 Prezentaţi în scris rezultatele comentate ale simulării. 3.12 Modificaţi proiectul numărătorului astfel încât acesta să fie un numărător

reversibil zecimal.3.13 Prezentaţi un raport scris care să conţină răspunsurile la toate întrebările şi

exerciţiile de mai sus.

3.6 Crearea unei surse folosind editorul de scheme logice

Una dintre facilităţile oferite de Xilinx ISE 9.2i este posibilitatea realizării sintezei şi simulării circuitelor digitale ale căror scheme logice au fost deja elaborate. Aşadar, în acest paragraph presupunem că dispunem de schema logică a unui circuit sau va trebui să parcurgem nişte etape de proiectare “clasică” pentru a obţine această schemă.

După ce schema logică a fost obţinută (într-un fel sau în altul), etapele care trebuie parcurse pentru a verifica funcţionarea (simulare) sunt cele descrise în continuare (în acest caz nu mai este necesară etapa de sinteză, dar ea poate fi interesantă pentru a putea compara schema iniţială cu schema de implementare cu PLD a circuitului respectiv).

1. Porniţi mediul de programare Xilinx ISE prin dublu click pe iconul de pe desktop sau selctând Start->Programs->Xilinx ISE 9.2i->Project Navigator.

2. Selectaţi File->New Project, pentru a începe elaborarea unui nou proiect3. Se va deschide fereastra de dialog New Project4. Introduceţi numele proiectului în spaţiul Project Name; de exemplu,

proiect_sch. 5. Alegeţi locaţia dorită pentru noul proiect.

3.6 CREAREA UNEI SURSE FOLOSIND EDITORUL DE SCHEME LOGICE / 56

Page 12: trei_unu

6. Selectaţi proprietăţile dispozitivului PLD cu care doriţi să implementaţi proiectul. De exemplu

- Selectaţi Spartan2 în spaţiul Device Family- Selectaţi xc2s50 în spaţiul Device- Selectaţi tq144 în spaţiul Package- Selectaţi -5 în spaţiul Speed- Selectaţi XST VHDL în spaţiul Design Flow- Click OK

7. Apăsaţi tab-ul New Source pentru a forma o nouă sursă pentru acest proiect8. În noua fereastră, selectaţi tipul acestei surse, Schematic, şi în spaţiul File

Name introduceţi numele dorit;de exemplu, schema_unu. Click Next, Finish, Yes…..

9. Se va deschide fereastra editorului de scheme în care puteţi introduce sursele pe care le doriţi, alegându-le din Categories şi Symbols (din fereastra Sources).

10. Editaţi schema circuitului dorit. Selectaţi dispozitivul dorit şi apoi click în fereastra de editare pentru a-l plasa în schemă.

11. Conectaţi porţile, dispozitivele, etc. cu ajutorul conexiunilor (Wire).12. La intrări şi la ieşiri folosiţi borne de intrare/ieşire (I/O Markers). În unele

cazuri, la intrări şi ieşiri se folosesc buffere. Denumiţi bornele (semnalele) de intrare/ieşire.

13. Să presupunem că realizaţi următorul circuit

14. După ce aţi editat această shemă, verificaţi dacă există erori (Tools – Check Schematic)

/ Cap 3 TUTORIAL XILINX ISE 9.2i57

Page 13: trei_unu

15. Creaţi un simbol pentru circuitul pe care l-aţi realizat (Tools – Symbol Wizard)

16. Salvaţi fişierul schema_unu.17. Simulaţi funcţionarea circuitului folosind metoda prezentată mai înainte, în

acest capitol (Formaţi un fişier de test de tip forme de undă).18. Completaţi tabelul de adevăr pentru acest circuit. Care este funcţia pe care o

realizează?

Exerciţii şi probleme

3.14 În Figura 3.1a sunt prezentate regulile pentru adunarea binară. Studiind coloana Sum din tabelul de adevăr, observaţi că valorile ieşirii pentru fiecare combinaţie de intrare sunt aceleaşi cu acelea obţinute cu o poartă XOR (număr impar de 1 la intrare formează un 1 la ieşire). Coloana Carry corespunde unei funcţii AND (dacă cel puţin o intrare este 0, ieşirea este 0).

Remarcă. Dacă aceste observaţii nu sunt evidente, atunci încercaţi să minimizaţi expresiile celor două funcţii de ieşire: Sum şi Carry.Aşadar, pentru a aduna doi biţi, şi , putem conecta un operator XOR şi un

operator AND, ca în Figura 3.2b. La ieşre se obţin semnalele Sum şi Carry.Circuitul din Figura 3.1b se numeşte semi-sumator (half-adder) şi poate fi folosit

atunci când este nevoie să adunăm doi biţi. Totuşi, în majoritatea cazurilor este nevoie să adunăm trei biţi. De exemplu, pentru a aduna 112 cu 012. Mecanismul de adunare şi de obţinere a bitului de transport este prezentat în Figura 3.2. Pentru a aduna biţii cel mai puţin semnificativi (coloana cea mai din dreapta) este suficient un semi-sumator (doi biţi) dar la coloana următoare se adună trei biţi: cei doi biţi ai numărului şi bitul de transport de la adunarea anterioară (de la rangul inferior). Pentru a aduna trei biţi este nevoie de un alt circuit logic (sumator complet, Full-Adder), care să aibă la intrare semnalele , şi şi care să ofere la ieşire şi .

Tabelul de adevăr pentru acest circuit este prezentat în Figura 3.3. Sumatorul complet se poate obţine cu ajutorul a două semi-sumatoare şi al unei porţi OR, ca în Figura 3.4.

EXERCIŢII ŞI PROBLEME / 58

Fig. 3.1 a) Tabelul de adevăr pentru adunarea a doi biţi; b) Schema logică a unui semi-sumator.

SumCarry0000011010101101

AB

Sum

Carry

Semi-sumator

a) b)

Page 14: trei_unu

3.15 Simulaţi funcţionarea acestui sumator complet în două implementări: a) folosind direct porţile AND, XOR, OR; b) folosind două semi-sumatoare şi o poartă SAU.

3.16 Prezentaţi formele de undă comentate care explică funcţionarea unui semi-sumator şi a unui sumator complet.

3.17 Folosiţi un Marker pentru a observa valorile de intrare şi de ieşire la anumite momente din timpul de simulare. Folosiţi un Measure Marker pentru a măsura intervalul de timp între două evenimente.

3.18 Folosnd acelaşi principiu, realizaţi un sumator pentru două cuvinte de câte doi biţi.

3.19 Prezentaţi un raport scris care să conţină răspunsurile la toate întrebările şi exerciţiile de mai sus.

/ Cap 3 TUTORIAL XILINX ISE 9.2i

Carry1111+01Sum100Fig. 3.2 Exemplu de adunare binară.

0000000110010100110110010101001100011111

Fig. 3.3 Tabelul de adevăr pentru un sumator complet.

AB

S

C

Semi-sumator

S

C

Semi-sumator

InCarry _

OutCarry _

Sum

Fig. 3.4 Schema logică a unui sumator complet.

59