Sunteți pe pagina 1din 104

pVLSI

Limbaje de descriere hardware

HDL

Limbaje de descriere hardware

Sunt limbaje care descriu formal

comportarea unui circuit electronic digital

Descrierea permite definirea modului de

functionare, a structurii circuitului precum

si testarea acestuia prin simulare

HDL descriu structura spatiala si

comportamentul temporal al circuitului

Limbajele HD trateaza in mod explicit

conceptul de concurenta si variabila timp

Generalitati HDL

Atunci cand un limbaj descrie structura unui circuit

fara referire la comportarea sa in timp, succesiunea de instructiuni se numeste netlista (utilizata in CAD)

HDL permit simularea unei structuri logice, pas cu pas, prin evaluarea progresului in domeniul timp, secvential

Pornind de la descrierea unei structuri logice, se

poate genera o netlista care defineste modul de

interconectare a unor elemente functionale (primitive), procedura numindu-se sinteza, iar aplicatia sintetizator

Sinteza ignora elementele HDL care se refera la timp (genereaza netlista)

Evolutia HDL

ISP (Instruction Set processor), dezvoltat de Carnegie Mellon University , 1977; permite descrierea legaturilor intre intrari si iesiri si simulare; nu include sinteza

KARL, dezvoltat de University of Kaiserslautern , 1977; permite proiectare structurala, include elemente de proiectare si floorplanning

ABL, dezvoltat la centrul de cercetari CSELT, Torino, Italia, pe baza versiunii KARL, prin introducerea unei interfete grafice interactive (ABLED graphic VLSI design editor), 1980

PALASM este un limbaj de descriere a functiilor Booleene si

de generare a “hartii de ardere” a circuitelor PAL (Monolithic

Memories, 1980)

ABEL (Advanced Boolean Expression Language), dezvoltat

de Data-I/O in 1983, era orientat proiectarea automatelor

finite si implementarea folosind PLD

Altele: VHSIC, ALTERA, AHPL, CDL, CONLAN, IDL, ISPS, TEGAS, TI-HDL, Zeus.

Evolutia HDL

CUPL (Programmable Logic Description Language) este

un compilator ce converteste ecuatiile logice intr-o “harta” de ardere a fuzibilelor PLD (JEDEC file); se bazeaza pe tehnici si algoritmi de implentare a automatelor finite (inclusiv diagrame Karnaugh); aparut in 1985 (PCAD/Assisted Tech) si achiztionat in 2001 de Altium (fost Protel)

Verilog, primul HDL modern, dezvoltat de Gateway Design Automation (1985); sintaxa similara cu C si Pascal, permite controlul intarzaierilor

Verilog XL, de la Cadence Design Systems, a devenit ulterior standard de simulare, IEEE

VHDL (Very High Speed Integrated Circuit Hardware Description Language), DoD, 1987; sintaxa similara cu ADA, nivel ridicat de abstractizare, standard IEEE

Descrierea circuitelor

Descrierea unui sistem numeric poate fi făcută la

diverse niveluri, fie sub formă textuală, fie sub formă picturală. Descrierile textuale sunt făcute utilizând diverse limbaje mai mult sau mai puţin

apropiate de limbajul natural. Familii de limbaje:

• descrierile în limbajul natural;

• descrierile folosind ecuaţiile booleene;

descrierile folosind limbajele de programare (C, Pascal, Basic);

descrierile folosind limbajele de descriere a

hardware-ului (Verilog, VHDL).

Niveluri de descriere HDL

Switch level

Nivelul comutator (tranzistor)

Gate level

Nivelul poarta logica

Register Transfer Level (RTL) / Data Flow

Nivelul transferurilor intre registre sau flux de date

Behavior Level

Nivel comportamental sau algoritmic

Nivelul comutator

(tranzistor)

Switch Level

Nivelul comutator (tranzistor) Switch Level • La acest nivel circuitele digitale sunt construite folosind ca elemente

La acest nivel circuitele digitale sunt construite folosind

ca elemente constitutive comutatoare elementare, respectiv tranzistoare MOS

• Aceste elemente pot fi combinate astfel încât să formeze circuite (inversoare sau alte porţi logice, porti de trecere, pana la structuri secventiale comlexe), definind trecerea la următorul nivel de abstractizare al modelului.

HDL include comutatoare MOS care pot fi utilizate

pentru a construi porţi logice de bază, memorii statice şi dinamice de 1 bit, registre etc.

Nivelul poartă logică

Gate Level

Nivelul poartă logică Gate Level • La acest nivel de abstractizare modelul este construit cu porti

La acest nivel de abstractizare modelul este construit cu porti logice

• Toate porţile de bază sunt disponibile ca module predefinite denumite primitive şi pot fi încorporate direct în descrierea modelului

La fel cum modelul fizic (hardware) poate fi construit utilizând porţi logice, în mod similar primitivele pot fi utilizate în mod repetat pentru a construi sisteme logice complexe.

• Modelarea la nivel de poartă logică se mai numeste si modelarea structurală

Este o descriere similară cu descrierea unui circuit electronic

Nivelul flux de date

Data Flow / Register Transfer Level (RTL)

Nivelul care descrie modul cum sunt procesate datele logice dea lungul unei succesiuni de registre se numeste nivel flux de date.

La acest nivel descrierea circuitului este mai compactă decât cea utilizată la nivel de poartă logică, iar modelul descrie „curgerea” datelor

între registre şi modul de procesare a acestora

Nivelul comportamental sau

algoritmic

Behavior level

• Nivelul comportamental reprezintă cel mai înalt nivel abstractizare in descrierea unui circuit.

• Cu ajutorul declaraţiilor si instructiunilor folosite, cum ar fi construcţii de tip buclă sau instrucţiunile de tip ramificaţie, descrierea modelului in aceasta maniera este

asemanatoare programele într-un limbaj de programare

software.

Maniera compactă şi construcţiile bazate pe descrieri comportamentale permit o sintaxa simplificata si un numar redus de instructiuni HDL, ceea ce determină un proces de dezvoltare rapid şi eficient.

Abordarea descriptiva HDL

Indiferent de modul de descriere,

instrumentele oferite de HDL permit definirea circuitelor logice considerand

doua aspecte:

Descriere structurala: defineste structura

circuitului ca si elemente componenete si

interconectare

Descriere comportamentala: defineste

functionarea logica a circuitului

Functiile HDL

Functiile HDL

Limbaje de programare vs.

limbaje HDL

Limbajele de programare procedurale descriu modul cum se realizează o procedura de procesare a informatiei (reţetă):

Instructiuni executate secvential de un procesor

Calculele aritmetice si logice

Manipularea datelor

• Execuţia pentru o anumită platformă hardware

