Sunteți pe pagina 1din 14

Bolovan Cristina

IESI – An I

Cercetare
ştiinţifică şi practică
Studiu asupra proiectării de aplicaţii
VHDL pentru operaţii complexe

Universitatea din Piteşti


Facultatea de Electronică, Comunicaţii şi Calculatoare
Studiu asupra proiectării aplicaţiei

Tema
Studiu asupra proiectării de aplicaţii VHDL pentru efectuarea de
operaţii complexe.

Obiective
1. Se vor lua în considerare următoarele operaţii:
 înmulţirea;
 împărţirea;
 extragerea radicalului (rădăcina pătrată).

Introducere
VHDL este unul dintre limbajele standard folosite în industrie la ora
actuală, pentru a descrie sistemele numerice. VHDL înseamnă VHSIC
(Very High Speed Integrated Circuits) Hardware Description Language
adică un limbaj pentru descriere hardware a circuitelor integrate de
foarte mare viteză. Iniţial, acest limbaj foarte asemănător cu limbajul
ADA, a fost destinat doar modelării şi simulării unor circuite ASIC
complexe şi numai ulterior a fost utilizat pentru sinteza şi implementarea
logicii corespunzătoare.
Aşa cum s-a menţionat deja, un sistem numeric poate fi
reprezentat la diferite nivele de abstractizare. Acest lucru facilitează mai
ales descrierea şi proiectarea sistemelor complexe.
Cel mai înalt nivel de abstractizare este nivelul de descriere al
comportării (funcţionării) numit în engleză behavioral. La acest nivel de
abstractizare un sistem este descris prin ceea ce face, adică modul cum
se comportă şi nu prin componentele sale şi conexiunile dintre acestea.
O descriere de acest tip specifică relaţiile dintre semnalele de intrare şi
ieşire. Descrierea poate fi o expresie booleană sau o descriere mai
abstractă, la nivelul transferului între registre sau la nivelul algoritmilor.

2
Circuitul de înmultire secvential pe 4 biti
În figura de mai jos este prezentată organigrama pentru algoritmul
de înmulţire.

Figura 1. Organigrama algoritmului de înmultire

Algoritmul începe cu testarea ultimului bit din înmultitor. Daca


acest bit este 1 atunci jumatatea superioara a produsului este adunata
cu deînmultitul si rezultatul este depus în jumatatea superioara a
produsului. Produsul este apoi deplasat la dreapta, împreuna cu
înmultitorul. Pasul se repeta pentru fiecare bit din înmultitor, deci daca
înmultitorul este pe 4 biti atunci vor exista 4 pasi distincti.

Avantajul acestui algoritm este acela ca numarul de iteratii (pasi


efectuati) este întotdeauna egal cu dimensiunea unuia din operanzi
(împartitorul) (nu depinde de valoarea operanzilor). Un alt avantaj îl
consta faptul ca împartitorul se afla depus în registrul produs, deci
foloseste resurse hardware limitate.

3
În componenta unui circuit de înmultire intra urmatoarele module:
- sumator 4 biti;
- registrul paralel-paralel pe 4 biti pentru deînmultit;
- registrul serie-paralel cu deplasare la dreapta.

1. Sumatorul complet pe un bit

În unităţile de calcul moderne sunt folosite circuite de adunare şi


cădere implementateparalel. La baza oricărei structuri de adunare se
află sumatorul complet pe un bit. Construcţia acestuia începe de la
construirea tabelului de adevar pentru o operaţie de adunare.

Sumatorul complet pe un bit este conceput pentru adunarea a


două numere pe câte un bit fiecare returnând drept rezultat un bit de
sumă şi unul de transport. Acesta are intrări, două intrări fiind cele două
numere iar cea de-a treia fiind transportul pe intrare conform figurii de
mai jos:

Figura 2. Schema bloc a sumatorului complet pe un bit

O soluţie de implementare a circuitului folosind şi porţi XOR


(disponibile în structurile logice actuale) ar fi următoarea:

Figura 3. Schema internă a sumatorului complet pe un bit

4
2. Sumatorul pe 4 biţi

Este cea mai simplă posibiltate de realizare a unui circuit de


