Sunteți pe pagina 1din 97

Latch-ul NAND. Latch-ul D.

Bistabilul D

Obiective:

După parcugerea cu succes a laboratorului veţi fi capabili să:

 realizaţi schema logică a latch-lui NAND;


 realizaţi modelul Simulink al latch-lui NAND;
 implementaţi în VHDL latch-ul D;
 realizaţi modelul Simulink al latch-lui D;
 implementaţi în VHDL un bistabil D;
 realizaţi modelul Simulink al unui bistabil D;
 verificaţi modelele create folosind simulatoarele Xilinx ISE, ModelSim, Simulink;
 să realizaţi cosimularea pentru latch-ul D şi bistabilul D (Simulink-ModelSim).
 realizaţi implementarea în FPGA a latch-ului D şi a bistabilului D;

Referinţe:

o Digital Design with CPLD Applications & VHDL


o Chapter 7 Introduction to Sequential Logic:
 7.2 NAND/NOR Latches,
 7.3 Gated Latches,
 7.4 Edge-Triggered D Flip-Flops;
o Spartan 3 FPGA Tutorial.

Echipament necesar:

- Xilinx ISE 10.1;


- ModelSim SE III 6.3f;
- MATLAB-Simulink;
- Dispozitiv FPGA Spartan 3.

1
Noţiuni teoretice:

I. Latch-ul NAND

Latch-ul este cel mai simplu circuit secvenţial. Latch-ul are două intrări, SET şi RESET
şi două ieşiri complementare Q şi nQ. Dacă latch-ul funcţionează normal ieşirile se află în stări
logice opuse. Un astfel de circuit poate fi construit folosind porţi NOR (latch activ-HIGH)
sau NAND (latch activ -LOW) .
Schema unui latch NAND realizată în forma echivalentă a lui De Morgan:

Figura9.1 NAND Latch

Intrările acesui tip de latch(nS,nR) sunt activ-LOW iar ieşirile sunt activ-HIGH. O intrare
LOW la poarta corespunzătoare ieşirii Q face Q=1, prin urmare aceasta este intrarea SET, iar
intrarea celeilalte porţi este RESET.
Pentru a întelege modul de funcţionare al circuitului ţinem cont de faptul că acesta este
similar cu al unui buton cu două funcţi, START (SET) şi STOP (RESET). Să presupunem că
butonul este folosit pentru a controla un motor. Când se apasă butonul START (nS devine LOW)
motorul porneşte (Q devine HIGH) şi îşi menţine starea chiar dacă butonul START este eliberat
(nS redevine HIGH). Dacă repentăm apăsarea butonului START (nS devine LOW şi apoi din nou
HIGH) motorul îşi menţine starea precedentă de funcţionare (Q =HIGH). Motorul se opreşte (Q
devine LOW) doar la apăsarea butonului STOP (nR devine LOW). Acesta îşi menţine starea
chiar dacă butonul STOP este eliberat (nR redevine HIGH) sau dacă se apasă din nou butonul
STOP. Dacă nu se apasă niciun buton (nS şi nR sunt HIGH) motorul îşi păstrează strea
precedentă (Q=Qprecedent). Este interzisă apăsarea simultană a butonelor (nS=LOW şi
nR=LOW).

Funcţiile latch-lui ţinând cont de combinaţia de intrare sunt sintetizate în tabela de mai
jos:
2
Figura9.2 Tabela de funcţii a Latch-ului NAND

Latch-ul NAND are două stări stabile posibile. În ambele cazuri intrările SET şi RESET
sunt HIGH.

Figura 9.3 Stările stabile ale latch-ului NAND

Tranziţia unui latch NAND de la starea de RESET la cea de SET este reprezentată în
figura de mai jos

3
Figura9.4 Tranziţia RESET-SET a latch-lui NAND

Realizarea tranziţiei SET-RESET în cazul unui latch NAND se evidenţiază mai jos:

Figura9.5 Tranziţia SET-RESET a latch-ului NAND

În reprezentările din figurile 9.4 şi 9.5 s-au luat în considerare întârzierile determinate de
porţile XOR.
În funcţionarea unui latch NAND poate există şi starea interzisă reprezentată în figura
următoare; aceasta apare de fapt atunci când intrările care sunt ambele LOW se schimbă :

4
Figura9.6 Starea interzisă a latch-ului NAND

II. Latch-ul D

Latch-ul D (latch-ul transparent) este un latch controlat de o intrare numită ENABLE.


Principala funcţie a acestui latch este aceea de a reţine date (poate funcţiona ca un circuit de
memorie).
Latch-ul D este un latch NAND care evită starea interzisă (nS=LOW şi nR=LOW) fiind
configurat astfel încât intrările nS şi nR sunt mereu în opoziţie. Acesta are o intare de date D şi o
intrare ENABLE.

Figura 9.7 Latch-ul D

Latch-ul D poate funcţiona în două moduri. Atunci când intrarea ENABLE este HIGH,
latch-ul este transparent, ieşirea Q urmăreşte intrarea D; când ENABLE este LOW latch-ul
păstrează datele anterioare. Intrarile D şi ENABLE sunt asincrone.
Stările de funcţionare posibile ale latch-ului D pot fi uşor înţelese urmărind figurile de
mai jos.

5
Figura 9.8 Funcţionare latch D

Tabela de funcţii a lach-ului D arată influenţa intrării ENABLE asupra modului de


propagare adatelor în ieşire.

Figura 9.9 Tabela de funcţii a latch-ului D

III. Bistabilul D

6
Un circuit bistabil este un latch a cărui ieşire se modifică pe frontul semnalului de ceas.

a.Tranziţie LOW-HIGH b. Tranziţie HIGH-LOW


(front crescător) (front descrescător)

Figura 9.10 Fronturi ale semnalului de ceas

