Documente Academic
Documente Profesional
Documente Cultură
Modelarea HDL a
circuitelor combinaţionale
1
Circuitul combinaţional
intrari control
circuit combinaţional
întârzierea introdusă de circuit
= timp de proagare
ecuaţia de iesiri_date f intrari_control , intrari_date,t PD
funcţionare:
3
Tehnici de modelare a circuitelor combinaţionale
modelare:
always @(di1 or di0 or sel)
y = sel? di1: di0;
4
Stabilirea conţinutului listei de senzitivităţi în
modelarea circuitelor combinaţionale
module c02ex01 ( module c02ex02 (
input X1,X2, input X1,X2,
output reg Y); output reg Y1,Y2);
module c02ex03 (
input di0, di1, di2, di3,
output reg dout);
module c02ex04 (
input ctl0, ctl1, in1, in2,
output reg out);
end
8
Modelarea comportamentală a multiplexoarelor
mux2
aplicaţii specifice:
1. în blocurile de date (datapath block), pentru control fluxului de date care este transmis pe canalele de
date; multiplexorul se introduce la intrarea canalului de date
2. în blocurile de date, pentru implementarea blocurilor combinationale de deplasare a datelor
3. ca bloc de generare a funcţiilor logice combinaţionale (pentru sinteza funcţiilor combinaţionale)
4. altele
comportament: la iesirea de date sunt trimise datele de intrare, în funcţie de valoarea semnalului de selecţie:
dacă sel = 0 atunci la iesire sunt furnizate datele de pe intrarea di0, dacă sel = 1 atunci la ieşire sunt
furnizate datele de pe intrarea di1.
observaţie: controlul sursei fluxului de date este controlat de CODUL aplicat pe intrarea de selectie
9
Modelarea comportamentală a multiplexoarelor –
codul Verilog (1995)
module mux2 (sel, di1, di0, y); // multiplexor cu 2 intrari de date pe 1 bit
input sel; // intrare selectie
input di1, di0; // intrari date
output y; // iesire date
endmodule
10
Sinteza logică şi implementarea multiplexorului
Sinteza logică:
y sel di0 sel di1
Implementare FPGA:
dmux2
aplicaţii specifice:
1. în blocurile de date (datapath block), pentru distribuirea fluxului de date pe diverse canale de date;
2. distribuirea secvenţială a unui semnal de control pe diverse trasee (de exemplu distribuirea secvenţială a unui
semnal de activare enable spre diverse blocuri);
3. altele
comportament: semnalul aplicat la intrarea de date este distribuit la iesirea de date care corespunde codului
aplicat pe instrarea de selecţie: dacă sel = 0 atunci data de intrare este furnizată la iesirea y0, dacă sel = 1
atunci data de intrare este furnizată la ieşirea y1.
observaţie: distribuirea fluxului de date este controlat de CODUL aplicat pe intrarea de selectie
12
Modelarea comportamentală a demultiplexoarelor – codul Verilog
module dmux2 (sel, di, y1, y0); // demultiplexor cu 2 iesiri de date pe 1 bit
input sel; // intrare selectie
input di; // intrare date
output y1, y0; // iesiri date
endmodule
13
Sinteza logică şi implementarea demultiplexorului
Sinteza logică:
buffere
Implementare FPGA:
14
Generarea accidentală a latchurilor: exemplu - demultiplexoare
module dmux2 (sel, di, y1, y0);
input sel;
input di;
output y1, y0; reg y1, y0;
case (sel)
0: y0 = di; // se precizeaza doar valoarea
1: y1 = di; // pentru iesirile care primesc data de intrare
default :
begin
y0 = 1'bx;
y1 = 1'bx;
end
endcase
endmodule
latchuri
pe ieşiri
15
Circuitul generat după sinteza logică
Implementarea FPGA a demultiplexorului cu latchuri
latchuri pe ieşiri
16
Modelarea comportamentală a codificatoarelor prioritare
di3
di2 y1 cod
intrare
date di1 binar
y0
di0
cod4to2
aplicaţii specifice:
1. generator de cod binar în blocuri de testare;
2. generator de cod binar în blocuri de accesare a unor segmente de memorie
3. conversia datelor în cod binar
4. altele
comportament: circuitul generează la ieşire codul binar corespunzător intrării active;
dacă di3 = 1 atunci ieşirea y1y0 = 11,
dacă di2 = 1 atunci ieşirea y1y0 = 10,
dacă di1 = 1 atunci ieşirea y1y0 = 01,
dacă di0 = 1 atunci ieşirea y1y0 = 00;
observaţie: circuitul trebuie să includă logică prioritară în monitorizarea intrărilor; în caz
contrar, la activarea simultană a 2 sau mai multe intrări, codul generat la ieşire este ambiguu
17
Modelarea comportamentală a codificatorului prioritar – 2 variante echivalente
module cod4to2(di3, di2, di1, di0, y1, y0);// VARIANTA 1: pe baza specificatiei conditionale if
input di3, di2, di1, di0; // intrari date: di3 intrarea cea mai prioritara
output reg y1, y0; // iesiri date = codul binar al intrarii active
endmodule
module cod4to2(di3, di2, di1, di0, y1, y0); // VARIANTA 2: pe baza specificatie de selectie
// casex
input di3, di2, di1, di0;
output reg y1, y0;
always @ (di3 or di2 or di1 or di0)
casex ({di3, di2, di1, di0}) // expresia care controleaza selectia se obtine
// prin concatenarea intrarilor
4'b 1xxx : {y1,y0} = 2'd3; // alternativa 1 – prima evaluata => prioritate
// maxima: di3 activ, restul nu conteaza
4'b 01xx : {y1,y0} = 2'd2; // alternativa 2: di3 inactiv SI di2 activ, restul nu
// conteaza
4'b 001x : {y1,y0} = 2'd1; // alternativa 3: di3 SI di2 inactive SI di1 activ,
// restul nu conteaza
4'b 0001 : {y1,y0} = 2'd0; // alternativa 4 – ultima evaluata => prioritate
// minima: di3 SI di2 SI di1 inactive, di0 activ
default : {y1,y0} = 2'bx; // precizeaza valoarea iesirilor pentru alte cazuri
endcase
18
endmodule
Sinteza logică a codificatorului prioritar – varianta 1
detaliu
buffere
detaliu
19
Sinteza logică a
codificatorului prioritar – detaliu
varianta 2
buffere
Circuitul electronic
obţinut după etapa
de sinteză logică
Obs: deşi cele 2 circuite obţinute după etapa de sinteză logică sunt diferite, deoarece sunt21de
complexitate apropiată, pentru implementarea FPGA soluţia este comună
Generarea accidentală a latchurilor: exemplu – codificator prioritar
module Cod4_2(di3, di2, di1, di0, y1, y0);
input di3, di2, di1, di0;
output reg y1, y0;
latchuri pe ieşiri
Circuitul electronic
obţinut după etapa 22
de sinteză logică
Modelarea comportamentală a decodificatoarelor
y3
di1 y2 iesire
cod
binar di0
y1 date
y0
dcd2to4
aplicaţii specifice:
1. bloc de decodificare a codului aplicat aplicat la intrare;
2. generator de semnale de control (semnale de activare pentru diferite circuite) în funcţie de
codul aplicat la intrare
3. altele
comportament: circuitul activează numai ieşirea care corespunde codului binar aplicat pe intrări;
dacă d1d0 = 11 atunci numai ieşirea y3 este activă, celelalte ieşiri sunt inactive,
dacă d1d0 = 10, atunci numai ieşirea y2 este activă, celelalte ieşiri sunt inactive,
dacă d1d0 = 01, atunci numai ieşirea y1 este activă, celelalte ieşiri sunt inactive,
dacă d1d0 = 00, atunci numai ieşirea y0 este activă, celelalte ieşiri sunt inactive;
23
Modelarea comportamentală a decodificatorului
module dcd2to4(di1, di0, y3, y2, y1, y0); // VARIANTA 1: decodificator binar pe 2 biti
input di1, di0; // intrari date = cod binar
output reg y3, y2, y1, y0; // iesiri date
always @ (di)
case (di)
0 : y = 4‘b0001;
1 : y = 4’b0010;
2 : y = 4‘b0100;
3 : y = 4‘b1000;
default : y = 4'b0;
endcase
endmodule
24
Circuitul electronic obţinut după
etapa de sinteză logică depinde
de DIRECTIVELE DE SINTEZĂ
25
Sinteza logică a
decodificatorului
Circuitul obţinut după etapa de sinteză
logică depinde de directivele de sinteză;
directivele de sinteză reprezintă comenzi
date de catre utilizator, care ghidează
modul de obţinere a circuitului electronic
în etapa de sinteză:
Varianta 1: decodificatorul este sintetizat
pe baza porţilor logice
27
Generarea accidentală a latchurilor: exemplu – decodificatorul
module dcd2to4(di1, di0, y3, y2, y1, y0);
input di1, di0;
output reg y3, y2, y1, y0;
always @ (di1 or di0)
case ({di1, di0})
0 : y0 = 1’b1; // greseala consta in faptul ca se
1 : y1 = 1’b1; // precizeaza valoarea numai pentru
2 : y2 = 1’b1; // iesirile active (nu si pentru celelalte iesiri)
3 : y3 = 1’b1;
default : {y3,y2,y1,y0} = 4'bx;
endcase
endmodule
latchuri pe ieşiri
Circuitul electronic
obţinut după etapa
de sinteză logică 28
Introducerea semnalelor de activare
Semnalul de activare (enable) controlează semnal de control = controlează
activarea decodificatorului
funcţionarea circuitului combinaţional;
Semnal de control are prioritate maximă: => codul
descrie o logică prioritară; se utilizează specificaţia
condiţională if; en
buffer
Implementarea în FPGA
31
Componente parametrizabile – declararea parametrilor in
Verilog 1995
N M
intrare di y iesire
Circuit
33
Exemplu de demultiplexor parametrizabil
endmodule
34
Exemplu de demultiplexor parametrizabil – declararea
parametrilor in Verilog 2001
// demultiplexor cu 4 iesiri de date pe 8 biti
module Dmux4 #
(
parameter outNumber = 2, // seteaza numarul de iesiri; nr.iesiri=2**outNumber
parameter dataSize = 8 // dimensiunea datelor
)
(
input [outNumber-1:0] sel, // intrare selectie
input [dataSize-1:0] di, // intrare date
output reg [dataSize-1:0] y0, y1, y2, y3 // iesiri date
);
always @(sel or di)
case (sel)
0: begin y0 = di; y1 = 'b0; y2 = 'b0; y3 = 'b0; end
1: begin y0 = ’b0; y1 = di; y2 = 'b0; y3 = 'b0; end
2: begin y0 = 'b0; y1 = 'b0; y2 = di; y3 = 'b0; end
3: begin y0 = 'b0; y1 = 'b0; y2 = 'b0; y3 = di; end
default : begin y0 = 'b0; y1 = 'b0; y2 = 'b0; y3 = 'b0; end
endcase
endmodule
35
Modelarea întârzierilor specifice circuitelor
combinaţionale (modelarea timpului de propagare tPD)
`timescale 1ns/1ns
module c02ex06 (
input [1:0] in1, in2,
output reg [2:0] outA, outB, outC, outD,
output [2:0] outE); Blocheaza executia buclei pina la
executia instructiunii de atribuire
always @*
#10 outA = in1 + in2;
always @* Lasa libera executia buclei chiar
outB = #10 in1 + in2; daca executia instructiunii de
always @* atribuire nu s-a executat
#10 outC <= in1 + in2;
always @*
outD <= #10 in1 + in2;
assign #10 outE = in1 + in2; modelarea corecta a intârzierii tPD
endmodule
36
Modelarea testbench-urilor
Generator stimuli
stimuli
Bloc asertii
mesaje
depanare si
informatii
37
Exemplu de modelare testbench
// exemplu de testare a functionarii unui multiplexor
`timescale 1ns/10ps
module testMux2;
// declaratiile stimulilor
reg selS, di1S, di0S;
// declaratiile raspunsurilor DUT / REF
wire doutDUT, doutREF;
end
endtask
endmodule
39
Modelarea VHDL a
circuitelor combinaţionale
40
Specificaţii selecţie vs.
condiţionale
CASE semnal_selectie IS IF conditie_1 THEN instrucţiuni_1;
WHEN valoare_1 instrucţiuni_1; ELSIF conditie_2 THEN instrucţiuni_2;
WHEN valoare_2 instrucţiuni_2; ...
....... ELSE instrucţiuni_n;
WHEN valoare_n instrucţiuni_n; END IF;
END CASE;
se introduc numai în interiorul proceselor
41
Specificaţii condiţionale
se recomandă utilizarea acestora NUMAI
pentru descrierea sistemelor digitale a căror
comportament depinde de o logică prioritară.
42
Specificaţii de selecţie
se utilizează pentru descrierea sistemelor digitale la
care semnalele de intrare au valori mutual exclusive.
43
Exemplu specificaţii selecţie vs. condiţionale
44
Inferarea (generarea)
latch-urilor
pentru toate combinaţiile posibile de valori/
combinaţiile logice ale semnalelor de intrare,
tuturor semnalelor de ieşire ale sistemului
combinaţional trebuie să li se asigure o cale
logică, prin care acestora să li se atribuie o
valoare.
45
• În cazul sistemelor combinaţionale, toate
semnalele de intrare ale acestora trebuie
introduse în lista de senzitivităţi a
procesului care descrie comportamentul
sistemului respectiv.
• În lista de senzitivităţi a procesului nu se
introduc semnale de ieşire
46
Exemplu de generare a
latch-urilor
library ieee;
use ieee.std_logic_1164.all;
entity DCD is
port(
X : in std_logic;
Y : out std_logic_vector(1 downto 0));
end;
architecture GRESIT of DCD is
begin
comb:process(X)
begin
Y <= “00”’; // Y trebuie initializat!
case X is
when ‘0’ => Y(0) <= ’1’;
when ‘1’ => Y(1) <= ’1’;
when others => Y <= (others=>'0');
end case;
end process;
end GRESIT;
47
48
Exemplu de generare a latch-
urilor
library ieee;
use ieee.std_logic_1164.all;
entity DPAR is
port(
EN : in std_logic;
X : in std_logic_vector(1 downto 0);
Y : out std_logic);
end;
architecture GRESIT of DPAR is
begin
comb:process(X, EN)
begin
if EN=‘0’ then // care este comportamtnul daca EN diferit de 0?
if (X=“00”) or (X=“11”) then y<=‘0’;
elsif (X=“01”) or (X=“10”) then y<=‘1’;
end if;
end if;
end process;
end GRESIT;
51
Descrierea comportamentală a
codificatoarelor prioritare
entity COD is port ( entity COD is port (
di_cod : in std_logic_vector (7 downto 0); di_cod : in std_logic_vector (7 downto 0);
do_cod : out std_logic_vector (2 downto 0)); do_cod : out std_logic_vector (2 downto 0));
end COD; end COD;
architecture beh of COD is architecture beh of COD is begin
do_cod <=
begin
"000" when di_cod(0)='1‘ else
process(di_cod) begin "001" when di_cod(1)='1‘ else
do_cod < ="000"; "010" when di_cod(2)='1‘ else
if di_cod(0)='1'then do_cod <= "000"; "011" when di_cod(3)='1‘ else
elsif di_cod(1)='1'then do_cod <= "001"; “100" when di_cod(4)='1‘ else
elsif di_cod(2)='1'then do_cod <= "010"; “101" when di_cod(5)='1‘ else
elsif di_cod(3)='1'then do_cod <= "011"; “110" when di_cod(6)='1‘ else
elsif di_cod(4)='1'then do_cod <= "100"; “111" when di_cod(7)='1‘ else
elsif di_cod(5)='1'then do_cod <= "101"; "000";
elsif di_cod(6)='1'then do_cod <= "110"; end beh;
elsif di_cod(7)='1'then do_cod <= "111";
end if;
end process;
end beh;
52
Descrierea comportamentală a
decodificatoarelor
entity DEC is port(
di_dcd : in std_logic_vector(1 downto 0);
en_dcd : in std_logic;
do_dcd : out std_logic_vector(3 downto 0));
end DEC;
architecture beh of DEC is begin
comb:process(di_dcd,en_dcd) begin
if en_dcd ='1' then
do_dcd <= "0000"; -- initializare!
case di_dcd is
when "00" => do_dcd(0) <= '1';
when "01" => do_dcd(1) <= '1';
when "10" => do_dcd(2) <= '1';
when "11" => do_dcd(3) <= '1';
when others => do_dcd <= (others=>’0’);
end case;
else
do_dcd <= "0000";
end if;
end process;
end beh;
53
Descrierea comportamentală a
bufferelor TS
entity MUX is
port (
di_mux : in std_logic_vector(1 downto 0);
sel_mux : in std_logic;
oe_mux : in std_logic;
do_mux : out std_logic);
end MUX;
architecture beh of MUX is
signal tmp_mux: std_logic;
begin
comb:process (di_mux, sel_mux) begin
case sel_mux is
when ‘0’=> tmp_mux <= di_mux(0);
when ‘1’=> tmp_mux <= di_mux(1);
when others=> tmp_mux <= ‘-’;
end case;
end process;
-- varianta 1
do_mux <= tmp_mux WHEN (oe_mux=’1’) ELSE ‘Z’;
-- varianta 2
iesire: process (oe_mux,tmp_mux) begin
if (oe_mux=’1’) then do_mux <= tmp_mux;
else do_mux <= ’Z’;
end if;
end process;
end BEH;
54