adunare folosind blocurile prezentate la paragraful anterior. Această
metodă îşi are punctul de plecare de la modul în care noi adunăm două
numere. De exemplu pentru două numere pe patru cifre fiecare:
a3a2a1a0 şi b3b2b1b0 dacă dorim să facem suma între ele adunăm în
prima fază cifrele cu semnificaţia cea mai redusă a0 şi b0 scrie rezultatul
(s0) şi apoi continuăm adunând cifrele a1, b1 şi eventualul transport
care a apărut la adunarea anterioară ş.a.m.d.
Urmărind această procedură se poate descrie un sumator a două
numere pe patru biţi astfel:

Figura 4. Circuit adunare a două numere pe 4 biţi folosind transporturi parţiale

3. Registrul paralel - paralel

Este folosit pentru memorarea datelor de intrare în format paralel.


Accesul la registru se face printr-un semnal de ceas care determina
memorarea datelor de la intrare si regasirea acestora pe iesire.
Structura unui registru cu acces paralel, pe 4 biti, descrisa cu
bistabili D este prezentata în figura de mai jos:

Figura 5. Registrul paralel – paralel pe patru biti

5
Codul VHDL pentru registrul paralel - paralel este:
use IEEE.STD_LOGIC_1164.all;
entity rpp4 is
port(
clk : in STD_LOGIC;
d : in STD_LOGIC_VECTOR(3 downto 0);
q : out STD_LOGIC_VECTOR(3 downto 0)
);
end rpp4;
architecture rpp4_a of rpp4 is
begin
process(d,clk)
variable q_int : std_logic_vector(3 downto 0);
begin
if clk'event and clk='1' then
q_int := d;
end if;
q <= q_int;
end process;
end rpp4_a;

4. Registrul paralel cu deplasare seriala (serie-paralel)

O asemenea structura, cu mici modificari, poate fi folosita la


implementarea pentru diferite operatii, de exemplu deplasarea. La
schema la nivel de componente logice prezentata pentru registrul cu
acces paralel în figura 1 se mai adauga patru circuite de selectie care
selecteaza sursa intrarii D. În figura 2 este prezentata schema unui
registru cu încarcare paralela si deplasare seriala la dreapta, pe 4 biti,
realizat cu bistabili D.
Circuitul poate opera în doua moduri. Daca pe intrarea „s_notp”
primeste valoarea 0 circuitul va opera la fel ca cel din figura 1, deoarece
pe fiecare intrare D se va gasi unul din semnalele pi0..3. Daca intrarea
„s_notp” este 1 atunci pe intrarea D la primul bistabil (U1) se va conecta
intrarea si în timp ce pe intrarile D de la ceilalti bistabili se vor regasi
iesirile bistabililor din etajele anterioare.

Figura 6. Registrul serie – paralel cu deplasare la dreapta

6
În figura de mai jos este prezentata schema circuitul de înmultire
folosind aceste trei module.

Figura 7. Schema circuitului de înmulţire

7
Simularea circuitului de înmulţire:

Circuitul de împărţire pe 4 biţi


Algoritmul utilizează trei regiştri pentru stocarea operanzilor, a
rezultatelor intermediare şi a rezultatului final (rest şi cât). Aceştia sunt:
un registru cu încărcare paralelă pentru înmulţitor, un registru cu
încărcare paralelă şi deplasare la stânga pentru deînmulţit, rezultate
parţiale şi cât, un registru cu încărcare paralelă, deplasare la stânga şi la
dreapta pentru rezultate parţiale şi rest. Iniţial, registrul cu încărcare
paralelă va conţine împărţitorul (care va rămâne neschimbat pe tot
parcursul algoritmului), registrul care va conţine în final restul trebuie
iniţializat cu valoarea 0 în timp ce registrul care va conţine în final câtul
va fi iniţializat cu deîmpărţitul.

Deoarece operaţia de deplasare la stânga se face la registrul rest şi


la registrul cât aceştia vor fi trataţi pe parcursul algoritmului ca fiind
concatenaţi într-un registru denumit registru rest – cât.