Permite depanarea prin rulare pas-cu-pas sau break-points

HDL descriu un sistem hardware din mai multe puncte de vedere:

Reprezinta o descriere comportamentala (ce face?)

• Defineste o structura (din ce este alcătuit)

• Opereaza cu proprietăţi fizice: cât este de rapid? ce putere consumă?

cum se realizeaza interfaţarea?

Permite mai multe fire de executie si procesarea paralela

Permite trecerea de la codul HDL la primitive interconectate (sinteza)

Permite depanarea folosind test-bench, prin simulare logica si temporala

Caracteristici ale HDL

Structura programului

– Permit intanţieri multiple ale unor componente de acelaşi tip

– Specifică interconexiunile între module la fel ca în schemele electrice

– Utilizează ierarhii de module

Atribuiri

– Atribuire continuă (circuitele logice prelucrează semnalul continuu) – Întârzieri ale propagării semnalelor (prelucrarea semnalelor necesită un anumit timp)

Definirea momentelor de timp cand are loc o actiune fata de o referinta standard de timp (clock)

Caracteristici ale HDL

Structurile de date

– Dimensiunile sunt precizate în mod explicit, nu există

structuri dinamice

– Nu există pointeri

Paralelism

– Structurile hardware au în mod natural o funcţionare paralelă, pe mai multe fire de execuţie

– Atribuirile pot să apară în paralel, nu doar secvenţial

Caracteristici ale HDL

• Programele HDL sunt prelucrate de către un compilator la fel ca in cazul limbajelor de programare:

Un compilator HDL lucrează de cele mai multe ori în

mai multe etape producând în primă fază o descriere într-un format intern. Acesta este apoi convertit într-o descriere într-un format standard: EDIF - Electronic

Design Interchange Format, apoi într-un format JEDEC -

Joint Electron Device Engineering Council. – Fişierul JEDEC conţine instrucţiunile ce trebuie transmise unui programator PLD pentru a configura un circuit programabil.

HDL

• Principala caracteristică a HDL este că

permit descrierea comportamentului circuitelor hardware independent de modul

în care acestea vor fi implementate.

Cu ajutorul unui singur limbaj se poate

descrie atât funcţia circuitului cât şi

implementarea acestuia.

Descrierea sistemului Scheme HDL Diagrame de stare Biblioteci Sinteză Listă de conexiuni Specificaţii
Descrierea sistemului
Scheme
HDL
Diagrame de stare
Biblioteci
Sinteză
Listă
de
conexiuni
Specificaţii
Simulare
HDL
Vectori
Analiza de timp
de
test
Testare
Mapare tehnologică
Plasare şi rutare
Configurare/
Circuit programabil
Programare
Implementare
Placă de circuit imprimat
Depanare
Fluxul de proiectare a sistemelor digitale utilizând circuite programabile

Etapele fluxului de proiectare

Specificarea (descrierea) sistemului digital;

Sinteza descrierii, deci

transformarea acesteia într-o listă de conexiuni conţinând porţi elementare şi interconexiunile dintre ele;

Simularea funcţionării sistemului pe

baza listei de conexiuni obţinute, înainte de implementarea într-un anumit circuit;

Implementarea sistemului într-un

circuit prin adaptarea listei de conexiuni pentru a se utiliza în mod eficient resursele disponibile ale

circuitului;

Configurarea (programarea) circuitului pentru ca acesta să realizeze funcţia dorită.

Flux de proiectare simplificat folosit

in Verilog

 

Designer

  Designer   RTL   RTL Simulation Editor Verilog   RTL Code       Gate
 

RTL

 

RTL  RTL  

Simulation

EditorSimulation

Verilog

 

RTL Code

 
 
 
 

Gate Level

 

Logic  Gate Level  

Simulation

SynthesizerSimulation

 

Gate Level Code

 
 

Post Gate

   

Level

Level Place & Route

Place & Route

Simulation

Simulation

Physical Layout

Tape Out

Tape Out

Tape Out
Tape Out
    Level Place & Route Simulation Physical Layout Tape Out Chip Level Cost High Low

Chip

Level Cost High Low Low High
Level
Cost
High
Low
Low
High

Verilog, evolutie

• Verilog a fost dezvoltat ca un limbaj de descriere proprietar de către

firma americană Gateway Design System Corporation în perioada

1983-1985 sub denumirea Verilog-XL

In 1988 a fost lansat primul sintetizator logic bazat pe Verilog ca limbaj de de descriere

In 1989, Cadence Design Systems a achiziţionat atât firma Gateway Design Automation şi drepturile asupra Verilog HDL

• În 1990, Cadence Design Systems a decis deschiderea limbajului Verilog HDL către public; in 1991, se formează OVI (Open Verilog International) cu scopul de a promova şi standardiza limbajul Verilog.

Verilog a fost standardizat IEEE în 1987 (IEEE-1076), completat

ulterior cu IEEE (IEEE-1364, 1995). Ulterior, lipsa unor tipuri de date general acceptate a fost rezolvată prin apariţia standardului IEEE- 1164. Standardul defineşte o colecţie de rutine software care permit interfaţarea dintre Verilog şi alte programe (de obicei C). Colecţia de

rutine este cunoscută sub numele de PLI (Programming Language

Interface).

• Standardizarea Verilog a determinat apariţia de producatori care ofereau simulatoare Verilog.

Structura unui program Verilog

Limbajul Verilog descrie un proiect hardware

Verilog acopera descrierea la nivelul portilor logice (Gate Level) sau la nivelul transferurilor intre registre (Register Transfer Level)

Descrierea unui proiect Verilog contine module sau

unităţi de proiectare (numite design-uri), care au ca punct de plecare fişiere sursă (cu extensia *.v).

Un proiect Verilog contine primitive (elemente functionale de baza) sau structuri functionale predifinite, obtinute in urma compilării fişierelor sursă, si organizate in biblioteci (libraries)

Proiectul poate fi descris comportamental, structural sau combinat.

Niveluri Verilog

La nivelul RTL se utilizeaza constructii

comportamentale bazate pe proceduri, taskuri, functii, operatori, evenimente, conditionari si controlul explicit al timpului

La nivel comutator/poarta se utilizeaza

constructii structurale bazate pe primitive

combinationale, porti de transmisie, structuri cu tranzistoare MOS, rezistoare

Etape proiectare Verilog

Primele etape

Ierarhizare / Cod Compilare Simulare / schema bloc Verilog verificare Etape finale Sinteză Aplicare /
Ierarhizare /
Cod
Compilare
Simulare /
schema bloc
Verilog
verificare
Etape finale
Sinteză
Aplicare / amplasare
şi conectare
Verificări
temporale

