Sunteți pe pagina 1din 8

SINTEZA CIRCUITELOR FOLOSIND

LIMBAJUL VHDL (I)





1. Scopul lucrrii
Prezentarea structurii unui program realizat n VHDL i prezentarea unor
structuri combinaionale simple care s exemplifice utilizarea principalelor elemente
de sintax ale limbajului VHDL. Verificarea funcionrii circuitelor sintetizate se face
cu ajutorul mediului ModelSim.

2. Aparate necesare
- calculator compatibil Pentium, minim 500MHz, minim 128MB RAM
- mediul de programare ISE (Integrated Software Environment)-versiunea
8.1i, furnizat de firma Xilinx, instalat pe o platform Windows 2000 (SP2
sau SP3) sau XP. Programul poate fi instalat i pe sistemele de operare
Linux sau Solaris. Se poate folosi i versiunea free ISE WebPack, care
poate fi descarcat de pe site-ul firmei Xilinx.
- mediul ModelSim de la Mentor Graphics, care poate fi descarcat de pe
site-ul firmei Xilinx.

3. Consideraii teoretice
n prezent exist dou limbaje HDL folosite n proiectarea sistemelor digitale:
VHDL i Verilog HDL. Preocuparea pentru dezvoltarea unui limbaj HDL a aprut n
anii 1980', n cadrul Departamentului de Aprare al SUA. Rezultatul a fost limbajul
VHDL (Very High Speed Integrated Circuits Hardware Description Language) care a
fost standardizat n 1987 sub numrul IEEE-1076. Ulterior, lipsa unor tipuri de date
general acceptate a fost rezolvat prin apariia standardului IEEE-1164. VHDL are o
sintax asemntoare limbajului Ada. Limbajul Verilog HDL (Very-logic Hardware
Description Logic) a fost dezvoltat n mediul industrial, folosind o sintax
asemntoare limbajului C. n anul 1991, se nfiineaz organizaia OVI (Open
Verilog International) cu scopul de a promova i standardiza limbajul Verilog.
Standardul IEEE-1364 descrie limbajul Verilog HDL mpreun cu o colecie de rutine
ce permit interfaarea cu alte programe. Dei la nceput a dominat limbajul VHDL, la
ora actual fiecare limbaj ocup cam jumtate din piaa de aplicaii comerciale HDL.
Proiectantul de sisteme numerice poate utiliza oricare dintre cele dou limbaje
HDL, mai ales c pachetele CAD actuale permit alegerea limbajului convenabil de
ctre fiecare utilizator. Este normal ca fiecare proiectant s prefere un anumit limbaj,
dar este bine s aib cunotine i despre cellalt, mai ales dac trebuie s refoloseasc
biblioteci create de ali proiectani.
Limbajul VHDL are cteva avantaje evidente care l recomand pentru sinteza
sistemelor complexe: are o capacitate mai mare de abstractizare i modelare a
sistemelor, folosete tipuri de date definite de proiectant, procedurile i funciile pot fi
uor refolosite utiliznd biblioteci concept care nu exist n Verilog, permite
replicarea structural a sistemelor mari folosind cuvntul cheie generate, are un
1
suport puternic pentru descrierea vectorilor de test i lucrul cu fiiere i permite
modelarea sistemelor analogice sau de comand i control (motoare electrice, senzori
etc.). Pe de alt parte, i limbajul Verilog HDL are cteva avantaje: tipurile de date
sunt simple i eficiente, principalele pori logice sunt definite n limbaj, codul scris
este mai concentrat i este relativ uor de nvat, avnd o sintax apropiat de cea a
limbajului C.
Orice program VHDL trebuie s conin trei uniti fundamentale: o list a tuturor
bibliotecilor folosite n proiect (prin declaraia LIBRARY), o descriere de interfa care
definete intrrile i ieirile circuitului (prin declaraia ENTITY) i un corp arhitectural
care conine descrierea comportrii circuitului (prin declaraia ARCHITECTURE).
Pentru o declaraie LIBRARY sunt necesare dou linii de cod: una care conine
numele bibliotecii i cealalt o clauz use, conform sintaxei de mai jos:

LIBRARY library_name;
USE library_name.package_name.package_parts;

De obicei se folosesc cel puin 3 pachete din 3 biblioteci diferite: std_logic_1164 (din
biblioteca ieee), standard (din biblioteca std) i work (din biblioteca work).
Declaraiile lor sunt urmtoarele:

LIBRARY ieee;
USE ieee.std_logic_1164.all;

LIBRARY std;
USE std.standard.all;

LIBRARY work;
USE work.all;

