Reguli de modelare in VHDL a sistemelor digitale
Scopul final al modelarii unui sistem digital intr-un limbaj
de descriere hardware nu este simularea acestuia. Simularea este doar o etapa
intermediara care confera proiectantului garantia ca sistemul modelat este
conform specificatiilor comportamentale cerute. Un model VHDL comportamental
trebuie sa fie convertit la o structura hardware. Aceasta conversie
este facuta automat de programe de sinteza hardware. Regulile prezentate
in acest capitol descriu modul in care trebuie folosite constructiile VHDL
pentru a fi convertite in structuri hardware de catre produsele software de sintetiza
si optimizare.
- Sintetizatorul
VHDL asociaza codului VHDL o structura hardware formata din componente
dintr-o biblioteca specificata (tehnologie).
- Optimizatorul
preia structura sintetizata si genereaza descrierea unui circuit optimizat
pe baza criteriilor de suprafata si layout.
Structura obtinuta dupa sinteza automata este determinata
direct de catre modul in care au fost utilizate constructiile VHDL in codul
sursa. Scopul acestui capitol este de a prezenta modul in care trebuie descris
comportamentul unui sistem digital pentru ca dupa sinteza sa se obtina
rezultatele asteptate.
1 Modelarea circuitelor logice
combinationale
Un circuit digital este considerat combinational (CLC) daca,
la orice moment, valoarea logica a iesirilor este determinata direct numai de
valorile logice ale intrarilor. Sintetizatorul VHDL trateaza sistemele logice
ale caror iesiri sunt modificate in momentele determinate de un front sau un
palier al unui semnal ca fiind sisteme secventiale.
Recomandari generale
Modelul unui CLC se poate realiza cu urmatoarele constructii
VHDL:
- Atribuiri
concurente de semnal, inclusiv atribuiri conditionale si prin selectie;
- Structuri cu
instantieri de componente de tip CLC;
- Procese fara
comutari determinate de fronturi de semnal;
- Proceduri fara
comutari determinate de fronturi de semnal;
- Functii.
Sintetizatorul ignora intarzierile precizate in specificatiile
de atribuiri de semnale (clauze 'after') sau in specificatii 'wait
for'.
Procesele care modeleaza circuite combinationale au
urmatoarele particularitati:
- Daca procesele
au lista de senzitivitati, atunci aceasta lista contine toate semnalele de
intrare (care apar in dreapta simbolului de atribuire de semnal). Daca
procesele nu au lista de senzitivitati, atunci trebuie sa aiba o singura
clauza 'wait on'in care sa se specifice toate semnalele de intrare.
- Toate semnalele
din dreapta simbolurilor de atribuiri de semnale trebuie sa apara in lista
de senzitivitati a procesului sau in specificatia 'wait on'.
- Semnalelor din
partea stanga a simbolurilor de atribuiri de semnale trebuie sa li se
atribuire valori pentru toate conditiile.
- Semnalele din
lista de senzitivitati sau din specificatia 'wait on'nu pot apare
in partea stanga a simbolurilor de atribuiri de semnale.
- Procesele
contin oricate atribuiri de semnale care descriu operatiile realizate de
circuit la aparitia unei tranzactii asociate oricarei intrari.
- Sunt permise urmatoarele
constructii:
- Atribuiri de
semnale
- Atribuiri de
variabile
- Specificatii
conditionale ('if') sau de selectie ('case')
- Proceduri fara
control temporal
Modelarea portilor logice
Sintetizatorul genereaza ecuatiile logice Booleene pentru
portiunile de cod VHDL in care apar instantieri de porti logice sau operatori
logici. Optimizatorul minimizeaza functiile logice si asociaza ecuatiilor
rezultate porti din biblioteca tehnologiei.
Daca modelul VHDL este identic cu modelul unei componente
aflate in biblioteca, atunci se va asocia acea componenta. De exemplu, codul
care urmeaza este sintetizat sub forma unui multiplexor aflat in biblioteca de
tehnologie:
process (a, b, sel) begin if (sel = '0') then
cout <= a ;
elsif (sel = '1') then
cout <= b ;
else
cout <= 'X' ;
end if ;
end process ;
In general, sintetizatorul nu poate asocia unei portiuni de
cod VHDL o componenta de nivel inalt din biblioteca. Astfel, pentru codul care
urmeaza se va asocia o structura de porti logice, desi codul descrie un
semisumator de un bit aflat in biblioteca. Fortarea sintezei cu componente de
nivel mai inalt se poate face prin optiuni de sinteza (impunerea unor
componente preferentiale pentru sinteza).
Cout <= a xor b xor cin ; S <= (a and b) or (a and cin) or (b and cin) ;
Modelarea multiplexoarelor cu specificatii
'case' sau 'if'
Procesele care contin specificatii 'case' sau 'if'
sunt sintetizate sub forma unor multiplexoare cu conditia ca respectivele
specificatii sa fie complete, adica:
- sa atribuie
valori tuturor iesirilor, in toate conditiile;
process (a, b, sel) begin if (sel = '0') then
cout <= a ;
elsif (sel = '1') then
cout <= b ;
end if ; -- EROARE !!
end process ;
- sa nu
contina atribuiri de semnale care au in partea dreapta semnale ale caror
valori provin de la:
- activare
anterioara a procesului (sint si iesiri):
process (a, b, sel) begin if (sel = '0') then
cout <= cout ; -- EROARE !!
elsif (sel = '1') then
cout <= b ;
end if ;
end process ;
- semnale din afara procesului dar care nu apar in lista de
senzitivitati:
process (a, sel) begin if (sel = '0') then
cout <= a ;
elsif (sel = '1') then
cout <= b ; -- EROARE !!
end if ; end process ;
in cazul folosirii tipurilor de date std_logic se
recomanda asigurarea completitudinii specificatiilor 'case' si 'if'
prin folosirea clauzei 'others'.
process (sel, in1, in2, in3, in4) begin case sel is
when '00' =>
cout <= in1 ;
when '01' =>
cout <= in2 ;
when '10' =>
cout <= in3 ;
when others =>
cout <= in4 ;
end case ;
end process ;
in cazul in care specificatia 'case' nu precizeaza
valoarea iesirii pentru toate cazurile, se considera ca iesirea nu se modifica
si, in consecinta, va aparea pe iesire un nedorit latch. Codul care
urmeaza va produce prin sinteza un latch pe iesirea cout datorita
faptului ca semnalul sel de tip std_logic poate lua si alte
valori nu numai cele precizate ca si conditii ('XX', 'HL',
).
process (sel, in1, in2, in3, in4) begin case sel is
when '00' =>
cout <= in1 ;
when '01' =>
cout <= in2 ;
when '10' =>
cout <= in3 ;
when '11' =>
cout <= in4 ;
end case ;
end process ;
Modelarea
circuitelor aritmetice
Operatorii aritmetici (suma, diferenta, comparare) sunt
asociati prin sinteza cu celule complexe existente in biblioteca de tehnologie.
De exemplu, pentru codul care urmeaza sintetizatorul va genera un sumator de 6
biti implementat cu doua sumatoare de cite 4 biti. Daca in tehnologia selectata
nu exista celule sumatoare, sintetizatorul va genera ecuatiile booleene iar
optimizatorul va genera structura de porti asociata.
library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity sixbitadder is port (a, b: in std_logic_vector(5 downto 0);
outp: out std_logic_vector(5 downto 0));
end sixbitadder ; architecture arch_sixbitadder of sixbitadder is begin outp <= a + b ;
end arch_sixbitadder ;
O anumita resursa poate fi folosita in comun daca operatorul
implementat nu se executa in aceleasi conditii. De exemplu, codul care urmeaza
se poate sintetiza in doua moduri:
architecture arch of ent is begin outp <= a + b when sel = '0' else
a + c ; end arch ;
O varianta, prezentata in figura 1, consta din folosirea a
doua sumatoare, cite unul pentru fiecare aparitie a operatorului '+'. Iesirile
sumatoarelor intra intr-un multiplexor selectat cu semnalul sel.
A doua varianta, prezentata in figura 2, se bazeaza pe
observatia ca cele doua sumatoare nu sunt folosite in acelasi timp. Se poate
concepe o structura cu un singur sumator. O intrare este semnalul a iar
celalata provine din multiplexarea semnalelor b si c cu semnalul
de selectie sel.
Figura 1 Arhitectura
sintetizata cu doua sumatoare.
Aceasta varianta poate fi descrisa intr-un proces astfel:
process (sel, a, b, c) variable in_add : std_logic_vector(5 downto 0);
begin if sel = '0' then
in_add <= b ;
else
in_add <= c ;
end if ;
outp <= a + in_add ;
end process ;
Figura 2 Arhitectura
sintetizata cu un sumator.
Modelarea
unor circuite logice combinationale complexe
Un sumator de patru biti poate fi modelat cu o
specificatie 'for' astfel:
process (a, b, ci) variable c_temp: std_logic ;
begin c_temp := ci;
for i in 0 to 3 loop
s(i) <= a(i) xor b(i) xor c_temp ;
c_temp := (a(i) and b(i)) or
(a(i) and c_temp) or
(b(i) and c_temp) ;
end loop ;
cout <= c_temp ;
end process ;
Un barrel shifter poate fi modelat cu functii
combinationale. Pentru a nu apare latch-uri dupa sinteza, este necesar ca toate
specificatiile 'if' si 'case' sa fie complete.
library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; package extra_types is subtype eight_vector is std_logic_vector (7 downto 0);
end extra_type; library IEEE; use IEEE.std_logic_1164.all; use work.extra_types.all; entity barrel_shift is port (
data: in eight_vector;
mode,direction : in std_logic;
result: out eight_vector;
);
end barrel_shift; architecture behavior of barrel_shift is function shift (data:eight_vector; direction: std_logic) return std_logic_vector is variable temp: eight_vctor; begin if (direction ='1') then
temp:= sh_left(data,1);
else
temp:= sh_right(data,1);
end if;
return (temp);
end shift; function rotate (data: eight_vector; direction: std_logic) return std_logic_vector is variable temp: eigth_vector; begin if (direction ='1') then
temp:= data (6 downto 0) & data(7);
else temp:= data (0) & data(7 downto 1);
end if;
return (temp);
end rotate; begin process (data,mode,direction) begin if (mode='1') then
result <=shift (data,direction);
else
result <=rotate (data,direction);
end process; end behavior;
2
Modelarea circuitelor logice secventiale
Un circuit digital este considerat secvential (CLS) daca
valoarea logica a iesirilor este determinata atit de valorile logice ale
intrarilor cit si de starea in care se afla circuitul.
Starea circuitului este determinata de valorile memorate in
registre. Sintetizatorul VHDL recunoaste doua tipuri de descrieri secventiale: explicite
si implicite.
- Automatele
descrise implicit nu contin declaratia explicita a unui registru de
stare ci conditiile in care se trece dintr-o stare in alta.
- Automatele
descrise explicit utilizeaza un registru de stare pentru memorarea
starii prezente. Secventa de control a automatului presupune atribuiri
explicite de valori pentru acest registru.
Recomandari
generale
Modelul unui CLS se poate realiza cu urmatoarele constructii
VHDL:
'wait'
- Instantieri de
componente asociate blocurilor constitutive (CLC si registre).
Modelarea
sistemelor sincrone
Sistemele secventiale se recomanda a fi proiectate ca sisteme
sincrone.
Sintetizarea sistemelor sincrone presupune ca toate operatiile
logice sunt determinate de aparitia unui front activ al unui semnal de ceas.
Codul urmator prezinta modul in care un proces asincron poate fi convertit la
un proces sincron.
-- process asincron process (enable, d) begin if enable = '1' then
q <= d ;
end if ;
end process ; -- process sincron process begin wait until clock'event and clock = '1' ;
if enable = '1' then
q <= d ;
end if ;
end process ;
Lista de senzitivitati a fost inlocuita cu o specificatie 'wait'
care modeleaza aparitia unui front de ceas.
Modelarea
semnalului de ceas
Pentru a modela un semnal de ceas sintetizabil trebuie urmate
citeva recomandari:
- Semnalul de
ceas se poate desemna prin optiunile de sinteza dar este recomandabil sa
se specifice prin comportamentul semnalului.
- Se va utiliza
un singur semnal de ceas, cu un singur front activ, pentru tot sistemul
digital.
- Toate
specificatiile trebuie sa se execute intru-o singura perioada de ceas.
- Buclele care au
un numar de iteratii dependent de date trebuie sa fie sincronizate cu
semnalul de ceas (o iteratie pe perioada).
Specificatiile prin care sintetizatorul deduce semnalul de
ceas sunt prezentate in tabelul 3:
Front activ pozitiv
|
wait until
clk'event and clk = '1' ;
|
|
wait until
not clk'stable and clk = '1' ;
|
|
wait until
clk'event and clk = '1' and clk'last_value = '0' ;
|
Front activ negativ
|
wait until
clk'event and clk = '0' ;
|
|
wait until
not clk'stable and clk = '0' ;
|
|
wait until
clk'event and clk = '0' and clk'last_value = '1' ;
|
Reset la punerea sub tensiune
|
wait until
clk'event and clk = '0' or reset'event and reset = '1' ;
|
Tabelul 3
Specificatii VHDL pentru modelarea semnalului de ceas al sistemelor secventiale
sincrone.
Modelarea
implicita a automatelor
Modelul implicit al automatelor descrie
numai actiuniile care au loc in cadrul unui ciclu de tact. Nu exista o
declaratie explicita a unui registru de stare. Sintetizatorul implementeaza
registrul de stare pornind de la descrierea secventiala a starilor.
Procesul care descrie un automat in mod implicit trebuie sa
satisfaca urmatoarele constringeri:
- Procesul
contine mai mult de o specificatie
'wait' asociata unui semnal de ceas.
- in momentul
sintezei nu se specifica o variabila a procesului ca fiind reg
istru de stare.
Exemplu
Controler pentru accesul la o memorie RAM, modelat ca un
automat implicit.
library IEEE; use IEEE.std_logic_1164.all; package mem_types is subtype mem_vector is std_logic_vector (3 downto 0);
end mem_type; library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use work.mem_types.all; entity rdwr_ctrl is port (
mem_op, read_not_write, clk, reset: in std_vector;
membus : inout mem_vector;
rd, wr : inout std_logic
);
end rdwr_ctrl; architecture imp_fsm of rdwr_ctrl is signal data : mem_vector; signal membus_int: mem_vector; signal state : std_logic_vector(1 downto 0); signal next_state: std_logic_vector(1 downto 0); begin membus <= membus_int when (wr='1') else 'ZZZZ'; process begin wait until (clk'event and clk='1');
if (reset='0') then
data <= '0000';
membus_int <= '0000';
rd <= '0';
wr <= '0';
else
if (mem_op ='1') then
if (read_not_write ='1') then
rd <= '0';
wr <= '0';
wait until (clk'event and clk='1');
data <= membus;
rd <= '0';
else
wr <= '1';
membus_int <= data;
wait until (clk'event and clk='1');
wr <= '0';
end if;
end if;
end if;
end process; end imp_fsm;
Modelarea implicita se recomanda in cazurile in care automatul
trebuie sa genereze anumite forme de unda. Trecerea de la o stare la alta este
marcata prin aparitia unei modificari in formele de unda generate la iesire.
Modelarea
explicita a automatelor
Modelul explicit al automatelor specifica
un registru de stare caruia ii atribuie explicit valori.
Procesul care descrie un automat in mod explicit trebuie sa
satisfaca urmatoarele constringeri:
- Procesul
contine numai o singura specificatie
'wait until'
- O variabila a
procesului este identificata ca fiind registrul de stare. Uzual, variabila
se declara de tip enumeratie.
Figura 4 Schema bloc
a unui automat modelat explicit.
Modelarea explicita a unui automat se bazeaza pe reprezentarea
clasica prezentata in figura 4.
Modelarea explicita a unui automat include urmatoarele constructii
VHDL:
- Logica ce
determina starea urmatoare:
case state is when INIT => if (mem_op = '1') then
if (read_not_write = '1') then
next_state <= READ ;
else
next_state <= WRITE ;
end if ;
else
next_state <= INIT ;
end if ;
when . when OTHERS => next_state <= INIT ;
ed case ; process begin wait until clk = '0' and clk ' event ;
state <= next_state ;
end ;
- Circuitul
logic combinational al iesirilor (dependent de stare si/sau intrari):
rd <= '1' when (state = READ) else '0' ; wr <= '1' when (state = WRITE) else '0' ; membus <= membus_int when not wr else "0000" ;
- Stabilirea
starii initiale (reset sincron):
wait until (clk = '1' and clk ' event) ; if (reset = '0') then data <= "0000" ;
membus_int <= "0000" ;
state <= INIT ;
end if ;
Exemplu
Controler pentru accesul la o memorie RAM, modelat ca un
automat explicit.
Descriere explicita intr-un singur bloc:
library IEEE; use IEEE.std_logic_1164.all; package mem_types is subtype mem_vector is std_logic_vector (3 downto 0);
end mem_type; library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use work.mem_types.all; entity rdwr_ctrl is port (
mem_op, read_not_write, clk, reset: in std_vector;
membus : inout mem_vector;
rd, wr : inout boolean
);
end rdwr_ctrl; architecture behavior of rdwr_ctrl is signal data : mem_vector; signal membus_int: mem_vector; signal state : std_logic_vector (1 downto 0); constant INT : std_logic_vector (1 downto 0):= '00'; constant READ : std_logic_vector (1 downto 0):= '01'; constant WRITE : std_logic_vector (1 downto 0):= '10'; begin membus <= membus_int when (wr='1') else 'ZZZZ'; process begin wait until (clk'event and clk='1');
if (reset='0') then
data <= '0000';
membus_int <= '0000';
state <= INIT ;
else
case state is
when INIT =>
if (mem_op ='1') then
if (read_not_write='1') then state <= READ; rd <= '1'; else state <= WRITE; membus_init <= data; wr <= '1'; end if; else
state <= INIT; end if;
when READ => state <= INIT;
rd <= '0';
data <= membus;
when WRITE =>
state <= INIT;
wr <= '0';
when others =>
state <= INIT;
end case;
end if;
end process; end behavior;
Descriere in trei blocuri procedurale:
library IEEE; use IEEE.std_logic_1164.all; package mem_types is subtype mem_vector is std_logic_vector (3 downto 0);
end mem_type; library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use work.mem_types.all; entity rdwr_ctrl is port (mem_op, read_not_write, clk, reset: in std_logic;
membus : inout mem_vector;
rd, wr : inout boolean
);
end rdwr_ctrl; architecture exp_fsm of rdwr_ctrl is type statetype is (INIT, READ, WRITE); signal data : mem_vector; signal membus_int: mem_vector; signal state : statetype; signal next_state: statetype; begin rd <= (state= READ); wr <= (state= WRITE); membus <= membus_int when (wr) else 'ZZZZ'; process begin wait until (clk'event and clk='1');
if (reset='0') then
data <= '0000';
membus_int <= '0000';
state <= INIT ;
else
state <= next_state ;
if (state = WRITE) then
membus_int <= data;
end if;
if (state = READ) then data <= membus;
end if;
end if; end process; process(state, mem_op, read_not_write) begin if (state = INIT) then
if (mem_op = '1') then
if (read_not_write = '1') then
next_state <= READ;
else
next_state <= WRITE;
end if;
else
next_state <= INIT;
end if;
else next_state <= INIT;
end if;
end process; end exp_fsm;
Modelarea explicita se recomanda in cazurile in care automatul
este descris prin organigrama sau graf de tranzitii. in acest caz, accentul
este pus pe semnificatia starilor in care se afla automatul.
3
Modelarea semnalului de initializare
Toate sistemele secventiale necesita un semnal de initializare
care sa asigure atingerea unei stari predefinite, inainte de pornirea efectiva
a sistemului. Pentru automatele modelate implicit sau explicit se pot defini
semnale de initializare sincrona, asincrona sau la punerea sub
tensiune. Pentru un registru, se poate defini un semnal de initializare
asincron.
Initializarea
la pornire
Initializarea la pornire (power-on reset - engl.) poate
fi implementata prin precizarea unei valori initiale pentru un semnal sau
variabila. Sintetizatorul va genera o eroare daca se incearca initializarea
unei iesiri combinationale.
entity dff is port (q: out std_:logic := '0'; data: in std_:logic ;
clk: in std_:logic) ;
end dff ;
Reset asincron
Exista doua variante de modelare.
in cazul unui proces cu specificatii 'wait', conditia
de intializare (reset'event
and reset = '1') trebuie inclusa alaturi de cea de ceas.
in cazul uni proces cu lista de senzitivitati, numele
semnalului de intializare trebuie pus alaturi de cel al semnalului de ceas in
lista de senzitivitati.
in ambele cazuri, starea semnalului de reset trebuie testata
prima.
Model de registru cu reset asincron:
library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity dff8_sr is port (d: in std_logic_vector (0 to 7);
clk: in std_logic;
set: in std_logic;
reset: in std_logic;
q: out std_logic_vector (0 to 7));
end dff8_sr; architecture a0 of dff8_sr is begin process begin wait until ((clk'event and clk='1') or
(reset'event and reset='0') or
(set'event and set='0');
if (set='0') then
q <= '11111111';
elsif (reset='0') then
q <= '00000000';
elsif (clk'event and clk='1') then
q <= d;
end if;
end process; end a0 ;
Model de automat cu reset asincron:
library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity parity_check is port (
parity_error: out std_logic_vector;
data_in : in std_logic_vector;
data_ready : in std_logic_vector;
clk, reset : in std_logic
);
end parity_check; architecture exp_fsm of parity_check is begin process (clk, reset) type state_type is (idle, get_data, par_check); variable cur_state : state_type; variable bit_count : std_logic_vector (2 downto 0); variable parity_reg: std_logic; begin if (reset='0') then
cur_state := idle;
parity_error <= '0';
elsif (clk='1' and clk'event) then
case (cur_state) is
when idle =>
if (data_ready ='0') then
cur_state := get_data;
parity_reg := '0';
bit_count := '000';
end if;
when get_data =>
parity_reg := parity_reg xor data_in;
bit_count := bit_count + 1;
if (bit_count ='000') then
cur_state := get_data; end if;
when par_check =>
parity_reg := parity_reg xor data_in;
parity_error <= not parity_reg;
end case;
end if;
end process; end exp_fsm;
Reset sincron
Semnalul de reset sincron trebuie tratat ca o intrare
preferentiala in automat. Aceasta intrare este testata in toate starile.
Activarea intrarii determina trecerea in starea initiala, sincron cu urmatorul
front activ al semnalului de ceas.
Reset sincron pentru automat descris explicit:
library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity jmp_exp is port (address: out std_logic_vector (2 downto 0); read: out std_logic; data: in std_logic_vector (3 downto 0); clk: in std_logic; reset: in std_logic); end jmp_exp; architecture exp_fsm of jmp_exp is begin process constant NOP : std_logic := '0'; constant JMP : std_logic := '1'; variable ir : std_logic_vector (3 downto 0); variable pc : std_logic_vector (2 downto 0); type state_type is (load, jump) ; variable cur_state: state_type; begin wait until (clk'event and clk='1'); if (reset='0') then address <= '000';
read <= '0';
ir := '0000';
pc := '000';
cur_state := load;
else case (cur_state) is
when load =>
address <= pc;
read <= '1';
cur_state := jump;
when jump =>
ir := data;
read <= '0';
cur_state := load;
case (ir(3)) is
when NOP => pc := pc + '1'; when JMP => pc := ir(2 dowto 0); when OTHERS => pc := pc + '1'; end case;
end case;
end if; end process; end exp_fsm;
4 Modelarea sistemelor complexe pentru sintetizabilitate
Modelarea unui sistem complex presupune parcurgerea
urmatoarelor etape de proiectare:
- Deducerea
specificatiilor. in aceasta etapa beneficiarul
trebuie sa descrie proiectantului functionarea sistemului. Beneficiarul va
descrie in limbaj natural ce functionalitati doreste de la sistem. in
acest timp, proiectantul trebuie sa-si imagineze o schema bloc pentru sistem.
Intrarea in detalii de proiectare in aceasta faza nu face decit sa
lungeasca discutiile. Se recomanda ca acesta etapa sa se incheie printr-o
prezentare a facilitatilor sistemului, prezentare facuta de proiectant
beneficiarului. in aceasta faza, se pot recomanda beneficiarului
simplificari sau imbunatatiri ale sistem
ului. in orice caz,
aceasta etapa trebuie tratata cu deosebita atentie, daca se doreste scurtarea
timpului de dezvoltare a produsului final.
- Proiectarea
propriu-zisa. in aceasta etapa proiectantul
realizeaza descrierea efectiva a sistemului. Trebuie luate decizii de
codificare a datelor si de algoritmi de implementare a operatiilor
aritmetice din sistem. Nu este necesar ca aceste detalii sa fie aduse la
cunostinta beneficiarului. Pornind de la specificatiile furnizate in etapa
anterioara, se elaboreaza un m
odul generator de
vectori de test. Etapa se incheie cu o schema bloc detaliata pentru sistem. Se
recomanda proiectarea unui sistem sincron avind un semnal de ceas care se
distribuie tuturor registrelor si un semnal de reset care initializeaza intreg
sistemul. O alta sugestie de proiectare consta in partajarea sistemului in doua
blocuri cu functii diferite: cale de date si cale de control.
Circuitele de temporizare se vor include in calea de date si vor fi
comandate/testate cu semnale din calea de control. Ca subetape se pot sugera:
- schitarea
unei structuri pentru calea de date si punerea in evidenta a semnalelor
de control necesare;
- schitarea
entitatii caii de control prin denumirea semnalelor de iesire (semnale de
control pentru calea de date) si a sem
nalelor de intrare
(semnale de stare de la calea de date);
- verificarea
(prin simulare mentala) ca toate facilitatile sistemului pot fi
implementate pe aceasta structura.
- Descrierea
HDL. Descrierea entitatii de nivel inalt se poate
face imediat dupa primirea specificatiilor. Trebuie luate in considerare
aspectele determinate de parametrizarea sistemului. Se recomanda ca
arhitectura de nivel sa fie una structurala in care sa se instantieze doua
componente asociate caii de date si caii de control. in
acest mod, cele doua blocuri vor fi riguros definite prin specificarea
entitatilor asociate. Aceasta abordare va conduce ulterior la obtinerea
unor avantaje:
- posibilitatea
modelarii in stiluri diferite a caii de date si caii de control;
- posibilitatea
simularii mixte (structural-comportamental) in vederea depanarii.
- Descrierea
HDL a caii de date. in aceasta etapa trebuie
decis modul in care se abordeaza modelarea sistemului. Calea de date este
implementata sub forma unor registre intre care datele se transfera prin
circuite combinationale. Solutia modelarii intregii cai de date cu un
proces se dovedeste a fi foarte greoaie pentru sisteme mai complexe. Se
recomanda scrierea unei arhitecturi cu mai multe procese. Fiecare proces
este asociat unui registru din c
alea de date si
include toate circuitele combinationale de deasupra registrului. Semnalele
interne din partea combinationala se vor modela ca variabile ale procesului. in
acest mod se obtin urmatoarele avantaje:
- modularizarea
arhitecturii sistemelor mari;
- posibilitatea
identificarii prin eticheta procesului a portiunilor sintetizate diferit
fata de asteptari;
- asigurarea
suportului pentru detalierea ierarhica a sistemului.
- Descrierea
HDL a caii de control
. Calea de control
are structura unui automat. in aceasta etapa trebuie decis tipul automatului
Mealy/Moore, cu intirziere/imediat. Se recomanda modelarea unui automat Moore
imediat pentru sisteme in care timpul nu reprezinta o constringere sau Mealy cu
intirziere in cazuri cind este necesar un raspuns mai rapid si un numar mai mic
de stari. in functie de modul de descriere a automatului (forme de unda
generate sau organigrama/graf) se opteaza pentru o modalitate de modelare
implicita sau explicita a automatului.
- Descrierea
HDL a vectorilor de test. in aceasta etapa se
concepe un set complet de vectori de test functionali. Vectorii generati
se recomanda a satisface urmatoarele contringeri:
- sa fie
scalabili in timp; acest lucru va permite evaluarea perioadei minime de
ceas dupa ce se obtine o descriere structurala a sistemului;
- sa fie
paramatrizabili; acest lucru va primite modificarea ulterioara a formelor
de unda generate fara a se opera modificari in cod
ul VHDL;
- elementele
de memorare (memorii ROM sau RAM) sa fie initializate din fisiere
externe, nu direct din cod.