Etapele desfăşurării unui proiect utilizând limbajul Verilog

Schema bloc

Descriere folosind cod HDL

Compilare

Simulare

Sinteza = lista de primitive, componente, conexiuni

Place&Route = asocierea cu elemente hardware si conexiuni fizice

Verificarea temporala =

analiza functionala

luand in considerare

intarzaierile

Modulul

Verilog

module <nume_modul>

(<listă_de_porturi>);

<declaraţii>

<obiecte_ale_modulului>

endmodule

module stiva (data, full, empty, sp, err, push, pop, reset)

porturi inout porturi input porturi output module
porturi inout
porturi input
porturi output
module

<nume_modul> reprezintă un identificator care, în mod unic, denumeşte modulul.

<lista de porturi> constituie o listă de porturi de intrare (input), ieşire

(output) sau intrare/ieşire (inout), care reprezintă interfaţa circuitului şi pot fi folosite pentru conectarea cu alte module.

<declaraţii> specifică obiectele de tip date, cum ar fi registre (reg), memorii şi fire (wire), cât şi construcţiile procedurale ca function şi

task.

<obiecte ale modulului> poate conţine construcţii initial, construcţii always, atribuiri continue sau instanţe ale modulelor.

Declararea modulelor

• Semantica construcţiei unui modul în Verilog este diferită

de cea a subrutinelor, procedurilor şi a funcţiilor din alte limbaje. Un modul nu este apelat niciodată.

• Nu se pot defini module care să se includă pe ele însele

şi o descriere a unui modul nu poate conţine o altă

definire a unui modul între cuvintele cheie module şi endmodule.

• Declararea modulului trebuie să fie independentă; un

modul nu poate fi definit în interiorul altui modul;

• Fiecare modul poate fi definit o singură dată;

• Forma generală pentru invocarea unei instanţe este următoarea:

<nume_modul> <numele_instanţei>(<listă_porturi>);

Convenţii lexicale

• Convenţiile lexicale sunt asemănătoare cu cele din limbajul C.

• Comentariile sunt specificate prin // la începutul liniei, fiind valabile pentru acea linie, iar comentariile pe mai multe linii încep cu /* şi se termină cu */.

Exemple:

// declararea porturilor de intrare

/* Acest modul descrie un circuit basculant bistabil de tip D

Q şi Q’ sunt ieşirile circuitului

Clock este semnalul de ceas */

Cuvintele cheie, de exemplu reg, sunt rezervate şi sunt scrise cu literele mici ale alfabetului.

• Limbajul este “case-sensitive”, literele mici având semnificaţie diferită de literele majuscule.

• Delimitatorii sunt “spaţiu”, “tabulatorul” şi “linie nouă”. Cu excepţia prezenţei acestora în

şiruri de caractere, aceste caractere sunt ignorate.

Exemple:

module

endmodule

begin

end

if

//semnifică începutul unui modul

//semnifică sfârşitul unui modul

//semnifică începutul unui bloc de instrucţiuni

//sfârşitul unui bloc de instrucţiuni

//semnifică o instrucţiune condiţională care trebuie verificată

Identificatori

• Orice program necesită denumiri pentru semnale, variabile, blocuri, funcţii, etc. pentru a le putea identifica. Este recomandat să folosim identificatori

cât mai sugestivi pentru a uşura întelegerea şi verificarea oricărui program.

Exemple: clock, enable, gate_SI, out, in, ….

Există câteva restricţii în declararea unui identificator:

Corect:

nume, _nume, nume1, nume_$, …. – toţi aceşti identificatori sunt permişi;

Incorect:

nume alu – nu este permis ca identificator datorită spaţiului lăsat între nume

şi alu (cele două cuvinte vor fi interpretate ca doi identificatori diferiţi);

$nume – nu este permis datorită prezenţei simbolului $ ca prim caracter;

1_nume nu este permis ca identificator;

@nume identificator incorect;

A+B – nu poate fi folosit ca identificator datorită prezenţei simbolului + în

cadrul expresiei.

Numere

• Frecvent într-o descriere este necesară specificarea

unor valori pentru semnale, porturi, întârzieri, etc.

Există trei tipuri de constante în Verilog:

numere întregi – pot fi scrise în forma implicită ca

numere reprezentate în baza 10 sau ca valori exprimate

într-o bază de numeraţie precizată explicit; numerele negative sunt reprezentate sub formă de complement

faţă de 2;

numere reale – sunt automat convertite în numere întregi prin rotunjire;

şiruri sunt formate dintr-o secvenţă de caractere

incluse între ghilimele.

Numere intregi

• Numerele întregi sunt specificate sub forma tradiţională ca

o serie de cifre cu sau fără semn, în maniera următoare:

<dimensiune><format_bază><număr>

unde <dimensiune> este opţional şi conţine cifre zecimale, care specifică dimensiunea constantei ca număr de biţi.

Câmpul <format_bază> are un singur caracter urmat de unul dintre următoarele caractere b, d, o şi h, care

specifică baza de numeraţie: binară, zecimală, octală şi

hexazecimală.

Număr

Descriere

’d49

număr pozitiv exprimat în baza 10

Exprimare

numere

- 15

’o63

12’o314

’h5F

16’hBEF

3’b11x

4’b110

-4’b10

număr negativ exprimat în baza 10

număr exprimat în baza 8

număr exprimat pe 12 biţi în baza 8

număr exprimat în baza 16

număr exprimat pe 16 biţi în baza 16

număr binar pe 3 biţi, cu ultimul bit necunoscut

numărul binar pe 4 biţi 0110

număr exprimat în baza 2, reprezentat pe 4 biţi,

complementul faţă de 2 al numărului binar 0010

8’b0111

8’b0000_0111

-4’d3

’hEF

4’bx

8’b_0011_1011

număr exprimat în baza 2, reprezentat pe 8 biţi 00000111

număr echivalent cu cel anterior (caracterul de delimitare _ este ignorat)

număr exprimat corect, complementul faţă de 2 al

numărului pozitiv 3, reprezentat pe 4 biţi 1101

număr exprimat în baza 16, reprezentat pe 8 biţi

valoare nedefinită pe 4 biţi xxxx

folosire ilegală a caracterului de subliniere pentru

delimitare

4’b - 3

număr exprimat incorect

8’ b1111

formă incorectă cu spaţiu între caracterul ‘ şi baza de numeraţie

Numere reale, siruri…

Numerele reale pot fi reprezentate sub două forme:

• numere zecimale (cu virgulă);

• numere în format ştiinţific (cu exponent).

Şiruri

• Un şir reprezintă o secvenţă de caractere incluse între ghilimele (“ ”).