Bibliotecile std i work sunt folosite implicit, aa c nu mai trebuie neaprat s le
declarm. Std este o bibliotec de resurse pentru mediul VHDL, iar n work sunt salvate
fiierele proiectului (fiierele .vhd i fiierele generate prin compilare, simulare etc.).
ENTITY este o list de specificaii intrare-ieire cu urmtoarea sintax:

ENTITY entity_name IS
PORT (
port_name : signal_mode signal_type;
port_name : signal_mode signal_type;
...);
END entity_name;

Signal_mode poate fi IN sau OUT pentru pini unidirecionali, INOUT pentru pini
bidirecionali, sau BUFFER dac informaia de la ieire este introdus din nou ca
intrare n circuit. Signal_type poate fi BIT n cazul semnalelor binare, STD_LOGIC
dac avem mai multe niveluri logice (nivel necunoscut, stare de nalt impedan etc.),
BOOLEAN, INTEGER pentru numere ntregi pe 32 bii, SIGNED i UNSIGNED
pentru tipuri de date definite n pachetul std_logic_arith din biblioteca ieee etc.
ARCHITECTURE descrie comportarea circuitului, conform sintaxei:

ARCHITECTURE architecture_name OF entity_name IS
[declarations]
BEGIN
(code)
END architecture_name;

2
A
B
S1
p1
C
p2
p3
S2
F


Fig. 3.1 Schema logic a unei funcii binare

n cadrul blocului de declaraii (care este opional) se specific semnalele i
constantele folosite, iar n blocul care conine codul (cuprins ntre BEGIN i END) se
descrie comportarea circuitului pe care dorim s-l sintetizm.
S exemplificm acum un cod VHDL posibil pentru implementarea funciei
C B A f + = , care are schema logic reprezentat n figura 3.1. O descriere
comportamental a circuitului ar putea fi dat de urmtorul cod VHDL:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
------------------------------------------
ENTITY clc_porti IS
PORT ( A, B, C : IN STD_LOGIC;
f : OUT STD_LOGIC);
END clc_porti;
------------------------------------------
ARCHITECTURE behavioral OF clc_porti IS
BEGIN
PROCESS (A, B, C)
BEGIN
f <= (A AND B) NOR (NOT C);
END PROCESS;
END behavioral;

Observm c apare aici instruciunea PROCESS, urmat de o list de semnale, numit
list de sensibilitate. De fiecare dat cnd un semnal din list i modific valoarea,
procesul este activat i se execut instruciunile din interiorul lui. Dac implementm
aceast funcie ntr-un FPGA, atunci nu se vor interconecta nite pori logice, ci se va
memora tabelul de adevr al funciei f ntr-un registru de 8 bii, care formeaz un
singur LUT cu 3 intrri.
O descriere structural a circuitului este mai complicat pentru c trebuie s
descriem fiecare dintre porile logice ca entiti separate, s le definim ca i
componente, iar apoi trebuie s descriem interconectarea acestor componente conform
schemei logice a circuitului. Un exemplu posibil pentru circuitul din figura 3.1 ar
putea fi urmtorul:

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY and2 IS
PORT (in1, in2 : IN STD_LOGIC;
output : OUT STD_LOGIC);
END and2;

3
ARCHITECTURE and2_behave OF and2 IS
BEGIN
PROCESS (in1, in2)
BEGIN
output <= in1 and in2;
END PROCESS;
END and2_behave;
------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY not1 IS
PORT (in1 : IN STD_LOGIC;
output : OUT STD_LOGIC);
END not1;

ARCHITECTURE not1_behave OF not1 IS
BEGIN
PROCESS (in1)
BEGIN
output <= not in1;
END PROCESS;
END not1_behave;
------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY nor2 IS
PORT ( in1, in2 : IN STD_LOGIC;
output : OUT STD_LOGIC);
END nor2;

ARCHITECTURE nor2_behave OF nor2 IS
BEGIN
PROCESS (in1, in2)
BEGIN
output <= not(in1 or in2);
END PROCESS;
END nor2_behave;
------------------------------------------

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY clc_porti IS
PORT ( A, B, C : IN STD_LOGIC;
f : OUT STD_LOGIC);
END clc_porti;
ARCHITECTURE structural OF clc_porti IS
COMPONENT and2
PORT ( in1, in2 : IN STD_LOGIC;
output : OUT STD_LOGIC);
END COMPONENT;
COMPONENT not1
PORT ( in1 : IN STD_LOGIC;
output : OUT STD_LOGIC);
END COMPONENT;