Diferenţa dintre un latch şi un bistabil este aceea că primul este sensibil la nivel sau
“static”, iar cel din urmă este sensibil la frontul semnalului de ceas sau “dinamic”.
Spre deosebire de latch-ul D ieşirile bistabilului D se schimbă pe frontal crescător al
semnalului de ceas. Dacă în cazul latch-ului D ieşirea Q urmărea intrarea D atâta timp cât
intrarea ENABLE era HIGH, în cazul bistabilului intrarea D este reprodusă în ieşirea Q doar pe
frontul crescător al semnalului de ceas. Bistabilul D poate avea în plus şi un circuit detector de
front care transformă frontul activ al semnalului de ceas într-un impuls.

Figura 9.11 Circuit detector de front pozitiv

Figura 9.12 Bistabilul D

Modul de funcţionare al unui bistabil D este prezentat în figura următoare.

7
Figura 9.13 Funcţionarea bistabilului D

O sinteză a modului de funcţionare a bistabilului D este dată de tabela funcţiilor.

Figura 9.14 Tabela functiilor bistabilului D

Desfăşurarea lucrării practice de laborator:

8
Modelare-simulare în MATLAB-Simulink
I. Latch-ul NAND
Se propune realizarea modelării şi simulării latch-ului NAND cu ajutorul figurii de mai
jos în care se va ţine cont de legile algebrei booleane şi de figura 9.1.

Pasul 1:
-se porneşte MATLAB-Simulink din linia de comandă folosind comanda >>simulink sau
butonul Simulink din bara de butoane.

Pasul 2:

9
- se creează un nou model File->New->Model sau prin combinaţia de taste Ctrl+N

- va apărea următoarea fereastră unde se va realiza modelul Simulink

- înainte de a începe realizarea schemei se salvează modelul : File->Save As…


cu numele nandLatch

Pasul 3: Se setează parametrii simulării: Simulation->Configuration Parameters... sau Ctrl+E

10
În fereastra apărută se completează câmpurile parametrilor astfel:

Pasul 4: Pentru realizarea schemei se vor folosi următoarele blocuri:

11
Blocurile introduse au nevoie de anumite setări. Pentru a seta parametrii corespunzatori
se dă dublu-click pe bloc şi se deschide fereastra Block Parameters.
Figurile de mai jos indică modul în care trebuie aleşi parametrii blocurilor utilizate în schemă.

12
13
Pasul 5: După realizarea schemei pentru a vizualiza rezultatul se procedează astfel:
- se dă dublu click pe blocul Scope pentru a deschide osciloscopul ;
- se dă click pe butonul Run din bara de butoane pentru a porni simularea.

14
Din figura de mai jos obţinută în urma simulării se pot observa funcţiile latch-ului NAND
prezentate în partea teoretică a lucrării.

II. Latch-ul D
15
În continuare se propune realizarea modelării şi simulării latch-ului D cu ajutorul figurii
de mai jos în care se ţine cont de legile algebrei booleane şi de figura 9.7.

Pentru a îndeplini sarcina se vor urma paşii de la latch-ul NAND cu anumite modificări:
- la pasul 2 se salvează fişierul cu numele latchd.mdl;
- la pasul 4 se adaugă în plus blocul următor:

- se modifică de asemenea unele setări ale parametrilor:

16
- pentru celelalte două blocuri Step se modifică astfel : Step time: 2 respectiv 5, Initial
Value:1 respectiv 0 şi Final Value: 0 respectiv 1.

17
Urmând paşii corespunzători în urma simulării s-a obţinut figura de mai jos în care se pot
observa funcţiile latch-ului D prezentate în partea teoretică a lucrării.

Observaţie:

Latch-ul D este activ pe nivel.

18
III. Bistabilul D
Se va realiza ultimul model Simulink propus în lucrarea de laborator, bistabilul D cu
ajutorul figurii următoare în care s-a ţinut cont de legile algebrei booleane şi de figurile 9.11 şi
9.12.

Pentru a se îndeplini sarcina se vor urma paşii de la latch-ul NAND cu anumite


modificări:
- la pasul 2 se salvează fişierul cu numele dbistabil.mdl;
- la pasul 4 se adaugă în plus blocurile următoare:

- se modifică de asemenea unele setări ale parametrilor:

19
o se observă din schema bistabilului D faptul că semnalul de ceas negat este
întârziat cu un număr de întârzieri egal cu 100; se setează în blocul Integer Delay
parametrul Number of delays: 100.
o pentru blocul Scope, osciloscopul multicanal, se setează parametrul Number of
axes: 5
o pentru blocul From Audio Device se folosesc setările de mai jos:

În final s-a obţinut figura de mai jos în care se pot observa funcţiile bistabilului D
prezentate în partea teoretică a lucrării.

Observaţie:
Se observă din figura de mai jos că bistabilul D este activ pe frontul crescător al
semnalului de ceas.

20
Concluzii:
Prin modelele realizate şi simulate cu ajutorul soft-ului MATLAB-Simulink s-au
identificat din nou funcţiile latch-ului şi ale bistabilului observate în prima parte a lucrării de
laborator.

21
Modelare-simulare în Xilinx ISE 10.1
I. Latch-ul NAND
În continuare se va realiza schema logică a latch-ului de tip NAND.
Pasul 1: Se deschide aplicaţia Xilinx ISE 10.1
Pasul 2: Din bara de meniuri a aplicaţiei se selectează File New Project...

Pasul 3: În fereastra de dialog apărută:


- se completează câmpul Project name cu numele proiectului, nandLatch;
- se selectează locaţia în care se doreşte salvarea proiectului ,
D:\Laboratoare\Laborator9\;
- pentru câmpul Top-level source type se alege opţiunea Schematic;
- se dă click pe butonul Next.

22
Pasul 4: În noua fereastra de dialog se completează câmpurile conform modelului următor şi se
dă click pe butonul Next.

Pasul 5: În fereastra următoare se dă click pe butonul New Source şi apoi pe Next.

Pasul 6: Apare o fereastra ca cea de mai jos unde:


23
- se alege ca tip de fişier Schematic;
- se completează câmpul File nume cu numele fişierului, nand_latch_sch ;
- se dă click pe butonul Next.

Pasul 7: În fereastra următoare:


- se dă click pe butonul Finish;
- apoi click pe butonul Yes din caseta de dialog;
- click pe butonul Next în următoarele două ferestre;
- în final click pe butonul Finish.

