Creeaza.com - informatii profesionale despre


Simplitatea lucrurilor complicate - Referate profesionale unice
Acasa » tehnologie » electronica electricitate
Reguli de modelare in VHDL a sistemelor digitale

Reguli de modelare in VHDL a sistemelor digitale


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:

  • Procese cu specificatii

'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:

  1. 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.

  1. 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.
  1. 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.
  1. 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.
  1. 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.

  1. 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.




Politica de confidentialitate


creeaza logo.com Copyright © 2024 - Toate drepturile rezervate.
Toate documentele au caracter informativ cu scop educational.