4
COMPONENT nor2
PORT ( in1, in2 : IN STD_LOGIC;
output : OUT STD_LOGIC);
END COMPONENT;
SIGNAL S1, S2: STD_LOGIC;
BEGIN
p1: and2 PORT MAP(A,B,S1);
p2: not1 PORT MAP(C,S2);
p3: nor2 PORT MAP(S1,S2,f);
END structural;

Observm c trebuie s definim nainte porile utilizate, adic s le definim ca
entiti i componente ntr-un corp arhitectural. Trebuie s declarm bibliotecile
folosite de fiecare dat cnd definim entitatea i arhitectura comportamental pentru
fiecare tip de poart logic folosit n circuit (am notat cu and2 poarta I cu 2 intrri,
dar denumirile acestor componente sunt arbitrare; nu puteam ns folosi cuvntul and
pentru c acesta este un cuvnt rezervat n VHDL indic operaia binar I). Ultimul
modul din programul surs conine din nou bibliotecile folosite, lista de semnale
intrare-ieire ale circuitului global, numit aici clc_porti, i descrierea structural a
circuitului. Acest corp arhitectural conine componentele folosite, introduse prin
declaraia COMPONENT, componente care trebuie s fie i instaniate. Fiecare poart
logic din circuit are un nume (de exemplu p1) urmat de dou puncte, numele
componentei (de exemplu and2) i cuvntul cheie PORT MAP, care definete modul
de interconectare a componentelor. Nu este singura modalitate de definire a
semnalelor din lista lui PORT MAP. De exemplu, pentru poarta p1, puteam scrie: p1:
and2 PORT MAP(in1=>A,in2=>B,output=>S1);. Declaraia SIGNAL
specific lista semnalelor din nodurile interne ale circuitului (vezi figura 3.1).
Exemplul prezentat pare mai complicat, dar componentele definite pot fi
refolosite ori de cte ori avem nevoie de ele, inclusiv ca blocuri, celule sau macro-uri
ntr-o entitate aflat la un nivel ierarhic mai nalt. n aa fel se poate obine o reducere
semnificativ a complexitii proiectelor mari.
Observm c porile logice au fost considerate ideale, adic cu timpi de
propagare nuli. De fapt, dac nu specificm o valoare a timpului, atunci rezult o
valoare implicit, pozitiv dar infinitezimal de mic, numit timp delta. Dac dorim s
introducem totui ntrzieri pentru modelarea timpilor de propagare prin pori, atunci
putem, de exemplu, s nlocuim instruciunea y <= a and b; cu y <= a and
b after 5 ns; dar aceast ntrziere va fi ignorat la sinteza circuitelor n
CPLD-uri sau FPGA-uri. ntrzierea real va fi dat de tehnologia de realizare a
circuitului integrat respectiv. Aceste ntrzieri se pot introduce mai degrab pentru
semnalele de intrare folosite n scopul testrii circuitului sintetizat.

MUX
sel
in1 (7:0)
in2 (7:0)
out1 (7:0)


Fig. 3.2 Multiplexor cu 2 ci de date pentru vectori de 8 bii

5
Un alt exemplu este circuitul schiat n figura 3.2. Dac semnalul sel este pe
0 logic, atunci cele 8 linii de ieire out1 sunt identice cu cele 8 linii de intrare in1.
Dac sel este pe 1 logic, atunci la ieire vom obine informaia de pe cealalt intrare,
notat cu in2. Codul VHDL care descrie acest circuit folosind instruciunea IF ar
putea fi urmtorul (dup cum vom vedea mai departe, se pot folosi i alte instruciuni,
cum ar fi WHEN sau CASE):