Dacă s-a procedat corect ar trebui să aveţi la final următorul rezultat:

24
Pasul 8: Se realizează schema din figura 9.1 folosind două porţi OR2B2, fire şi I\O markere:
- se introduc în schemă porţile logice; pentru a face acest lucru se scrie numele porţii în
câmpul Simbol Name Filter;
- se dă click pe simbolul apărut;
- folosind tehnica drag and drop se introduce poarta în schemă.

- pentru a adăuga firele se foloseşte butonul Add Wire ;


- pentru adaugarea porturile (I\O Markers) se dă click pe butonul Add I\O Marker
25
- cu un click-stânga se adaugă markere la fiecare intrare şi ieşire;
- pentru a redenumi markerele se dă click-dreapta pe marker şi apoi se selectează Rename
Port

Butonul Add Wire Butonul Add I\O Marker

Schema finală a latch-ului de tip NAND trebuie să arate precum cea din figura următoare:

Acum se va crea un fişier de tip test bench waveform pentru a verifica funcţionarea
corectă a latch-ului NAND. Se vor introduce date experimentale de intrare şi se va verifica dacă
ieşirea corespunde indicaţiilor teoretice.
26
Pentru a crea fişierul de test trebuie parcurgeţi următorii paşi:
Pasul 1: Se dă click dreapta ca în figură şi se selectează New Source

Pasul 2: Se selectează tipul fişierului Test Bench Waveform şi se denumeşte nandLatch_tbw.


Pentru ca fişierul să fie adăugat proiectului curent se bifează căsuţa Add to project.

Pasul 3: Se selectează fişierul sursă pentru care se crează test bench-ul, se dă click pe Next, apoi
Finish

Pasul 4: În fereastra următoare se selectează Combinational pentru Clock Information şi se


setează o durata a testului de 4000 ns.

27
Pasul 5: Se selectează datele de intrare nSet şi nR:
- în dreptul fiecărei intrări există zona semnalelor de intrare. Aceste semnale pot fi
modelate prin simpla apăsare în zona dreptunghiurilor albastre. Printr-un click pe această
zonă semnalul basculează din 0 logic în 1 logic şi invers. Se încearcă urmărirea în
realizarea semnalului toate combinaţiile de intrare posibile prezentate în figura 9.2. Un
exemplu ar putea fi cel de mai jos.
Observaţie: S-a folosit notaţia nSet pentru a evita o eroare la simulare cauzată de confuzia lui nS
cu ns(nano-secunda).

- după ce s-au setat intrările se dă click pe Sources;


- se selectează modul Behavioral Simulation;

28
- se dă click pe Test Bench-ul proiectului şi (pentru acesta) se porneşte simularea (prin
dublu-click pe Simulate Behavioral Model).

Dacă s-au urmărit paşii anteriori ar trebui să se obţină rezultatele din fereastra de mai jos.
Semnalele cu verde arată simularea comportamentului latch-ului NAND.

29
Analiza rezultatelor obţinute permite să se observe funcţiile posibile ale latch-ului
NAND.

 Simularea funcţiei SET a latch-ului NAND

Se observă că atunci când nSet devine 0 logic (LOW), iar nR rămâne 1 logic (HIGH), Q
devine 1 logic (HIGH) realizându-se astfel funcţia SET. Atunci când nSet devine din nou 1 logic
latch-ul îşi păstrează ieşirea anterioară (Q=HIGH).

 Simularea funcţiei RESET a latch-ului NAND

30
În cazul în care nR devine 0 logic (LOW), iar nSet rămâne 1 logic (HIGH), Q devine 0
logic (LOW) realizându-se astfel funcţia RESET. nR poate deveni din nou 1 logic (HIGH) caz în
care latch-ul îşi păstrează starea anterioară (LOW).

 Simularea stării interzise a latch-ului NAND


Atunci când nR şi nSet devin simultan 0 logic (LOW), iarQ şi nQ sunt ambele 1 logic (HIGH).
o Caz1:

Atunci când nR şi nSet devin simultan 0 logic (LOW) şi nR devine 1 logic (HIGH)
înaintea lui nSet, latch-ul îndeplineşte funcţia de SET (Q devine HIGH).

o Caz2:

31
Atunci când nR şi nSet devin simultan 0 logic (LOW) şi nSet devine 1 logic (HIGH)
înaintea lui nR, latch-ul îndeplineşte funcţia de RESET (Q devine LOW).

o Caz3:

Atunci când nR şi nSet devin simultan 0 logic (LOW) şi apoi devin simultan 1 logic
(HIGH) ieşirile Q şi nQ vor oscila până când una dintre intrări va deveni 0 logic (LOW) latch-ul
trecând astfel la îndeplinirea funcţiei respective.

II. Latch-ul D

32
Se propune realizarea implementării latch-ului D în VHDL.

Pasul 1: Similar procedurii anterioare se începe prin crearea unui nou proiect.

Pasul 2:
- se completează câmpul Project name cu numele proiectului, dLatch;
- se selectează locaţia în care se doreşte salvarea proiectului ,
D:\Laboratoare\Laborator9\;
- pentru câmpul Top-level source type se alege opţiunea HDL;
- se dă click pe butonul Next.

Pasul 3:Se completează câmpurile feresteri New Project Wizard-Device Properties urmărind
modelul prezentat la crearea proiectului pentru latch-ul NAND.

Pasul 4: Urmărind modelul din fereastra următoare se dă click-dreapta şi se selectează opţiunea


New Source.

33
Pasul 5:
- se alege ca tip de fişier VHDL Module;
- se completează câmpul File nume cu numele fişierului, dLatch_vhdl;
- se dă click pe butonul Next.

Pasul 6: În fereastra de mai jos se introduc numele intrărilor şi ieşirilor precum şi tipul de date
apoi se dă click pe butonul Next.

34
Pasul 7: Se dă click pe butonul Finish în fereastra cu specificaţii despre fişierul VHDL nou creat.

Dacă s-a procedat corect se obţine o fereastră ce conţine codul VHDL parţial.

35
Pasul 8: Se completează codul VHDL ca mai jos.