În prima etapă este deplasat la stânga registrul rest-cât (registrul


conţine iniţial deîmpărţitul). Este scăzut restul din împărţitor, rezultatul
se depune în rest. Dacă rezultatul este negativ, restul este restaurat
efectuând o adunare între rest şi împărţitor. În acest caz restul şi câtul
sunt deplasate la stânga punând 0 pe ultima poziţie. Dacă rezultatul
scăderii este pozitiv, restul şi câtul sunt deplasate la stânga punând 1 pe
ultima poziţie.

8
Numărul de iteraţii la acest algoritm este egal cu numărul de biţi
care îi are deîmpărţitul. Algoritmul se încheie cu deplasarea la dreapta a
registrului rest. În figura 2 este prezentată organigrama algoritmului 3
de împărţire. Avantajele folosirii acestui algoritm sunt, ca şi la înmulţire,
numărul mic de iteraţii şi numărul mic de resurse hardware folosite. În
acest caz, registrul „cât” joacă rol şi pe post de menţinere temporară a
deîmpărţitului.

Componentele folosite de circuitul de împărţire sunt următoarele:


- circuit diferenţă pe patru biţi;
- registru paralel – paralel pe 4 biţi;
- doi regiştrii serie – paralel cu deplasare stânga dreapta

În figura de mai jos este prezentată organigrama pentru algoritmul


de înmulţire.

9
Figura 8. Organigrama algoritmului de împărţire

10
În figura de mai jos este prezentata schema circuitul de împărţire:

Figura 9. Schema circuitului de împărţire

11
Astfel:
- scăderea se face la fiecare iteraţie. Dacă semnul scăderii este pozitiv
rezultatul este depus în registrul rest. Astfel se elimină un pas care
necesita restaurarea restului. În aceste condiţii, circuitul de adunare-
scădere va fi permanent în modul scădere;
- registrul în care se depune deîmpărţitul şi în care se va găsi în final
câtul trebuie să efectueze o operaţie de încărcare paralelă şi mai multe
operaţii de deplasare la stânga. Se foloseşte un registru serie paralel cu
deplasare stânga dreapta dar intrarea care specifică sensul de deplasare
se va ţine permanent în 1 (VCC) deci sensul de deplasare va fi
permanent la stânga;
- circuitul de scădere este un circuit care generează numere cu semn.
Semnul este dat de bitul 5.

Extragerea radicalului (rădăcina pătrată)


Circuitul de extragere a rădăcinii pătrate în FPGA este descris prin
următorul cod VHDL:
library ieee;
use ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_unsigned.ALL;

entity squart is port(


clock : in std_logic;
data_in : in std_logic_vector(7 downto 0);
data_out : out std_logic_vector(3 downto 0)); end squart;

architecture behaviour of squart is

signal part_done : std_logic := '0';


signal part_count : integer := 3;
signal result : std_logic_vector(4 downto 0) := "00000";
signal partialq : std_logic_vector(5 downto 0) := "000000";

begin
part_done_1: process(clock, data_in, part_done)
begin
if(clock'event and clock='1')then
if(part_done='0')then
if(part_count>=0)then
partialq(1 downto 0) <= data_in((part_count*2)+ 1 downto part_count*2);
part_done <= '1'; else
data_out <= result(3 downto 0);
end if;
part_count <= part_count - 1;
elsif(part_done='1')then
if((result(3 downto 0) & "01") <= partialq)then
result <= result(3 downto 0) & '1';
partialq(5 downto 2) <= partialq(3 downto 0) - (result(1 downto 0)&"01");
else
result <= result(3 downto 0) & '0';
partialq(5 downto 2) <= partialq(3 downto 0);
end if;
part_done <= '0';
end if;
end if;

12
end process;
end behaviour;

CUPRINS

Studiu asupra proiectării aplicaţiei ............. 2

Tema ......................................................... 2

Obiective .................................................... 2

Introducere ................................................ 2

Circuitul de înmulţire secvenţial pe 4 biţi ... 3

Sumatorul complet pe 1 bit ....................... 4

Sumatorul pe 4 biţi .................................... 5

Registrul paralel - paralel ........................... 5

Registrul serie - paralel .............................. 6

Circuitul de împărţire pe 4 biţi ................... 8

Extragerea radicalului ................................ 11

13
14

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