• Fiecare caracter este reprezentat pe 8 biţi şi este tratat ca un număr întreg pozitiv.

• Unele caractere de control pot fi introduse în şiruri dacă sunt

precedate de caracterul “\”:

\n – trece la linie nouă;

\t tabulator;

\\ caracterul \; \” – caracterul “.

Setul de valori logice

• 0 : valoare logică 0 sau condiţie falsă;

• 1 : valoare logică 1 sau condiţie adevărată;

• x : valoare logică necunoscută;

• z : stare de înaltă impedanţă.

Tipuri de date

net: acest tip de dată reprezintă conexiunile fizice între elementele

structurale. Cel mai folosit din această categorie este tipul wire.

Valoarea implicită a tipului de dată wire este valoarea de înaltă impedanţă (z).

register: acest tip de dată modelează un element abstract de stocare a datelor. Acesta stochează ultima valoare care i-a fost atribuită

procedural în cadrul specificaţiilor always şi initial. Valoarea implicită a

acestui tip de dată este x.

Tipuri de date

Un fir de tip net (wire) are valoarea continuu atribuită de

către driverul lui, printr-o specificaţie de atribuire continuă (assign) sau o instanţiere de componentă.

Cu alte cuvinte, semnalul de tip wire modelează un fir

obişnuit căruia trebuie să i se atribuie tot timpul o

valoare.

Un fir de tip register îşi păstrează valoarea până la

următoarea atribuire a unei noi valori.

Semnalul de tip reg modelează un fir mai special (nu un registru) capabil să îşi păstreze valoarea între două actualizări succesive. Această proprietate a firelor de tip

reg le face foarte folositoare la modelarea elementelor

de memorare din sistemele digitale (bistabile).

Date de tip net

Datele de tip net pot fi declarate folosind mai multe cuvinte cheie, în funcţie de comportamentul acestora:

wire corespunde modelului unui conductor fizic;

tri folosit pentru semnalerea posibilelor surse multiple pentru un semnal;

wor – modelează conexiunea “ŞI cablat”;

trior identic cu wor;

wand – modelează conexiunea “SAU cablat”;

triand identic cu wand;

trireg – modelează o conexiune cu încărcare capacitivă, capabilă să reţină valoarea după ce sursa semnalului a intrat în stare de înaltă impedanţă;

tri0 – modelează conductoare cu surse multiple care iau valoarea 0 în cazul

în care toate sursele semnalului au intrat în stare de înaltă impedanţă;

tri1– modelează conductoare cu surse multiple care iau valoarea 1 în cazul în care toate sursele semnalului au intrat în stare de înaltă impedanţă;

supply0 – utilizat pentru modelarea conexiunii la masă, valoarea logică

permanentă este 0;

supply1 utilizat pentru modelarea conexiunii la sursa de alimentare, valoarea logică permanentă este 1.

Date de tip register

Datele de tip register pot fi declarate folosind următoarele cuvinte cheie:

reg folosit cel mai frecvent pentru declararea unei conexiuni cu “memorie”; este folosit pentru modelarea ieşirilor de bistabile;

integer – folosit exclusiv la modelarea la nivel înalt fiind echivalent cu tipul reg pe 32 de biţi;

time – folosit exclusiv la modelarea la nivel înalt pentru stocarea şi

manipularea valorilor ce semnifică timp; este folosit în conjuncţie cu

funcţia sistem $time;

real – folosit exclusiv la modelarea la nivel înalt pentru stocarea şi manipularea valorilor ce semnifică numere reale;

realtime identic cu tipul real.

Exemple reg / wire

Exemple (dimensiune vectoriala):

reg [primul_bit:ultimul_bit] nume;

wire [primul_bit:ultimul_bit] nume;

wire[7:0] data;

reg[0:3] in;

assign data=8’hAF;

assign data[0]=1’b1;

assign data[3:0]=4’b1011; //atribuire catre 4 biti ai vectorului

//vector de tip wire pe 8 biti //vector de tip reg pe 4 biti //atribuire catre tot vectorul //atribuire catre bitul 0 al vect. data

data

Exemplu (dimensiune matriciala):

reg[3:0] databus [15:0]; //matrice bidimensionala ce //corespunde unui set de 16 registre de cate 4 biti

Operatori Verilog

Verilog prezintă trei tipuri de operatori: cu unul, doi sau

trei operanzi:

operatorii unari apar în faţa operandului,

operatorii binari apar între cei doi operanzi,

operatorii ternari separă cei trei operanzi.

Exemple:

Out = ~In;

Out = In1 & In2;

Out = Sel ? A:B; //operator ternar (conditie, functie

//operator unar (complementare logica) //operator binar (functia logica SI)

//multiplexor: daca Sel=1, Out=A altfel

//Out=B)

Operatori aritmetici binari

• Operatorii aritmetici binari operează cu doi operanzi. Operanzii de tip reg şi net sunt trataţi ca operanzi fără semn. Cei de tip real şi integer pot avea semn.

• Dacă orice bit al unui operand este necunoscut (x), atunci rezultatul oricărei operaţii aritmetice este necunoscut.

Operator

Nume

Comentarii

+

Adunare

 

-

Scădere

*

Înmulţire

/

Împărţire

Împărţirea cu zero furnizează un rezultat necunoscut (x)

%

Modul

Operatori aritmetici binari

Exemplu:

module op_aritmetici();

reg[3:0] a, b;

initial begin

• a = 4’b0110; //6

• b = 4’b0010; //2

$display(a*b);

$display(a/b);

$display(a+b);

$display(a-b);

end

endmodule

//inmultire, rezultatul va fi 12

//impartire, evalueaza rezultatul la 3

//adunare, evalueaza rezultatul la 8 //scadere, evalueaza rezultatul la 4

Operatori aritmetici unari

Operatorii unari sunt plus şi minus şi au precedenţă mai

mare decât cei binari. Aceşti operatori modifică semnul

operandului.

Operatori logici

• Operatorii logici sunt: NEGAŢIE logică, ŞI logic şi SAU

logic.

• Aceşti operatori întorc o valoare logică şi anume ADEVĂRAT (1), FALS (0), NEDETERMINAT NECUNOSCUT (x) şi operează doar cu operanzi logici.

• Un operand poate fi o variabilă sau o expresie ce se

evaluează ca adevărat sau fals.

• Aceştia operatori sunt utilizaţi în instrucţiunile if şi while.

Operatori logici

Exemplu:

module op_logici();

reg[3:0] a, b, c;

initial begin a=2; b=0; c=4’bx; $display(a && b); $display(a || b);

$display(!a); $display(a || c);

$display(!c);//NOT logic, se evalueaza ca necunoscut x

end

endmodule