Pasul 9: Se verifică corectitudinea codului: tabul Processes Synthesize-XST Check Syntax

36
Dacă în urma verificării codului nu se găsesc erori urmează să se creeze fişierul de test
pentru a analiza funcţionarea corectă a latch-ului D. Se va proceda ca în cazul creării fişierului de
test pentru latch-ul NAND.

Pasul 1:
- se selectează tipul fişierului Test Bench Waveform;
- se completează câmpul File Name cu numele fişierului de test, dLatch_tbw;
- fişierul va fi salvat în locaţia: D:\Laboratoare\Laborator9\dLatch
- se dă click pe butonul Next.

Pasul 2: Se selectează sursa pentru care se doreşte crearea fişierului de test şi se dă click pe
butonul Next şi apoi se dă click pe butonul Finish.

37
Pasul 3: În fereastra nou apărută se completează conform modelului următor şi se dă click pe
butonul Finish (pentru ceas se selectează modul Combinatorial, iar pentru lungimea testului
4000ns ).

Pasul 4: Apare fereastra în care se stabilesc semnalele de intrare (enable şi d) pentru lach-ul D
conform indicaţiilor din exemplul anterior(Latch-ul NAND); se propune realizarea tuturor
combinaţiilor posibile pentru ca urmărind ieşirea (q) să se poată evalua cât mai bine funcţionarea
latch-ului respectiv.

Pasul 5:
- după ce s-au setat intrările se dă click pe Sources;
- se selectează modul Behavioral Simulation;
- se dă click pe Test Bench-ul proiectului şi (pentru acesta) se porneşte simularea (prin
dublu-click pe Simulate Behavioral Model).

38
În graficul de mai sus se poate observa faptul că ieşirea Q urmăreşte intrarea D atâta timp cât
semnalul ENABLE este HIGH(1 logic); atunci când ENABLE devine LOW(0 logic)
ultima valoare a intrării D este păstrată până în momentul în care ENABLE devine din nou
HIGH
Cele două intrări (D şi ENABLE ) sunt asincrone. Se poate observa acest lucru din codul
VHDL, ambele intrări se regăsesc în lista de sensibilităţi a procesului: process(d,enable), deci se
urmăresc posibile modificări ale ambelor intrări.
Observaţie:

! O altă metodă de implementare a codului presupune instanţierea primitivei LD din


biblioteca UNISIM.
Declaraţia componentei LD este următoarea:
component LD
PORT (Q: out STD_ULOGIC;
D: in STD_ULOGIC;
G: in STD_ULOGIC);
end component;
Codul VHDL corespunzător acestei variante de implementare:

Se foloseşte test bench-ul următor pentru a verifica funcţionarea corectă:

39
Rezultatul obţinut este cel de mai jos:

III. Bistabilul D

Se propune realizarea modelul VHDL al bistabilului D.


Pasul 1: Se deschide aplicaţia Xilinx ISE 10.1 şi se selectează din meniul File opţiunea New
Project

Pasul 2: - se completează câmpul Project name cu numele proiectului, dBistabil;


- se selectează locaţia în care dorim să se salveze proiectul, D:\Laboratoare\Laborator9\;
- pentru câmpul Top-level source type se alege opţiunea HDL;
- se dă click pe butonul Next.

40
Pasul 3: Se completează câmpurile ferestrei New Project Wizard-Device Properties urmărind
modelul prezentat la crearea proiectului pentru latch-ul NAND.

Pasul 4: În tabul Sources se selectează rădăcina proiectului, se dă click-dreapta şi se selectează


opţiunea New Source.

Pasul 5: -se alege ca tip de fişier VHDL Module;


- se completează câmpul File nume cu numele fişierului, dBistabil_vhdl;
- se dă click pe butonul Next.

Pasul 6: - în fereastra Define Module se introduce numele intrărilor, ieşirilor şi tipul de date;
- se dă click pe butonul Next;
- se dă click pe butonul Finish în fereastra cu specificaţii despre fişierul VHDL nou
creat.

Pasul 7: Se completează codul VHDL în fereastra nou apărută

41
cu următoarea secvenţă de cod:
process(clock)
begin
if(clock’EVENT and clock=’1’) then
q<=d;
end if;
end process;
Codul VHDL final trebuie să aibă conţinutul de mai jos

42
Pasul 8: Pentru a verifica corectitudinea codului scris :
- se selectează fişierul dbistabil_vhdl în fereastra Sources;
- se extinde Synthesize-XST din fereastra Sources;
- se dă dublu-click pe Check Syntax sau click-dreapta şi Run în fereastra Processes.

În continuare se propune testarea funcţionării bistabilului D realizat cu ajutorul modelului


VHDL .
43
Pasul 1:
- se selectează tipul fişierului Test Bench Waveform;
- se completează câmpul File Name cu numele fişierului de test, dBistabil_tbw;
- fişierul va fi salvat în locaţia: D:\Laboratoare\Laborator9\dBistabil
- se dă click pe butonul Next.

Pasul 2:
- se dă click pe butonul Next;

- se dă click pe butonul Finish.

44
Pasul 3: În fereastra nou apărută se completează conform modelului următor şi se dă click pe
butonul Finish (pentru ceas se selectează modul Single Clock, iar pentru lungimea testului
4000ns ).

Pasul 4: Apare fereastra în care se stabilesc semnalele de intrare (clock şi d) pentru lach-ul D
conform indicaţiilor din exemplul anterior(Latch-ul NAND); se propune să se realizeze toate

45
combinaţiille posibile pentru ca urmărind ieşirea (q) să se poată evalua cât mai bine funcţionarea
bistabilului .

Pasul 5:
- după ce s-au setat intrările se dă click pe tabul Sources;
- se selectează modul de lucru Behavioral Simulation;
- se dă click pe Test Bench-ul proiectului şi (pentru acesta) se pornește simularea (tabul
Processes expandaţi Xilinx ISE Simulator apoi dublu-click pe Simulate Behavioral Model sau
click-dreapta şi Run).

Dacă s-a procedat corect se va obţine următorul rezulatat al simulării:

