Documente Academic
Documente Profesional
Documente Cultură
clk
Logic
asincron
intrri
asincrone
Logic
sincron
intrri
sincrone
PRIORITATEA semnalelor :
1. intrri asincrone (acioneaz independent de clk)
2.
IEIRE
clk = '0'
sau
atributul
'event
clk = '1'
clk = '1'
clk = '0'
t
clk'event
clk'event
d
clk
clk
d
library ieee ;
use ieee.std_logic_1164.all ;
Exemplu :
d
clk
library ieee ;
use ieee.std_logic_1164.all ;
CLK
clk
d
q
t
t
d
clk
.
.
.
CLK
clk
d
q
t
t
Exemplu :
t
clk
CLK
clk
Obs. :
library ieee ;
use ieee.std_logic_1164.all ;
entity T is port
( t , clk : in std_logic ;
q : out std_logic ) ;
end T ;
architecture arch_ T of T is
begin
process (clk )
begin
if (clk'event AND clk = '1' )
then
if t = '1' then q <=
NOT(q) ;
else q <=
q;
end if ;
end if ;
- exemplul
are n vedere
implementarea pe un circuit prog
end process
;
Funciile
rising_edge i falling_edge
(front-cresctor)
(front-descresctor)
rising_edge (
)
falling_edge (
nume_semnal
nume_semnal
Valoarea de ieire :
Utilizare :
clk
architecture arch_D of D is
begin
process (clk)
begin
if falling_edge(clk) then
q <= d ;
end if;
end process ;
end arch_D ;
--transmite valoare
wait until (
Efect :
condiie
);
Mod de aciune :
wait until
condiie
da
nu
clk
architecture arch_D of D is
begin
process
begin
wait until ( clk = '1' ) ;
q <= d ;
end process ;
--transmite valoarea d
end arch_D ;
Obs. :
- cu wait until nu e necesar precizarea listei de senzitivii n declaraia de
proces (instruciunea definete implicit senzitivitile) ;
- lista de senzitiviti se poate omite numai cnd wait until e prima instruciune
din proces;
- n exemplul precedent instruciunea wait until (clk = '1') este echivalent cu :
if ( clk'event AND clk='1' ) then...
q0
d1
q1
d2
q2
.
.
.
.
.
.
d7
library ieee ;
use ieee.std_logic_1164.all ;
entity REGISTRU is
port ( clk : in std_logic ;
d : in std_logic_vector(0 to 7) ;
q : out std_logic_vector(0 to 7) ) ;
end REGISTRU ;
architecture arch_ REGISTRU of REGISTRU is
begin
process
begin
q7
clk
Reg.
8D
end process ;
d [0 : 7]
clk
q [0 : 7]
if rising_edge(clk)
then . . .
if ( clk'event AND clk = '1 ) then ...
wait until ( clk = '1' ) ; . . .
if falling_edge(clk) then . . .
if ( clk'event AND clk = '0 ) then ...
wait until ( clk = '0' ) ; . . .
clk
clk
reset
reset
t
Prioriti :
(front +)
1)
clk
2) reset
3) d
library ieee ;
use ieee.std_logic_1164.all ;
entity D is port
( d , clk , reset : in std_logic ;
q : out std_logic ) ;
end D ;
architecture arch_ D of D is
begin
process (clk)
begin
if rising_edge(clk) then
if (reset = '1') then
q <= '0' ;
else
q <= d ;
end if ;
end if ;
end process ;
end arch_ D ;
-- testeaz intrare
-- iniializeaz bistabil
-- transmite valoarea d
-- nchide procesul
preset
d
clk
clk
q
reset
reset
preset
t
q=d=1
preset
q=d=1
reset
q=d=0
q=d=1
q=d=0
preset
reset
1)
2)
3)
4)
clk (front +)
reset
preset
d
library ieee ;
use ieee.std_logic_1164.all ;
entity D is port
( d , clk , reset, preset : in std_logic ;
q : out std_logic ) ;
end D ;
architecture arch_ D of D is
begin
process (clk)
begin
if falling_edge(clk) then
-- testeaz frontul negativ a
if (reset = '1') then q <= '0' ; -- iniializeaz bistabilul
elsif (preset = '1') then q <= '1'; -- iniializeaz bistabil
else
q <= d ;
-- transmite valoarea d
end if ;
end if ;
end process ;
end arch_ D ;
-- nchide procesul
E R
reset
reset
Prioriti :
clk
1) reset
2) clk
3) d
t
q=d=1
q=d=1
reset
q=d=1
q=d=0
reset
library ieee ;
use ieee.std_logic_1164.all ;
entity D_latch is port
( d , clk , reset : in std_logic ;
q : out std_logic ) ;
end D_latch ;
architecture arch_ D_latch of D_latch is
Begin
process (clk , d , reset)
begin
-- testeaz intrar
-- iniializeaz bistabi
-- transmite valoarea d
-- nchide procesul
NUMRTOARE
qn-1
qn-2
clk
..
. q1
q0
iniializare
bistabili
legturi
de reacie
logic
combinaional
memoreaz
aduc starea actual
genereaz
starea actual
la intrare
starea urmtoare
Logic combinaional
Reacie
Registru
(bistabili)
Q2
q2
Q1
q1
Q0
D0
(MS)
q0
D2
(MS)
D1
(MS)
clk
Bloc I/O
Poart 3-stri
Matricea
de
interconect
are
pin ieire
oe
MUX
q2q1q0 :
000
001
010
011
...
111
...
clk
0
t
7
library ieee ;
use ieee.std_logic_1164.all ;
use work.std_arith.all ;
--ieirea n mod bu
operatorului
"adunare la operaii ntre
semnale de tip
std_logic_vector i constante
ntregi.
Rezultatul adunrii are acelai nr. de bii ca cel
mai mare
dintre operanzi (dac suma are mai muli bii,
se suprim
bitul cel mai semnificativ).
Ex. :
dac q = "101" ,
operaia q <= q + 1 are ca rezultat
q = "110"
dac q = "111" ,
operaia q <= q + 1 are ca rezultat
clk
q[3:0]
reset
0000
Proces senzitiv la
clk
reset
q+
q+1
"0000"
clk
reset = 1
nu
0001
reset = 1
nu
.
.
.
1111
Prioriti :
1)
2)
da
clk
reset
da
library ieee ;
use ieee.std_logic_1164.all ;
use work.std_arith.all ;
entity NUM is port
( clk , reset : in std_logic ;
q : buffer std_logic_vector (3 downto 0) ) ;
end NUM ;
--extinderea operato
--ieirea n mod bu
clk
q[7:0]
count_en
count_en = 1
nu
da
Proces senzitiv la
clk
count_en
clk
0..01
q+
count_en = 1
q+
da
nu
.
.
.
1..11
x
Prioriti :
q
1)
2)
count_en = 1
clk
count_en
da
nu
library ieee ;
use ieee.std_logic_1164.all ;
use work.std_arith.all ;
entity NUM is port
( clk , count_en : in std_logic ;
q : buffer std_logic_vector (7 downto 0) ) ;
end NUM ;
architecture arch_NUM of NUM is
begin
NUMARARE : process (clk)
begin
--extinde operato
--ieirea n mod bu
if rising_edge(clk) then
--testeaz frontul cresctor al clk
if count_en = '1' then
q < = q+1 ;
--incrementea
else q <= q ;
--pstreaz valoarea (redundant)
end if ;
end if ;
end process NUMARARE ;
end arch_NUM ;
Proces senzitiv la
clk
clk
ini
Prioriti :
q [ 15 : 0 ]
count_en
clk
1) clk
2) ini
3) count_en
ini
count_en
q+
q+1
"1000000000000000"
library ieee ;
use ieee.std_logic_1164.all ;
use work.std_arith.all ;
entity NUM is port
( clk , count_en : in std_logic ;
q : buffer std_logic_vector (15 downto 0) ) ;
end NUM ;
--extinde opera
--ieirea n mod b
Obs. :
ex.:
others
q <= "000000000"
se poate scrie
q <= (others
q <= 11111111"
se poate scrie
q <= (others
q <= "0100000000"
se poate scrie
Exemplu :
numrtor de 8 bii cu intrare de ncrcare sincron i validarea numr
clk
count_en
load
q[7:0]
data [ 7 : 0 ]
Proces senzitiv la
Prioriti :
clk
1) clk
2) load
3) count_en
clk
load
count_en
q+
q+1
data
library ieee ;
use ieee.std_logic_1164.all ;
use work.std_arith.all ;
--extinde operatorul +
end NUM ;
architecture arch_NUM of NUM is
begin
NUMARARE : process (clk)
clk
begin
if (clk'event and clk = '1') then
clk
end if ;
--ncarc valoarea
Numrtoare reversibile
Ex. : numrtor reversibil de 4 bii
q3q2q1q0 :
q +1
q1
Proces senzitiv la
Prioriti :
clk
1)
2)
clk
up_down
0010
up_down = 1
0001
.
.
.
1110
1111
up_down = 1
q+
0000
up_down = 1
up_down
up_down = 0
clk
up_down = 0
up_down
up_down = 0
up_down = 0
q[3:0]
up_down = 1
clk
library ieee ;
use ieee.std_logic_1164.all ;
use work.std_arith.all ;
entity NUM is port
( clk , reset : in std_logic ;
q : buffer std_logic_vector (3 downto 0) ) ;
end NUM ;
--extinderea operato
process (clk)
--ieirea este senzitiv numai la clk
begin
if rising_edge(clk) then
--testeaz frontul cresctor al clk
if up_down = '1' then
q<=q+1;
--numr prog
else q <= q - 1 ;
--mumr regresiv
end if ;
end if ;
end process ;
end arch_NUM ;
q [ 15 : 0 ]
clk
reset
preset
Proces senzitiv la
Prioriti :
1) reset
2) preset
3) clk
clk
q+
q+1
"000..00"
"111..11"
library ieee ;
use ieee.std_logic_1164.all ;
use work.std_arith.all ;
--extinde operatorului +
end NUM ;
architecture arch_NUM of NUM is
begin
NUMARARE : process (reset, preset,clk)
la
-preset i clk reset,
begin
if reset = '1' then
q <= ( others => '0' ) ;
--testeaz reset
--iniializeaz cu "000
00"
--testeaz preset
--iniializeaz cu "111
11"
q <= q + 1 ;
Exemplu recapitulativ
Numrtor de 16 bii cu :
clk
count_en
load
q [ 15 : 0 ]
data [ 15 : 0 ]
reset
preset
reset preset
Proces senzitiv la clk, reset, preset
0
0
Prioriti :
1) reset
2) preset
3) clk
1
4) load
0
5) count_en
x
1
clk
load
0
x
x
count_en
q+
q+1
data
x
x
x
x
"00..0"
"11..1"
if
reset = '1'
elsif
then
nu
preset = '1'
elsif
da
q <= "00..0"
da
then
nu
q <= "11..1"
da
clk
then
if
nu
load = '1'
elsif
then
nu
count_en = '1'
q <= q
da
nu
q <= data
da
then
q <= q + 1
library ieee ;
use ieee.std_logic_1164.all ;
use work.std_arith.all;
entity NUMARATOR is
port ( clk : in std_logic_vector(3 downto 0);
oe : in std_logic ;
q : buffer std_logic_vector(3 downto 0)) ;
end NUMARATOR ;
architecture arch_NUMARATOR of NUMARATOR is
begin
process (clk, reset, preset)
begin
if
reset=1 then q <= (others => 0 );
elsif preset=1 then q <= (others => 1 );
elsif rising_edge(clk) then
if
load=1 then q <= data ;
elsif count_en=1 then q <= q+1;
end if ;
end if ;
end process;
end arch_NUMARATOR;
oe
clk
q[3:0]
y[3:0]
oe
0
1
library ieee ;
use ieee.std_logic_1164.all ;
use work.std_arith.all;
entity NUMARATOR is
port ( clk : in std_logic_vector(3 downto 0);
oe : in std_logic ;
y : out std_logic_vector(3 downto 0)) ;
end NUMARATOR ;
architecture arch_NUMARATOR of NUMARATOR is
signal q : std_logic_vector(3 downto 0);
--semnal imtern
begin
process (clk)
descrierea numrtorului
begin
if rising_edge(clk) then
q <= q+1;
end if ;
end process;
y <= ZZZZ when oe = 0 else
q;
end arch_NUMARATOR;
TS : process(q, oe)
begin
if oe=1 then y <= q ;
else y <= ZZZZ ;
end if ;
end process TS ;
Exemplu :
q3
y3
q2
clk
y2
q1
count_en
Descrierea numrtorului :
reset
clk count_en
q+
1
x
x
"0000"
0
0
q
1
q+1
y1
q0
y0
Descrierea ieirii TS :
reset
oe
q [3:0]
y [3:0]
oe
0
1
y
ZZZZ
q
ieirea ntrerupt
ieirea validat
y este senzitiv la q i oe
library ieee ;
use ieee.std_logic_1164.all ;
use work.std_arith.all ;
entity NUM_TS is port
( reset, clk , count_en, oe : in std_logic ;
y : out std_logic_vector (3 downto 0) ) ;
end NUM_TS ;
architecture arch_NUM_TS of NUM_TS is
signal q : std_logic vector (3 downto 0);
begin
NUMARARE : process (reset, clk)
begin
if reset = 1 then q <= "0000" ;
elsif (clk'event and clk = '1' ) then
if count_en = '1' then q <= q + 1 ;
end if ;
end if ;
end process NUMARARE ;
IESIRE_TS : process (q, oe)
begin
if oe = '0' then y <= "ZZZZ" ; else y <= q ; end if ;
end process IESIRE_TS ;
end arch_NUM_TS ;
Semnal bidirecional
n cazul ieirilor TS, pinii de ieire pot fi folosii i ca intrri.
Semnalele respective vor fi declarate cu modul
inout .
d3
d2
d1
d0
data
load
clk
oe
y3
q3
y2
q2
y1
q1
y0
q0
pini i/o
pinii q
folosii ca ieire
din numrtor
d3
d2
d1
d0
data
load
clk
oe
y3
q3
y2
q2
y1
q1
y0
q0
pinii q
folosii ca intrare
de iniializare
Exemplu recapitulativ
Numrtor de 8 bii cu :
oe
clk
clk
count_en
load
q [7:0]
i_o [ 7 : 0 ]
data [ 7 : 0 ]
count_en
load
q+1
i_o
Descrierea ieirii TS :
oe
0
1
q+
i_o
"ZZ ..Z"
q
clk
count_en
load
if
clk
Proces
NUMRARE
nu
da then
if
count_en = '1'
elsif
da
nu
load = '1'
nu
q <= q + 1
da then
q <= i_o
Proces
ieire TS
if
oe = '1'
da
else nu
i_o <= "ZZ...Z"
then
then
i_o <= q
library ieee ;
use ieee.std_logic_1164.all ;
use work.std_arith.all ;
entity NUM is port
( clk, count_en , load, oe : in std_logic ;
i_o : inout std_logic_vector (7 downto
0) ) ;
end NUM ;
architecture arch_NUM of NUM is
signal q : std_logic_vector(7 downto 0) ;
begin
NUMARARE : process (clk)
begin
if (clk'event and clk = '1' ) then
if count_en = '1' then
q <= q + 1 ;
elsif load = '1' then q <= i_o ; end if ;
end if ;
end process NUMARARE ;
TS : process (q, oe)
begin
if oe = '1' then
i_0 <= q ;
else
i_o <= "ZZZZZZZZ" ;