//SI logic, evaluat la 0 //SAU logic, evaluat la 1 //NOT logic, evaluat la 0 //SAU logic, se evalueaza la 1

Operator

Nume

!

Negaţia logică

&&

ŞI logic

||

SAU logic

Operatorii logici NU trebuie confundaţi cu operatorii logici booleeni la nivel

de bit. Exemplu:

• ! este un NOT logic, negare; ex. !(5 == 6) şi generează TRUE.

Operatori la nivel de bit

• Operatorii pe biţi sunt: NEGAŢIE, ŞI, SAU, SAU-EXCLUSIV, ŞI-NU, SAU-NU şi SAU-EXCLUSIV-NEGAT.

• Operatorii la nivel de bit operează pe biţii operandului sau ai operanzilor.

• Operatorii pe biţi execută operaţia bit la bit corespunzător în cei doi operanzi, iar dacă un operand este mai scurt, acesta este extins cu zerouri în partea stângă.

Operatorii SAU-EXCLUSIV (XOR) şi SAU-EXCLUSIV-NEGAT (XNOR) pe biţi sunt utili în realizarea verificărilor de paritate.

Exemplu:

module op_bit(); reg[3:0] a, b, c;

initial begin

a = 4’b1010;

//10

b = 4’b0111;

//7

c = 4’b0100;

//4

$displayb(~a); $displayb(a & c);

//NEGATIE pe biti, evaluat la 0101 //SI pe biti, evaluat la 0000

$displayb(a | c);

//SAU pe biti, evaluat la 1110

Operator

Nume

~

Negaţia la nivel de bit

&

ŞI la nivel de bit

|

SAU la nivel de bit

^

XOR la nivel de bit ŞI-NU la nivel de bit SAU-NU la nivel de bit XNOR la nivel de bit

~& ~| ~^ sau ^~

$displayb(b ^ c); $displayb(a ~^ b); end endmodule

//SAU-EXCLUSIV pe biti, evaluat la 0011 //SAU-EXCLUSIV-NEGAT pe biti,evaluat la 0010

Operatori unari de reducere

• Operatorii de reducere sunt: ŞI, SAU, ŞI-NU, SAU-NU, SAU-EXCLUSIV şi SAU- EXCLUSIV-NEGAT.

• Operatorii unari de reducere primesc un operand şi efectuează o operaţie bit la bit, pornind cu cei mai din stânga 2 biţi şi furnizând un rezultat pe 1 bit. De exemplu, &A va efectua ŞI între toti biţii operandului A.

• Simbolurile pentru operatorii pe biţi şi cei de reducere se suprapun, dar numărul de operanzi diferă în cele două cazuri.

Exemplu:

module op_reducere(); reg[3:0] a, b, c; initial begin

a = 4’b1111; //15

b = 4’b0110; //6

c = 4’b0101; //5

$displayb(&a);//reducere ŞI (1&1&1&1), evaluat la 1

$displayb(|b);//reducere SAU(0|1|1|0), evaluat la 1

$displayb(^c);//reducere XOR(0^1^0^1), evaluat la 0 end endmodule

Operator

Nume

&

Reducere ŞI

|

Reducere SAU

^

Reducere XOR Reducere ŞI-NU

~&

~|

Reducere SAU-NU

~^

Reducere XNOR

Operatori relaţionali

Operatorii relaţionali sunt : MAI MIC, MAI MARE, MAI MIC SAU EGAL, MAI MARE SAU EGAL. Valorile ADEVARAT şi FALS sunt definite în acelaşi fel ca la operatorii logici. În acest caz, dacă orice operand din expresie este nedeterminat (x), toată expresia va fi evaluată ca nedeterminată (x).

Exemplu:

module op_relationali();

reg[3:0] a, b, c, d;

initial begin

• a=4’b1001; //9

• b=4’b1100; //12

• c=4’b1001; //9

• d=4’bx;

$display(a < b);

$display(a > b);

$display(a >= c); //mai mare sau egal, evaluat la 1

$display(d <= a); //mai mic sau egal, rezultatul este nedeterminat (x)

end

endmodule

Operator

Nume

>

Mai mare decât Mai mare decât sau egal

>=

<

Mai mic decât Mai mic decât sau egal

<=

//valoare nedeterminata

//se evalueaza la 1

//se evalueaza la 0

Operatori de egalitate

• Operatorii de egalitate sunt: egalitate logică, inegalitate

logică, egalitate cu selecţie şi inegalitate cu selecţie.

• Operatori egalitate/inegalitate logică vor compara bit cu bit corespunzător pentru egalitate, respectiv inegalitate.

• Operatorii vor returna o valoare nedeterminată (x), dacă

biţii semnificativi sunt necunoscuţi (x) sau în înaltă impedanţă (z).

• Operatorii de egalitate/inegalitate cu selecţie vor

compara operanzii luând în calcul şi biţii necunoscuţi sau

în înaltă impedanţă.

• Dacă un operand este mai scurt decât celălalt, acesta va fi completat cu biţi de 0, cu excepţia cazului în care cel

mai semnificativ bit este necunoscut.

Operatori de egalitate

Operator

Nume

Comentarii

==

Egalitate logică

 

!=

Inegalitate logică

Comparaţia la nivel de bit include compararea valorilor x şi z.

===

Egalitate cu selecţie

Toţi biţii trebuie să fie identici

pentru egalitate.

!==

Inegalitate cu selecţie

Comparaţia la nivel de bit include comparare valorilor x şi z. Oricare diferenţă între biţii comparaţi produce o inegalitate.

Exemplu:

module op_egalitate();

reg[3:0] a, b, c, d, e, f;

initial begin

a = 4; b = 7;

• c = 4’b10; d = 4’bx10;

• e = 4’bx101; f = 4’bxx01;

$displayb(c);

$displayb(d);

$display(a == b);

$display(c != d);

$display(c != f);

$display(c === e); //egalitate cu selecţie, evaluata la 0

$display(c !== d); //inegalitate cu selecţie, evaluata la

//afiseaza 0010 //afiseaza xx10

//egalitate logica, evaluata la 0

//inegalitate logica, evaluata la x

//inegalitate logica, evaluata la 1

1

end

endmodule

Operatori de deplasare

Operatorii de deplasare sunt: deplasare la stânga şi deplasare la dreapta.

• Operatorii de deplasare primesc un vector şi un număr care indică cu câte unităţi se realizează deplasarea.

• Spaţiile goale rezultate sunt completate cu biţi 0.

Operatori de deplasare sunt utili în modelarea registrelor de deplasare, a algoritmilor de înmulţire cu numere mari etc.

Operator

Nume

<<

Deplasare la stânga

>>

Deplasare la dreapta

Exemplu:

module op_deplasare();