46
Observaţie:
Partea marcată astfel: în simulare indică faptul că valoarea semnalului este
necunoscută din cauza faptului că intrarea tocmai a fost iniţializată şi nu s-a propagat încă în
ieşire.
Observaţie:
! O altă metodă de implementare a codului presupune instanţierea primitivei FD din
biblioteca UNISIM.
Declaraţia componentei LD este următoarea:
component FD
PORT (Q: out STD_ULOGIC;
C: in STD_ULOGIC;
D: in STD_ULOGIC);
end component;
Codul VHDL corespunzător acestei variante de implementare:

Se foloseşte test bench-ul următor pentru a verifica funcţionarea corectă:

47
Rezultatul obţinut este cel de mai jos:

Concluzii:
Circuitul secvenţial este acel circuit logic care poate genera ieşiri diferite pentru aceeaşi
intrare în funcţie de secvenţa în care au fost aplicate intrările cu alte cuvinte ieşirea nu depinde
doar de combinaţia prezentă a ieşirilor ci şi de stările anterioare.

Latch-ul şi bistabilul sunt circuite logice similare folosite pentru stocarea unui bit de
informaţie. Difererenţa dintre ele este dată de condiţia pentru care bit-ul stocat se schimbă.

Am pus în evidenţă în exemplele noastre câteva circuite logice secvenţiale simple:


latch-ul NAND, latch-ul D şi bistabilul D şi am arătat diferenţa dintre un circuit logic secvenţial
activ pe frontul crescător al semnalului de ceas (bistabilul D) şi unul activ pe nivel(latch-ul D).

Co-Simulare: Simulink şi ModelSim

48
Se propune în continuare să se experimenteze câteva elemente de bază din cadrul
co-simulării integrând două unelte puternice de design-Simulink şi ModelSim.
Versiunile de software folosite:

MATLAB:
Versiunea :R2009b

ModelSim:
Versiunea :ModelSim SE 6.3f

I. Latch-ul D

Se va realiza mai întâi co-simularea pentru Latch-ul D. În acest scop este nevoie de
fisierul VHDL creat anterior dLatch_vhdl.vhd. Acesta trebuie copiat în folder-ul în care se va
lucra pentru realizarea co-simulării. În continuare se vor urma cu atenţie paşii de mai jos.

Se realizează mai întâi modelul Simulink prezentat în schema următoare.

Pasul 1:
 Pentru deschiderea unui model Simulink se urmăresc paşii prezentaţi în partea de
modelare şi simulare în Simulink, se salvează fişierul LatchDCosimulare.mdl în folder-ul
de lucru;
49
Pasul 2:
 se setează parametrii simulării din meniul Simulation->Configuration Parameters;
fereastra apărută trebuie completată după modelul de mai jos:

Pasul 3:
 se introduc în schemă blocurile necesare şi se fac conexiunile corespunzător schemei:
o Simuluink->Sinks->Scope;
o Simulink->Sources->Pulse Generator;
o Simulink->Signal Atributes->Data Type Conversion;
o EDA Simulator Link->For Use with Mentor Graphics ModelSim->HDL
Cosimulation;
o Signal Processing Blockset->Signal Processing Sources->From Audio Device.

 se setează parametrii blocurilor astfel:


o pentru blocul Scope ,în fereastra Scope Parameters se alege pentru Number of
axes: 3;
o pentru generatorul de impulsuri ,denumit D_input ,parametrii sunt setaţi ca în
exemplul de mai jos, iar pentru generatorul de impulsuri denumit enable se alege
diferit doar perioada (5s);

50
o pentru blocul Data Type Conversion se setează parametrul Output Data Time:
Boolean;
o pentru blocul From Audio Device se foloseşte modelul următor:

51
o setarea parametrilor blocului HDL Cosimulation este cea mai importantă. Acesta este
blocul care face legătura între componentele hardware care simulează concurent în
ModelSim şi restul componentelor modelului Simulink.

o în tabul Ports se setează parametrii astfel(d,enable şi q sunt semnalele de


intrare respectiv ieşire folosite în codul VHDL ):

o în tabul Clocks nu se modifică nimic;

52
o în tabul Timescales se completează corespondenţa Simulink-ModelSim
conform modelului următor:

Observaţie:
Reprezentarea timpului de simulare diferă mult între Simulink şi ModelSim. În
ModelSim unitatea de simulare este referită ca fiind tick-ul; durata acestuia este definită de
limita de rezoluţie a carei valoare implicită este 1 ns. Rezoluţia limită poate fi modificată:
Simulate->Start Simulation->Resolution.

În modelul de faţă s-a ales pentru reprezentarea timpului modul relativ. O secundă în
Simulink = N tick-uri în ModelSim (N factor de scalare).

53
!Dacă se specifică în Simulink o perioada de eşantionare care nu poate fi exprimată ca
număr întreg de tick-uri se va genera o eroare.
Se foloseşte blocul Zero-Order hold în cazul semnalelor continue care sunt aplicate
blocului HDL Cosimulation.
o în tabul Connections se stabileşte tipul conexiunii cu ModelSim astfel:

o în tabul Tcl nu se modifică nimic.

54
După ce s-a realizat modelul Simulink (care ar trebui să arate precum cel de mai jos) se
face legătura cu ModelSim conform paşilor de mai jos.

Pasul 4 : Deschiderea ModelSim


 în mediul de lucru MATLAB se stabileşte ca folder curent folderul de
lucru(D:\Laboratoare\Laborator9\ dLatch\Cosimulare) în care se afla fişierul VHDL;
 se foloseşte apoi comanda vsim pentru a deschide ModelSim.
55
Apare fereastra de lucru ModelSim

Pasul 5:
 se setează directorul de lucru
 se crează o bibliotecă de design şi compilăm codul VHDL

 se încarcă entitatea instanţiată, dLatch_vhdl, pentru cosimulare


56
Raportul la sfârşitul comenzilor în ModelSim ar trebui sa fie următorul:

Fereastra ModelSim va fii cea de mai jos.

Pentru a vizualiza simularea şi în ModelSim View->Wave şi apoi cu drag and drop se