LIBRARY ieee;
USE ieee.std_logic_1164.all;
---------------------------------------------------
ENTITY mux IS
PORT (in1, in2: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
sel: IN STD_LOGIC;
out1: OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
END mux;
---------------------------------------------------
ARCHITECTURE behavioral OF mux IS
BEGIN
PROCESS (in1, in2, sel)
BEGIN
IF (sel = '0') THEN
out1 <= in1;
ELSE
out1 <= in2;
END IF;
END PROCESS;
END behavioral;

Aici am folosit instruciunea IF, una dintre instruciunile secveniale ale limbajului
VHDL. Aceste instruciuni sunt folosite n procese i subprograme pentru a descrie
algoritmi (alte instruciuni secveniale sunt CASE, WAIT, LOOP, WHILE, FOR etc.).
Spre deosebire de acestea, instruciunea PROCESS este o instruciune concurent
care, fie se execut de fiecare dat la modificarea semnalelor din lista de senzitiviti,
fie pn la ntlnirea unei instruciuni WAIT. Mai trebuie s observm n acest
program i modul n care sunt declarate vectorial porturile in1, in2 i out1.

4. Modul de lucru
4.1. Se implementeaz circuitul din figura 3.1 folosind mediul ISE i limbajul
VHDL. Se face un proiect care conine un fiier .vhd ce descrie comportamental
circuitul i se simuleaz funcionarea circuitului n ModelSim. Se repet sinteza i
simularea pentru un nou proiect, al crui cod surs descrie structural circuitul.

4.2. Se face sinteza VHDL a multiplexorului prezentat n figura 3.2 i se
verific funcionarea circuitului folosind cele dou simulatoare: cel existent n mediul
ISE i simulatorul ModelSim.

4.3. S se implementeze un multiplexor cu 4 ci de intrare I0, I1, I2 i I3.
Intrarea de selecie sel este un vector cu dou componente, iar ieirea circuitului este
notat cu Y. Implementarea se face n limbajul VHDL, n dou variante: folosind
instruciuni WHEN/ELSE (sau WHEN simplu) i apoi folosind WITH/SELECT/
WHEN (sau WHEN selectat). S se verifice funcionarea circuitului prin simulare.


6
Implementarea cu instruciunea WHEN/ELSE poate avea urmtorul cod:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
---------------------------------------------------
ENTITY mux IS
PORT (I0, I1, I2, I3: IN STD_LOGIC;
sel: IN STD_LOGIC_VECTOR (1 DOWNTO 0);
Y: OUT STD_LOGIC);
END mux;
---------------------------------------------------
ARCHITECTURE mux1 OF mux IS
BEGIN
Y <= I0 WHEN sel = "00" ELSE
I1 WHEN sel = "01" ELSE
I2 WHEN sel = "10" ELSE
I3;
END mux1;

Implementarea cu instruciunea WITH/SELECT/WHEN are un corp
arhitectural modificat (am notat cu mux2). LIBRARY i ENTITY nu se modific cu
nimic. Iat codul surs pentru ARCHITECTURE:

ARCHITECTURE mux2 OF mux IS
BEGIN
WITH sel SELECT
Y <= I0 WHEN "00", -- aici se pune ","
I1 WHEN "01",
I2 WHEN "10",
I3 WHEN OTHERS; --nu se pune "WHEN "11""
END mux2;


4.4. S se implementeze n VHDL un buffer cu 3 stri. Dac intrarea enable
este pe 0 logic, atunci vectorul de intrare de 8 bii aplicat la intrarea input se
regsete la ieirea output. n caz contrar, ieirea se gsete n starea de nalt
impedan, adic output = "ZZZZZZZZ". S se verifice funcionarea circuitului
prin simulare. Secvena de instruciuni care descrie circuitul ar putea fi:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
---------------------------------------------------
ENTITY tri_state IS
PORT (enable: IN STD_LOGIC;
input: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
output: OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
END tri_state;
---------------------------------------------------
ARCHITECTURE tri_state OF tri_state IS
BEGIN
output <= input WHEN (enable = '0') ELSE
(OTHERS => 'Z');
END tri_state;




7
4.5. S se implementeze n VHDL o unitate aritmetic i logic simpl, cu
urmtoarele specificaii: A i B sunt cei doi operanzi pe 4 bii, iar Y este rezultatul
furnizat la ieire, tot pe 4 bii. Nu exist semnal de intrare de carry, iar cei doi bii de
pe intrarea de selecie stabilesc tipul operaiei efectuate, astfel: dac sel = 00,
atunci Y = A + B, dac sel = 01, atunci Y = A + 1, dac sel = 10, atunci
Y = A & B, iar dac sel = 11, atunci Y = A | B. Secvena de instruciuni
care descrie circuitul ALU ar putea fi urmtoarea:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
---------------------------------------------------
ENTITY ALU IS
PORT (A, B: IN STD_LOGIC_VECTOR (3 DOWNTO 0);
sel: IN STD_LOGIC_VECTOR (1 DOWNTO 0);
Y: OUT STD_LOGIC_VECTOR (3 DOWNTO 0));
END ALU;
---------------------------------------------------
ARCHITECTURE behv OF ALU IS
BEGIN
PROCESS (A, B, sel)
BEGIN
CASE sel IS
WHEN "00" =>
Y <= A + B;
WHEN "01" =>
Y <= A + 1;
WHEN "10" =>
Y <= A and B;
WHEN "11" =>
Y <= A or B;
WHEN OTHERS =>
Y <= "XXXX";
END CASE;
END PROCESS;
END behv;









8

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