reg[3:0] a;

initial begin a = 4’b1011; $displayb(a << 1); //deplasare la stanga cu o unitate afiseaza 0110 $displayb(a >> 1); //deplasare la dreapta cu o unitate afiseaza 0101

$displayb(a << 2); //deplasare la stanga cu 2 unitati afiseaza 1100

$displayb(a >> 3); //deplasare la dreapta cu 3 unitati afiseaza 0001

end

endmodule

Alţi

operatori

Exemple:

module op_concatenare(); reg a; reg[2:0] b; reg[4:0] c; initial begin

a = 1’b1; b = 3’b010; c = 5’b10100;

$displayb({a,b});

$displayb({c[4:2],a});

end endmodule module op_conditional();

reg[3:0] a;

reg[3:0] b; initial begin a = 4'b0010; b = 4'b1010; $displayb(a); $displayb((a==2) ? b+1 : b-1);

end

endmodule

//afiseaza 1010 //afiseaza 1011

//afiseaza 0010 //afiseaza 1011

Operator

Nume

Comentarii

{

,

}

Concatenare

Reuneşte biţii separaţi, furnizaţi de două sau mai multe expresii separate prin virgule

? :

Condiţional

Atribuie una dintre valori în funcţie de condiţie

Precedenţa

operatorilor

+

Operator unar pentru număr pozitiv

-

Operator unar pentru număr negativ

!

Operator unar pentru negare logică

~

Operator unar pentru negare pe biţi

&

Operator de reducere ŞI

~&

Operator de reducere ŞI-NU

^

Operator de reducere SAU-EXCLUSIV

~^

Operator de reducere SAU-EXCLUSIV-NEGAT

|

Operator unar SAU

~|

Operator unar SAU-NU

*

Operator binar de multiplicare

/

Operator binar de împărţire

%

Operator binar modulo

+

Operator binar de adunare

-

Operator binar de scădere

<<

Operator de deplasare la stânga

>>

Operator de deplasare la dreapta

<

Operator de comparare „mai mic”

<=

Operator de comparare „mai mic sau egal”

>

Operator de comparare „mai mare”

>=

Operator de comparare „mai mare sau egal”

= =

Operator de egalitate logică

!=

Operator de inegalitate logică

= = =

Operator de egalitate cu selecţie

!= =

Operator de inegalitate cu selecţie

&

Operator binar logică ŞI pe biţi

^

Operator binar SAU-EXCLUSIV pe biţi

~ ^

Operator binar SAU-EXCLUSIV-NEGAT pe biţi

|

Operator binar logică SAU pe biţi

&&

Operator binar ŞI logic

||

Operator binar SAU logic

? :

Operator ternar condiţional

Specificaţii concurente (1)

• Specificaţiile concurente se execută în paralel, indiferent de

poziţia în care apar în codul sursă. Fiecare specificaţie

concurentă are semnificaţie proprie, independent de celelalte şi este executată asincron faţă de celelalte.

Există trei tipuri de specificaţii concurente:

assign (numită şi specificaţia de atribuire continuă);

initial (construcţie procedurală executată o singură dată);

always (construcţie procedurală executată la infinit).

Specificaţii concurente (2)

Atribuirile continue folosesc cuvântul cheie assign

Exemplu:

assign {cout,out}=in1+in2+cin;

Atribuirile procedurale au forma:

<variabila reg> = <expresie>;

<variabila reg> trebuie să fie un fir de tip registru.

Atribuirea continuă comandă fire de tip wire, fiind

evaluate şi actualizate ori de câte ori o intrare sau

operand îşi modifică valoarea.

Specificaţii concurente (3)

Atribuirile procedurale pot apărea numai

în construcţiile initial şi always.

• Construcţia always se comportă în acelaşi

mod ca şi construcţia initial cu excepţia faptului că aceasta ciclează până la

terminarea simulării.

• Aceste construcţii sunt utilizate pentru

modelarea logicii secvenţiale (automate cu

stări finite)

Specificaţii concurente (4)

• Atribuirea continuă assign este

utilizată pentru a modela logica

combinaţională

• Atribuirea procedurală initial/allways

modifică starea unui registru modeland logica secvenţiala

Specificaţii secvenţiale (1)

Atribuirile secvenţiale nu modifică instantaneu

valoarea unei variabile, ci programează modificarea valorii acesteia.

• Acest mecanism poate fi înţeles ca plasarea

valorii într-un registru a cărui ieşire devine vizibilă doar la momentul de timp planificat.

• Atribuirea în sine are durată zero, dar registrul

menţine valoarea până la o nouă modificare a acesteia, chiar dacă sursa ce a generat valoarea este dezactivată.

Specificaţii secvenţiale (2)

• Atribuirile secvenţiale pot fi interpretate ca

atribuiri declanşate cu întârziere. • Evenimentul de declanşare apare când simularea execuţiei modelului HDL ajunge la acea specificaţie.

• Momentul la care se evaluează o atribuire

secvenţială poate fi controlat prin specificaţii

de control al evenimentelor, specificaţii de

control al timpului, specificaţii condiţionale (if, case) sau specificaţii de iteraţii.

Specificaţii secvenţiale (3)

Există două tipuri de atribuiri secvenţiale:

• atribuiri secvenţiale blocante (atribuiri cu

simbolul =)

<semnal> = <control_timp> <expresie>

• atribuiri secvenţiale neblocante (atribuiri cu simbolul <=). <semnal> <= <control_timp> <expresie>

Specificaţii secvenţiale (4)

Modificarea valorii unui semnal printr-o

atribuire blocantă se face imediat, în momentul execuţiei acesteia, înainte de execuţia specificaţiilor secvenţiale care îi urmează într-un bloc secvenţial.

• Atribuirile secvenţiale neblocante permit

programarea unor atribuiri unui semnal, fără a opri sau bloca fluxul de execuţie a specificaţilor secvenţiale ce îi urmea­ză.

Specificaţii secvenţiale (5)

Exemple:

// atribuire blocanta plasata inaintea celei neblocante

always @(posedge clk) blocant_A1 = blocant_A1-1;

always @(posedge clk) neblocant_A1 <= blocant_A1;

//atribuire neblocanta plasata inaintea celei blocante

always @(posedge clk) neblocant_A2 <= blocant_A2; always @(posedge clk) blocant_A2 = blocant_A2-1;

Specificaţii de selecţie (if)

• Instrucţiunea if este similară cu cea din limbajul C.

Sintaxă:

if (<condiţie>) begin

<specificaţii_secvenţiale_1>;

end [else begin

<specificaţii_secvenţiale_0>;

end]

Exemplu:

if(sel == 0) begin

out = in1;

end else begin out = in2;

end