introduc semnalele în subfereastra Wave.

57
Se va obţine fereastra de mai jos

58
Conexiunea ilustrată mai jos este stabilită şi se poate rula acum co-simularea.

Pasul 6:
 în fereastra Simulink se dă click pe butonul Run şi se obţine rezultatul următor. Se
observă că ieşirea q este întârziată cu o secundă de blocul HDL Cosimulation, dar
conform funcţiilor latch-ului D atunci când enable=1 intrarea este reprodusă în ieşire, iar
când enable=0 se păstrează în ieşire starea anterioară a intrării D.

Dacă se urmăreşte simularea în ModelSim se observă aceeaşi funcţionare cu excepţia


întârzierii ieşirii q care nu apare în ModelSim.

59
Pasul 7:
 se închide simularea corect: în ModelSim Simulate->End Simulation şi apoi se închide
ModelSim; în final se închide fereastra cu modelul Simulink.

60
II. Bistabilul D

Se va realiza acum co-simularea pentru bistabilul D. În acest scop este nevoie de fisierul
VHDL creat anterior dbistabil_vhdl.vhd. Acesta trebuie copiat în folder-ul în care se va lucra
pentru realizarea co-simulării. În continuare se vor urma cu atenţie paşii de mai jos.

Se realizează mai întâi modelul Simulink prezentat în schema următoare

Pasul 1:
 Pentru crearea modelului Simulink se urmăresc paşii prezentaţi în partea de modelare şi
simulare în Simulink, se salvează fişierul nostru BistabilDCosimulare.mdl în folder-ul de
lucru;

Pasul 2:
 se setează parametrii simulării, Simulation->Configuration Parameters; fereastra apărută
trebuie completată după modelul de mai jos:

61
Pasul 3:
 se introduc în schemă blocurile necesare şi se fac conexiunile corespunzător schemei:
o Simuluink->Sinks->Scope;
o Simulink->Sources->Pulse Generator;
o Simulink->Signal Atributes->Data Type Conversion;
o EDA Simulator Link->For Use with Mentor Graphics ModelSim->HDL
Cosimulation;
o Signal Processing Blockset->Signal Processing Sources->From Audio Device.

 se setează parametrii blocurilor astfel:


o pentru blocul Scope în fereastra Scope Parameters se alege pentru Number of
axes: 3;
o pentru generatorul de impulsuri, numit de noi d, care reprezintă intrarea de date
parametrii sunt setaţi ca în exemplul de mai jos, iar pentru generatorul de
impulsuri, numit clock, care reprezintă semnalul de ceas se alege diferit perioada
(1s) şi lăţimea impulsului (50% perioadă);

62
o pentru blocul Data Type Conversion se setează parametrul Output Data Time:
Boolean;
o pentru blocul From Audio Device se foloseşte modelul următor:

63
o setarea parametrilor blocului HDL Cosimulation :
o în tabul Ports se setează parametrii astfel(d,clock şi q sunt semnalele de
intrare respectiv ieşire folosite în codul VHDL):

o în tabul Clocks nu se modifică nimic;


o în tabul Timescales se completează corespondenţa Simulink-ModelSim
conform modelului următor:

64
o în tabul Connections se stabileşte tipul conexiunii cu ModelSim astfel:

o în tabul Tcl nu se modifică nimic.

După ce s-a realizat modelul Simulink (care ar trebui să arate precum cel de mai jos) se
face legătura cu ModelSim conform paşilor prezentaţi în continuare.

65
Pasul 4 : Deschiderea ModelSim
 în mediul de lucru MATLAB se stabileşte ca folder curent folderul de lucru
(D:\Laboratoare\Laborator9\ dBistabil\Cosimulare) în care se afla fişierul VHDL;
 se foloseşte apoi comanda vsim pentru a deschide ModelSim.

Apare fereastra de lucru ModelSim

Pasul 5:
 se setează directorul de lucru
 se crează o bibliotecă de design şi se compilează codul VHDL

66
 se încearcă entitatea instanţiată, dbistabil_vhdl, pentru cosimulare

Raportul la sfârşitul comenzilor în ModelSim ar trebui sa fie următorul:

Fereastra ModelSim va fii cea de mai jos.

Pentru a vizualiza simularea şi în ModelSim View->Wave şi apoi cu drag and drop se


introduc semnalele în subfereastra Wave la fel ca în cazul latch-ului D .

67
Se va obţine fereastra de mai jos

Conexiunea este stabilită şi se poate rula acum co-simularea.

Pasul 6:
 în fereastra Simulink se dă click pe butonul Run şi se obţine rezultatul următor. Se
observă că ieşirea q este întârziată cu o secundă de blocul HDL Cosimulation, dar
conform funcţiilor bistabilului D atunci când apare frontul crescător al semnalului de ceas
intrarea este reprodusă în ieşire,

68
Dacă se urmăreşte simularea în ModelSim se observă aceeasi funcţionare. Aici însă
ieşirea q nu este întârziată.

Pasul 7:
 conform precizării de la latch-ul D se închide simularea: în ModelSim Simulate->End
Simulation şi apoi se închide ModelSim ;în final se închide fereastra cu modelul
Simulink.

Observaţii:

!Pentru variantele mai vechi de MATLAB blocul HDL Cosimulation are drept
corespondent blocul de mai jos aflat în Simulink->Link for ModelSim:

69
!S-a realizat co-simularea folosind codul VHDL scris anterior. O altă variantă care nu a
fost tratată aici presupune generarea automată de cod VHDL din linie de comandă în MATLAB
sau din modelul Simulink din fereastra Configuration Parameters conform prezentării succinte
de mai jos.

70
Concluzii:

Se foloseşte co-simularea pentru a ajusta codul VHDL al unui circuit logic (creat sau
generat automat) până în momentul în care simularea funcţională este satisfăcătoare pentru a
putea trece la implementarea în FPGA. Co-simulării are la bază ideea conectării unor entităţi
care acţionează concomitent.

71
Implementarea în FPGA

Partea I – Conectarea plăcii Spartan-3 FPGA la PC şi la alimentare

Pasul 1: Alimentarea plăcii


