Documente Academic
Documente Profesional
Documente Cultură
IESI – An I
Cercetare
ştiinţifică şi practică
Studiu asupra proiectării de aplicaţii
VHDL pentru operaţii complexe
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.
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.
4
2. Sumatorul pe 4 biţi
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;
6
În figura de mai jos este prezentata schema circuitul de înmultire
folosind aceste trei module.
7
Simularea circuitului de înmulţire:
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.
9
Figura 8. Organigrama algoritmului de împărţire
10
În figura de mai jos este prezentata schema circuitul 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.
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
Tema ......................................................... 2
Obiective .................................................... 2
Introducere ................................................ 2
13
14