Specificaţii de selecţie (case)

• Instrucţiunea case selectează câmpul <valoare> care se potriveşte cu

valoarea câmpului <expresie> şi execută instrucţiunea asociată, apoi

controlul este transferat după endcase.

Operator

Nume

~

Negaţia la nivel de bit

&

ŞI la nivel de bit

|

SAU la nivel de bit

^

XOR la nivel de bit ŞI-NU la nivel de bit

~&

~|

SAU-NU la nivel de bit

~^ sau ^~

XNOR la nivel de bit

Exemplu:

Sintaxă:

Case (functie) 0: {cout,out} = in1+in2+cin; 1: out = in1 & in2;

2: out = in1 | in2;

3: out = ~in1; 4: out = ~in2; 5: out = in1 ^ in2;

6: out = ~(in1 ^ in2);

7: out = ~(in1 & in2); default: $display(“Verificati functia”); endcase

case (<expresie>)

<valoare_1>:

<specificaţii_secvenţiale_1>;

<valoare_n>:

<specificaţii_secvenţiale_n>;

default:

<specificaţii_secvenţiale>;

endcase

Specificaţii de iteraţii (for)

• Instrucţiunea for este foarte apropiată de cea din limbajul

C, cu excepţia că operatorii ++ şi - - sunt înlocuiţi de

expresia i = i + 1, respectiv i = i - 1.

Sintaxă:

Exemplu:

for

integer i; for (i=0;i<=15;i=i+1)

(<atribuire_iniţială>;<expresie>

begin

;<pas>)

write = 1;

begin

read = 0;

<specificaţii_secvenţiale>;

#15

end

adresa = adresa+1;

data_write = data_write+2; end

Specificaţii de iteraţii (while)

• Instrucţiunea while operează în forma normală.

Sintaxă:

while (<expresie>)

begin

<specificaţii_secvenţiale>;

end

Exemplu:

integer i;

i = 0;

while(i < 10)

begin

$display("i= %d", i);

i = i + 1;

end

Specificaţii de iteraţii (repeat)

• Instrucţiunea repeat repetă un bloc specificat de un număr

fixat de ori.

Sintaxă:

repeat (<expresie>) begin <specificaţii_secvenţiale>;

end

Exemplu:

repeat (10) begin

$display("k= %d", k);

k = k + 1; end

Specificaţii de iteraţii (forever)

• Instrucţiunea forever repetă un bloc specificat de

instrucţiuni până la terminarea simulării.

Sintaxă:

Exemplu:

forever

reg clk;

<specificaţii_secvenţiale>;

initial

begin

clk = 1'b0; forever #10 clk = ~clk; end

Specificaţii de control temporal,

controlul intarzaierii

Controlul întârzierii constă în specificarea unui interval de timp între

momentul apariţiei specificaţiei şi momentul executării efective a acesteia. O întârziere a execuţiei specificaţiei secvenţiale este marcată în cod prin simbolul # urmat de un număr ce reprezintă numărul de

unităţi de timp (ns) cu care va fi întârziată execuţia.

Sintaxă:

#<întârziere>

<specificaţie_secvenţială>;

Exemplu:

initial begin #5 in = 1;

#6 in = 2;

#2 in = 3; end

Specificaţii de control temporal,

controlul evenimentelor

Controlul evenimentelor constă în specificarea unei condiţii bazată pe semnale care determină execuţia specificaţiei asociate. Evenimentele pot fi controlate de fronturile unor semnale sau de nivele de semnale.

Controlul evenimentului asociat unei specificaţii secvenţiale determină

întârzierea execuţiei specificaţiei până la îndeplinirea condiţiei impuse.

Sintaxă:

@ <eveniment> <specificaţie_secvenţială>;

Exemple:

@(posegde clk) out = in << 1; @(posedge clk or negedge reset)

in = 8'b0;

@(A or B) out =4'bz;

Task-uri şi funcţii (1)

Permit implementarea aceleaşi funcţionalităţi în

mai multe locuri în cadrul unui model comportamental.

Descrierile frecvente vor fi apelate (invocate) în

loc de a se repeta codul necesar.

• Majoritatea limbajelor de programare furnizează proceduri sau subrutine pentru a îndeplini această sarcină.

• Verilog oferă task-uri şi funcţii pentru a împărţi un model comportamental amplu în fragmente mai mici.

Task-uri şi funcţii (2)

Task-urile şi funcţiile permit proiectantului

să abstractizeze codul Verilog utilizat în mai multe locaţii din model.

• O funcţie Verilog se comportă asemenea unei subrutine dintr-un limbaj de

programare software, iar un task este

asemănător unei proceduri.

Task -urile pot avea zero sau mai multe argumente şi nu întorc o valoare.

Task-uri

• Un task poate conţine sau nu declaraţii

input, output sau inout;

• Un task nu returnează o valoare;

• Un task poate conţine instrucţiuni

controlate de timp şi poate fi activat de un

eveniment, o listă de sensitivitate, etc;

Un task poate apela alte task-uri şi funcţii.

Sintaxa unui task

Sintaxa unui task este următoarea:

task <nume_task >; <listă_porturi>; <declaraţii_ale_variabilelor_locale>;

begin

<atribuiri_procedurale>;

end

endtask

unde <listă_porturi> conţine declaraţiile porturilor input, output sau inout, <declaraţii_ale_variabilelor_locale> conţine declaraţiile variabilelor locale, care nu pot fi accesibile din exteriorul task -ului.

Invocarea unui task se realizează astfel:

<nume_task> (<listă_porturi>);

Functii (1)

• O funcţie Verilog trebuie să se execute într-o unitate de timp simulat #0;

• O funcţie nu poate conţine instrucţiuni de control al