- în prima fază se vor conecta cele 2 părţi ale cablului de alimentare al plăcii ca în figura
următoare:

- se va conecta alimentarea la placa Spartan-3, apoi la priză;


- conectorul de alimentare se va conecta la placă ca în figura următoare:

Pasul 2: Conectarea cabului de date dintre PC şi placa Spartan-3 FPGA


72
- următoarea etapă constă în conectarea cablului de date dintre PC şi placa Spartan-3
FPGA;
- onectarea se face în felul următor:
- un capăt la cablului se va conecta la portul paralel al PC-ului iar celălalt pe conectorul
special de pe placa FPGA ca în figura următoare:

- portul paralel al PC-ului se identifică uşor, având codul de culoare roz sau mov după
caz;
- în final, dacă s-au conectat cablurile la porturile care trebuie, placa trebuie să arate în
felul următor cu toate conexiunile făcute:

Partea a II-a

73
A. Implementarea pe placa Spartan-3 FPGA a bistabilu-lui D

Pasul 1. Conectarea plăcii Spartan-3 FPGA


- pentru conectarea plăcii Spartan-3 se va urma pas cu pas Partea I

Pasul 2. Crearea unui nou proiect pentru implementarea pe placa Spartan-3 FPGA
Se poate folosi fişierul VHDL creat în prima parte a lucrării de laborator sau putem crea
unul nou astfel:
- se va deschide softul Xilinx ISE 10.1 şi se va crea un nou proiect ca în figura
următoare:

- se va da click pe tabul File din meniu, apoi se va selecta opţiunea


New Project… ;
- va apărea următoarea fereastră:

- se asigură că la Top-level source type s-a selectat HDL;


- apoi se face click pe Next;
- va apărea următoarea fereastă de configurare a proiectului:
74
- se asigură că setările sunt ca în figura de mai sus, apoi se dă click pe Next;
- va apărea următoarea fereastră:

- se dă click pe Next şi va apărea următoarea fereastră:

75
- în final se dă din nou click pe Next;
- va apărea următoatea fereastră:

Pasul 3.Adăugarea fişierului sursă cu codul VHDL al bistabilului D

- după ce s-a dat click pe Finish se merge în stînga sus la panel-ul Sources;
- se dă click dreapta şi se selectează Add Source… ca în figura următoare:

76
- se va deschide o fereastră unde se caută fişierul cu extensia .vhd care se va adăuga la
proiect:

- după ce se dă click pe butonul Open va apărea următoarea fereastră:

- se dă click pe OK;

77
- va apărea codul VHDL conţinut în fişierul respectiv:

- se va salva după fiecare pas făcut(Ctrl+S) sau File->Save;


- din tabul Processes, aflat sub tabul Sources se selectează Synthesize - XST Utilities şi
se expandează ca în figura de mai jos apoi se face click dreapta pe Check Syntax şi se
selectează opţiunea Run:

78
- dacă codul este corect va apărea imaginea următoare:

- până în acest moment s-a încărcat fişierul bistabiu-lui D şi s-a verificat codul conţinut
în acesta;
- în următoarea etapă se va pregăti programul care va fi încarcat pe placa Spartan-3
FPGA.

Pasul 4.Setarea intrărilor şi ieşirilor pentru placa Spartan-3 FPGA

- pentru a configura porturile pentru intrările şi ieşirile plăcii FPGA se va expanda


meniul User Constraints;
- se dă click dreapta pe Floorpan IO – >Pre – Synthesis ca în figura următoare:

79
- după ce s-a selectat Run se va deschide următoarea fereastră:

- se selectează opţiunea Yes;


- urmează setarea intrărilor şi a ieşirilor plăcii FPGA:

- se setează clock-ul la“L14”,intrarea d la “K13”, şi ieşirea q la “P11” ca în figura


următoare:

- se salvează fişierul : Ctrl+S sau File-> Save;


- se va deschide următoarea fereastră:

80
- se alege opţiunea ca în imaginea de mai sus: XST Optional{};
- se închide fereastra respectivă.

Pasul 5. Generarea programului pentru FPGA

- se dă click dreapta pe meniul Generate Programming File din tabul Processes;


- se dă click pe opţiunea Run, ca în figura următoare:
+

- se aşteaptă până se termină de rulat generarea programului;


- dacă sunt erori atunci se procedează astfel: se expandează din tabul Sources fişierul
VHDL şi se selectează fişierul cu extensia .ucf ca în imaginea de mai jos:

81
- din tabul Processes se expandează User Constraints şi se deschide Edit Constraints
prin dublu click;

- fişierul .ucf va arăta ca în imaginea de mai jos:

- se introduce aici următoarea linie de cod:

NET “clock” CLOCK_DEDICATED_ROUTE=FALSE;

82
- se salvează , apoi se rulează din nou comanda Generate Programming File;
- dacă nu sunt erori va apărea ca imaginea următoare:

Pasul 6. Configurarea dizpozitivului

- se dă click dreapta pe Configure Target Device din tabul Processes ca în figura de mai
jos:

83
- se dă click pe Run;
- va apărea următoarea imagine:

- se dă click pe OK;
- va apărea fereastra următoare:

- se dă click pe Finsh;
- iMPACT trebuie să detecteze automat placa FPGA şi să ceară selectarea fişierelor
de configurare pentru cele două dizpozitive;
- când apare meniul de select, se alege fişierul cu extensia .bit;
84
- se dă click pe Open;
- pentru al 2-lea dizpozitiv(Flash-ROM-ul de pe placă) se selectează opţiunea Bypass
deoarece nu s-a generat nimic pentru el.

- va apărea o fereastră cu configurarea proprietăţilor:

- se asigură că s-a selectat Device 2(Prom, xcf02S) şi s-a debifat tot de la casuţele din
coloana Value, ca în imaginea de mai sus.

Observa ţie
! La debifarea opţiunii Verify va apărea un warning care se ignoră dând click pe OK.
85
- se dă click dreapta pe primul dizpozitiv xc3s200;
- apoi se dă click pe Program ca în figura următoare:

- acum se va încărca programul pe placa FPGA;