timpului, cum ar fi comanda întârzierii (#),

comandă eveniment (@ ) sau instrucţiunea wait;

O funcţie trebuie să conţină cel puţin un argument

de intrare de tip input;

O funcţie nu poate conţine declaraţii de tipul inout sau output;

• O funcţie Verilog nu poate invoca un task, dar

poate apela alte funcţii;

Functii (2)

• Definiţia unei funcţii trebuie să conţină cel puţin

un argument de intrare.

• Transferul argumentelor în cazul funcţiei este

asemănător cu cel de la task -uri.

• În declaraţia unei funcţii se specifică numele acestea, dimensiunea valorii pe care o returnează funcţia, argumentele de intrare ale funcţiei, variabilele locale (reg) utilizate, parametrii şi variabilele integer ale funcţiei.

Sintaxa function

function <gama_sau_tipul><nume_funcţie>;

<porturi_argumente>;

<declaraţii>;

begin

<atribuiri_ procedurale>;

end

endfunction

<gama_sau_tipul> reprezintă tipul rezultatelor returnate expresiei care a apelat funcţia.

Câmpul <porturi_argumente> conţine declaraţiile porturilor de intrare, o funcţiei

necesitând cel puţin o intrare, şi declararea variabilelor locale care sunt accesibile doar

în interiorul funcţiei.

Apelarea unei funcţii este un operand într-o expresie şi trebuie să se specifice în lista sa toţi parametrii de intrare.

Task-uri şi funcţii sistem

• Verilog conţine câteva task-uri şi funcţii predefinite.

Task-urile şi funcţiile de sistem nu sunt sintetizabile, ci

oferă doar suport pentru testare. Task-uri şi funcţii sistem in Verilog:

task-uri de afişare: $display, $write, $strobe, $monitor;

task-uri de accesare a fişierelor: $fopen, $fdisplay, $readmemb, $readmemh;

task-uri pentru controlul simulării: $stop, $finish;

task-uri pentru verificări temporale: $setup; $hold, $setuphold, $width, $period, $skew, $recovery;

funcţii referitoare la timpul simulării: $time;

• funcţii pentru generarea numerelor aleatorii: $random.

Task-uri de afişare

Task-uri de accesare a

fişierelor

Task-uri pentru controlul

simulării

Task-uri pentru verificări

temporale

Mediul de simulare (TestBench)

VHDL

1980 - VHDL (Very High Speed IC Hardware Description

Language) a fost lansat

1983 - Contracte de dezvoltare VHDL cu Intermetrics, IBM si Texas Instruments

1985: VHDL Versiunea 7.2

1987: VHDL devine standard IEEE 1076-1987 iar in 1988

este inclus si in standardizarea ANSI (American National Standards Institute)

1993: restandardizare pentru clarificari si extindere: IEEE

1076-1993, IEEE 1164

1994: apare IEEE 1076.3, defineste standardizarea reprezentarii numerelor

1995: apare IEEE 1076.4, include specificatiile temporale

1998: update la VHDL-93

2001: revizuire IEEE

VHDL concepte de baza

Concepte fundamentale VHDL

Concurenta

Ierarhie

Structura descriere VHDL

Entitati: definite prin porturile de intrare/iesire

Arhitecturi: descriu functionarea circuitului

Entitate / arhitectura

Comparator a doi vectori pe 8 biti si care furnizeaza

rezultatul comparatiei pe 1 bit (egal sau diferit):

library ieee;

use ieee.std_logic_1164.all;

entity compare is port(A,B: in std_logic_vector(0 to 7); EQ: out std_logic);

end compare; architecture compare1 of compare is begin

EQ <= ‘1’ when (A = B) else ‘0’;

end compare1;

Entitate / arhitectura

Declararea entitatii se refera la definirea porturilor de conectare in/out ale unui bloc

functional (entitate)

Entitatile au asociata o arhitectura

Arhitectura se refera la functia realizata,

definind o legatura intre intrari si iesiri

Declararea entitatilor

entity compare is

port (A,B: in std_logic_vector(0 to 7);

EQ: out std_logic);

end compare;

Defineste interfatarea circuitului: porturi, nume, tip, directie

Nu inlude informatii functionale

Se intinde intre entity NUME is end NUME;

Contine lista porturilor, directia ficaruia (in, out,

inout) si tipul std_logic (pt. 1 bit) sau

std_logic_vector(0 to n) (pt. n biti) ;

Declararea arhitecturilor

architecture compare1 of compare is

begin EQ <= ‘1’ when (A = B) else ‘0’; end compare1;

Incepe cu cuvantul cheie architecture

Arhitectura primeste un nume particular (NUME1) asociat unei entitati (NUME)

Defineste interfatarea circuitului: porturi, nume, tip, directie

Nu include informatii functionale

Iesirea primeste o asignare conditionala concurenta determinata de valorile intrarilor

Ierarhizarea permite includerea de componenete de nivel scazut,

subrutine, functii sau chiar procese

Tipuri de date

Date privite ca si conexiuni

Individual wires

Array

Tipurile de date

std_logic (9 posibilitati)

std_logic_vector (o arie de std_logic)

Tipuri de date fundamentale

Tipuri de date fundamentale

Tipuri de date suplimentare

(IEEE 1164, 1076.3)

Tipuri de date suplimentare (IEEE 1164, 1076.3)

Unitati de proiectare (Design Units)

1

Entitati (Entities) - keyword entity ; contine definirea specificatiilor de conectare externa intr-o declaratie entity

2

Arhitecturi (Architectures) - keyword architecture ; contine 0 sau mai multe declaratii cuprinse

intre begin si end

3

Pachete (Packages) - keyword package ; contine elemente care pot fi folosite de mai multe unitati de proiectare si pot fi compilate pentru a genera biblioteci pentru utilizare ulterioara

4

Corpul pachetului (Package Bodies) keyword package body

Type and subtype declarations

Constant declarations

Global signal declarations

Function and procedure declarations

Attribute specifications

File declarations

Component declarations

Alias declarations

Disconnect specifications

Use clauses (use)

5

Configuratii (Configurations) keyword configuration ; contine specificarea arhitecturii asociate unei entitati si permite modficarea alocarilor in timpul simularii sau sintezei; este optional

Nivele de abstractizare

1.Comportamental (Behavior)

2.Flux de date (Dataflow)

3.Structural (Structure)

Descriere flux de date (Dataflow)

(comparator pe 8 biti)

Descriere flux de date (Dataflow) (comparator pe 8 biti)
Descriere flux de date (Dataflow) (comparator pe 8 biti)
Descriere flux de date (Dataflow) (comparator pe 8 biti)

Asignarea conditionata

Asignarea conditionata

Utilizarea

proceselor

(registru de

deplasare pe 8 biti)

& = concatenare
& = concatenare

Declararea proceselor in VHDL

Declararea proceselor in VHDL

Declararea procesului in cazul

registrului de deplasare in inel:

Declararea procesului in cazul registrului de deplasare in inel:

Descrierea registrului de deplasare in inel folosind declaratii concurente

(reprezentare prin logica combinationala si registre)

Exemplu de utilizarea a procedurii dff

si registre) Exemplu de utilizarea a procedurii dff O posibila procedura pentru pentru un bistabil D

O posibila procedura pentru pentru un bistabil D flip-flop (“dff”):

registre) Exemplu de utilizarea a procedurii dff O posibila procedura pentru pentru un bistabil D flip-

Descrierea VHDL structurala

(descrie conexiunile

intre componente)

Descrierea VHDL structurala (descrie conexiunile intre componente)

Exemplu de secventa de test VHDL (“test bench”)

Exemplu de secventa de test VHDL (“test bench”)