- dacă programul a fost încarcat cu succes va apărea următorea imagine:

Observaţie
! La unele PC-uri s-ar putea să nu ruleze din prima încercare din motive ce ţin de softul
folosit, versiunea de Windows, memoria RAM a calculatorului, conectivitatea cu placa FPGA,
etc…
- în cazul în care vă apare imaginea următoare:

86
- se selectează din nou dizpozitivul xc3s200;
- se dă click dreapta şi se selecteaza opţiunea Program din nou;
- după ce a apărut imaginea:

continuăm cu pasul următor.

Pasul 7.Testarea programului pe placa Spartan-3 FPGA


- se va face o recapitulare a intrărilor “clock” , “d” şi a ieşirii “q”;

87
- pentru switch, sus înseamnă 1 iar jos înseamnă 0;
- led-ul se aprinde atunci cînd q=1 iar ramîne stins atunci cînd q=0;
- pentru buton, o apăsare reprezintă un front crescător iar dacă butonul rămâne apăsat,
atunci semnanul de ceas rămâne pe frontul său superior ca în figura următoare:

- face o analogie între feedback-ul plăcii şi ce afişează blocul Scope din schema
MATLAB-Simulink pentru a înţelege mai bine rolul său;
88
- în blocul Scope sunt reprezentate intrările şi ieşirile ca în figura următoare:

Se vor observa următoarele situaţii:


a) d=1(switchul este în sus), se va apăsa butonul de clock => q=1 (led aprins)
b) d=0(switchul se află în jos), se va apăsa butonul de clock , apoi se va ridica switchul (d=1)=>
q=0,(led stins), apoi se va apăsa din nou butonul de clock => led aprins(q=1).

Ieşirea “q” va reproduce intrarea “d” la apariţia frontului crescător al ceasului clock.
Dacă intrarea se modifică ,se va reflecta la ieşire doar cînd va fi activ un nou front crescător al
ceasului. Ieşirea va reproduce intrarea corespunzătoare ultimului front crescător al ceasului.
c). d=1(switch în sus), se va apăsa butonul “clock” => ieşirea “q”=1.Se ţine butonul clock apăsat
şi se modifică intrarea “d”=0(switch în jos) şi se observă că nu se modifică ieşirea “q”, ci va
ramane cea de dinainte (q=1).

89
B.Implementarea pe placa Spartan-3 FPGA a latch-ului D

- se urmează paşii 1 şi 2 de la implementarea pe placa Spartan-3 FPGA a bistabilului D


cu următoarele precizări:
o în fereastra de mai jos se salvează proiectul cu denumirea dlatch_vhdl_fpga

90
Pasul 3. Adăugarea fişierului sursă cu codul VHDL al latch-ului D

- se adaugă fişierului sursă cu codul VHDL al latch-ului D comform pasului 3 de la


implementarea pe placa Spartan-3 FPGA a bistabilului D cu următoarele precizări:
o în fereasra de mai jos se caută fişierul cu extensia dlatch_vhdl.vhd care va fi
adăugat la proiect:

o după ce se dă click pe butonul Open va apărea următoarea fereastră:

91
o se dă click pe OK;
o va apărea codul VHDL conţinut în fişierul respectiv:

92
Pasul 4.Setarea intrărilor şi ieşirilor pentru placa Spartan-3 FPGA

- pentru a configura porturile intrărilor şi ieşirilr plăcii FPGA se va urma pasul 4 de la


implementarea pe placa Spartan-3 FPGA a bistabilului D cu următoarele precizări:
o se setează intrările şi ieşirile plăcii FPGA( d-ul
la“K13”,enable la “K14”, şi ieşirea q la “P11”) ca în figura următoare:

Pasul 5. Generarea programului pentru FPGA


- generarea programului pentru FPGA se va realiza conform pasului 5 de la
implementarea pe placa Spartan-3 FPGA a bistabilului D cu următoarele precizări:
o fişierul .ucf al latch-ului D trebuie să arate astfel:

Pasul 6. Configurarea dizpozitivului


- configurarea se va realiza exact ca la pasul 6 de la implementarea pe placa Spartan-3
FPGA a bistabilului D cu următoarele modificări:
o când apare meniul de select corespunzător, se alege fişierul cu extensia .bit;
o se dă click pe Open;
o pentru al 2-lea dizpozitiv(Flash-ROM-ul de pe placă) se selectează opţiunea
Bypass deoarece nu s-a generat nimic pentru el.

93
Pasul 7.Testarea programului pe placa Spartan-3 FPGA
- se va face o recapitulare a intrărilor “d” , “enable” şi a ieşirii “q”

94
- pentru switch, sus înseamnă 1 iar jos înseamnă 0;
- led-ul se aprinde atunci cînd q=1 şi ramîne stins atunci cînd q=0;
- se va face o analogie între feedback-ul plăcii şi ce afişează blocul Scope din schema
Matlab-SIMULINK pentru a înţelege mai bine rolul său;
- în blocul Scope exista reprezentate intrările şi ieşirile ca în figura următoare:

Se vor observa următoarele situaţii:

a) Enable=1(switchul este în sus), se va face intrarea D=1 (switch sus). Se obsevă că ledul se va
aprinde deci ieşirea Q va reflecta intrarea D, în cazul de faţă Q=1.

b) Enable=1(switchul se află în sus), se va face intrarea D=0. Se observă că ledul se va stinge


deci ieşirea Q va reflecta intrarea D, în cazul de faţă Q=0.

c) Enable=0(switchul se află în jos), se va face intrarea D=1 (switch sus),respectiv D=0(switch


jos). Se obsevă că ledul va rămâne stins păstrîndu-şi starea anterioară, în cazul de faţă cea de la
punctual b) deci ieşirea Q va rămâne 0(led stins).

d) Enable=0, Q=0, D=1(cazul c) .), se va face Enable=1 (switch sus). Se observă că ledul se va
aprinde reflectând starea intrării D.

95
96
Proiect realizat de :
Dinulescu Maria
Ganea Madălin
Ionică Monica
Tănase Irina
Popa-Mare Mircea

97

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