Sunteți pe pagina 1din 51

DESCRIEREA STRUCTURILOR SECVENIALE SINCRONE

clk

Logic
asincron

intrri
asincrone

Logic
sincron

intrri
sincrone

PRIORITATEA semnalelor :
1. intrri asincrone (acioneaz independent de clk)
2.

intrri sincrone (acioneaz n sincronism cu clk)

IEIRE

Caracterizarea semnalului de sincronizare ( clk )

clk = '0'

sau

atributul

'event

clk = '1'

- exprim nivelul logic al semnalului clk ;

exprim un eveniment pe semnal


( o schimbare de nivel logic a unui semn

clk = '1'
clk = '0'
t

clk'event

clk'event

Exprimarea fronturilor semnalului clk

clk'event AND clk = '1'

- frontul cresctor ( pozitiv )

clk'event AND clk = '0'

- frontul descresctor ( negat

clk'event AND clk = '1'

clk'event AND clk = '0'

Exemplu : bistabil D - latch (cu zvorre) :

d
clk

clk
d

library ieee ;
use ieee.std_logic_1164.all ;

entity D_latch is port


( d , clk : in std_logic ;
q : out std_logic ) ;
end D_latch ;

architecture arch_ D_latch of D_latch is


q
begin
t
process (clk , d)
-- proces senzitiv fa de clk i
begin
intervale de transparen
if clk = '1' then
-- testeaz valo
q <= d ;
-- transmite valoare
else q <= q ;
-- instruciune redu
end if ;
Procesul este senzitiv att la clk ct i la d.
end process ;
-- nchide procesul
end arch_ D_latch ;

Exemplu :

d
clk

bistabil D cu aciune pe frontul pozitiv (cresctor)

library ieee ;
use ieee.std_logic_1164.all ;

entity D_pozitiv is port


( d , clk : in std_logic ;
q : out std_logic ) ;
end D_pozitiv ;

CLK

clk
d
q

Procesul este senzitiv numai la clk .

t
t

architecture arch_ D_pozitiv of D_pozitiv is


begin
process (clk)
begin
if (clk'event AND clk = '1' ) then
q <= d ;
end if ;
end process ;
end arch_ D_pozitiv ;

Exemplu : bistabil D cu aciune pe frontul negativ (descresctor) :

d
clk

.
.
.

CLK

clk
d
q

Procesul este senzitiv numai la clk .

t
t

architecture arch_ D_negativ of D_negativ is


begin
process (clk)
begin
if (clk'event AND clk = '0' )
q <= d ;
end if ;
end process ;
end arch_ D_negativ ;

Exemplu :

t
clk

bistabil T cu aciune pe frontul pozitiv

CLK

clk

Procesul este senzitiv numai la 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
;

care are predefinit structura de bistabil T ;


- pentru circuitele care nu conin bistabili T predefinii, ac
end arch_peTbaza
; structurilor existente.
sintetizai

Funciile

rising_edge i falling_edge
(front-cresctor)

(front-descresctor)

Sunt definite n biblioteca ieee.std_logic_1164.


Detecteaz fronturile cresctoare i descresctoare
ale semnalelor.

rising_edge (
)

falling_edge (

detecteaz frontul cresctor


al semnalului specificat

nume_semnal

nume_semnal

detecteaz frontul descresctor


al semnalului specificat

Valoarea de ieire :

de tip boolean (true sau false ).

Utilizare :

condiii n instruciuni condiionale

Exemplu : bistbil D cu aciune pe frontul negativ

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 ;

--proces senzitiv numai fa d

--detecteaz frontul descresctor

--transmite valoare

Instruciunea wait until


Sintaxa :

wait until (

Efect :

condiie

);

blocheaz programul pn la realizarea condii

Mod de aciune :
wait until
condiie
da

nu

Exemplu : bistbil D cu aciune pe frontul cresctor

clk

architecture arch_D of D is
begin
process
begin
wait until ( clk = '1' ) ;
q <= d ;
end process ;

--nu e necesar lista de senziti

--sesizeaz frontul cresctor

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

Exemplu : registru de 8 bii realizat cu bistabili D cu aciune pe frontul pozitiv


d0

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

wait until (clk = '1') ;


q <= d ;

Reg.
8D

end process ;
d [0 : 7]

clk

q [0 : 7]

end arch_ REGISTRU ;

Moduri echivalente de detectare a fronturilor semnalelor

Frontul cresctor (pozitiv) :

if rising_edge(clk)
then . . .
if ( clk'event AND clk = '1 ) then ...
wait until ( clk = '1' ) ; . . .

Frontul descresctor (negativ) :

if falling_edge(clk) then . . .
if ( clk'event AND clk = '0 ) then ...
wait until ( clk = '0' ) ; . . .

Intrri de iniializare sincrone


( RESET i PRESET sincron )
- Realizeaz iniializarea cu '1' (PRESET)
sau cu '0' (RESET) a bistabililor,
n sincronism cu semnalul CLK.
- Au aciune prioritar fa de intrrile de date.
Exemplu : bistbil D cu aciune pe frontul cresctor, cu RESET sincron
d

clk

clk

reset

Procesul este senzitiv numai la clk

reset
t

Prioriti :
(front +)

1)

clk

2) reset
3) d

reset : acioneaz sincron cu clk


i prioritar fa de 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

-- proces senzitiv numai fa de clk

if rising_edge(clk) then
if (reset = '1') then
q <= '0' ;
else
q <= d ;
end if ;
end if ;
end process ;
end arch_ D ;

-- testeaz frontul pozitiv

-- testeaz intrare

-- iniializeaz bistabil
-- transmite valoarea d

-- nchide procesul

Exemplu : bistbil D cu aciune pe frontul descresctor,


cu RESET i PRESET sincron

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

Procesul este senzitiv numai la clk


Prioriti :

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

-- proces senzitiv numai fa de clk

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

Intrri de iniializare asincrone


( RESET i PRESET asincron )
-Realizeaz inializarea cu '1' (PRESET) sau cu '0' (RESET)
a bistabililor independent de semnalul CLK ( n orice moment ).
- Au aciune prioritar fa de CLK i fa de intrrile de date.
Exemplu : bistbil D-latch cu RESET aincron
d
clk

E R

reset

reset

Procesul este senzitiv la clk , d i 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

-- proces senzitiv numai fa de clk , d i reset

if ( reset = '1' ) then


q <= '0' ;
elsif (clk = '1' ) then
q <= d ;
end if ;
end process ;
end arch_ D ;

-- testeaz intrar

-- iniializeaz bistabi

--testeaz prezena semnal

-- transmite valoarea d

-- nchide procesul

NUMRTOARE
qn-1
qn-2
clk

..
. q1
q0
iniializare

-Numr impulsurile clk i afieaz rezultatul numr


n cod binar natural.

-Capacitatea numrtorului : 2n - 1 , unde n = nr

- Sunt automate simple : starea urmtoare a ieirii


depinde numai de starea a
- Se realizeaz din :

bistabili

legturi
de reacie

logic
combinaional

memoreaz
aduc starea actual
genereaz
starea actual
la intrare
starea urmtoare

-Ex. : numrtor sincron de 3 bii (0 7) realizat cu bistabili D master-slave


(numrtor sincron : toi bistabilii sunt comandai simultan de clk).

Logic combinaional

Reacie

Registru
(bistabili)

Q2

q2

Q1

q1

Q0
D0
(MS)

q0

D2
(MS)

D1
(MS)

clk

Semnalul de ieire se cere declarat n modul buffer,


pentru a realiza reacia intern :
q : buffer std_logic_vector(2
downto 0) ;

Bloc I/O
Poart 3-stri

Matricea
de
interconect
are

pin ieire

oe
MUX

Configurarea blocului I/O pentru modul buffer

Funcionarea unui numrtor binar, progresiv, reciclabil

q2q1q0 :

000

001

010

011

...

111

...

clk
0

t
7

library ieee ;
use ieee.std_logic_1164.all ;
use work.std_arith.all ;

--admite adunarea semnalelor logice cu numere

entity NUMARATOR is port


( clk : in std_logic ;
q : buffer std_logic_vector (2 downto 0) ) ;
end NUMARATOR ;

--ieirea n mod bu

architecture arch_NUMARATOR of NUMARATOR is


begin
NUMARARE : process (clk)
--ieirea este senzitiv numai la clk
begin
if (clk'event and clk = '1') then
--testeaz frontul cresctor al clk
q <= q + 1 ;
--incrementeaz cu 1
else q <= q ;
--pstreaz starea (instruciune redundant)
end if ;
end process NUMARARE ;
end arch_NUMARATOR ;

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

Descrierea numrtoarelor cu intrri de iniializare sincrone


Exemplu : numrtor de 4 bii cu RESET sincron
q3 q2 q1 q0 :

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

architecture arch_NUM of NUM is


begin
NUMARARE : process (clk)
--ieirea este senzitiv numai la clk
begin
if rising_edge(clk) then
--testeaz frontul cresctor al clk
if reset = '1' then
q < = "0000";
--ini-ializeaz cu
else q <= q + 1 ;
--incrementeaz cu 1
end if ;
end if ;
end process NUMARARE ;
end arch_NUM ;

scrierea numrtoarelor cu intrare de validare a numrrii (count_enab


Exemplu : numrtor de 8 bii
cu count_enable
0..00

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

--ieirea este senzitiv numai la clk

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 ;

Descrierea numrtoarelor cu intrare de iniializare sincron


Exemplu : numrtor de 16 bii cu iniializare sincron i
validarea numrrii

Dac ini = '1' , se ncarc numrtorul cu o valoarea fix : "1000000

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

architecture arch_NUM of NUM is


begin
NUMARARE : process (clk)
--ieirea este senzitiv numai la clk
begin
if (clk'event and clk = '1') then
--testeaz frontul cresctor al clk
if ini = '1' then
q < = ('1' , others => '0') ;
--iniializeaz cu 10
elsif count_en = '1' then
q <= q +1 ;
--incrementeaz cu 1
end if ;
end if ;
end process NUMARARE ;
end arch_NUM ;

Obs. :

ex.:

others

permite scrierea prescurtat


a vectorilor logici cu lungimi mari.

q <= "000000000"

se poate scrie

q <= (others

q <= 11111111"

se poate scrie

q <= (others

q <= "0100000000"

se poate scrie

q <= ( '0' , '1' , o

Descrierea numrtoarelor cu intrare de ncrcare sincron (

Exemplu :
numrtor de 8 bii cu intrare de ncrcare sincron i validarea numr

clk
count_en
load

q[7:0]

Dac load = '1' ncarc numrtorul cu


de pe intrarea "data", apoi continu num
de la aceast valoare.

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 +

entity NUM is port


( clk , load, count_en : in std_logic ;
data : in std_logic (7 downto 0) ;
q : buffer std_logic_vector (7 downto 0) ) ;
--ieirea n mod buffer

end NUM ;
architecture arch_NUM of NUM is
begin
NUMARARE : process (clk)

--ieirea este senzitiv numai la

clk

begin
if (clk'event and clk = '1') then

--testeaz frontul cresctor al

clk

if load = '1' then


q < = data ;
de pe intrarea "data"

elsif count_en = '1' then


q <= q +1 ;
--incrementeaz cu 1

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

--ieirea n mod buff

architecture arch_NUM of NUM is


begin

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 ;

Descrierea numrtoarelor cu intrri de iniializare asincr


Exemplu : numrtor de 16 bii cu RESET i PRESET - asincrone

q [ 15 : 0 ]

clk

reset

RESET i PRESET acioneaz independent fa


RESET : aduce numrtorul n starea "0000
PRESET : aduce numrtorul n starea "1111
RESET acioneaz prioritar fa de PRESET.

preset

Proces senzitiv la

Prioriti :

clk, reset, preset


reset preset

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 +

entity NUM is port


( clk , reset, preset : in std_logic ;
q : buffer std_logic_vector (15 downto 0) ) ;
--ieirea n mod buffer

end NUM ;
architecture arch_NUM of NUM is
begin
NUMARARE : process (reset, preset,clk)

--ieirea este senzitiv

la
-preset i clk reset,

begin
if reset = '1' then
q <= ( others => '0' ) ;

--testeaz reset
--iniializeaz cu "000

00"

elsif preset <= '1' then


q <= ( orthers => '1' ) ;

--testeaz preset
--iniializeaz cu "111

11"

elsif (clk'event and clk = '1') then


al clk

q <= q + 1 ;

--testeaz frontul cresctor

Exemplu recapitulativ
Numrtor de 16 bii cu :

- intrare de ncrcare i validarea numrri


- reset i preset - asincrone

clk
count_en
load

q [ 15 : 0 ]

- reset i preset au aciune prioritar fa


clk, load i count_en;
- reset acioneaz prioritar fa de prese
- load = '1' ncarc numrtorul cu valori
de pe intrarea "data", apoi continu nu
de la aceast valoare ;
- count_en valideaz numrarea ;

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;

Descrierea ieirilor cu 3 stri (3-state) (TS)


Semnalele de tip std_logic i std_logic_vector pot
lua valorile :
'1'
valori logoce
'0
'Z'
nalt impedan ( high Z) (HZ) - valoare
"meta-logic"
Exemplu : numrtor de 4 bii cu ieiri TS

oe
clk

q[3:0]

y[3:0]
oe

0
1

ZZZZ ieirea ntrerupt


q
ieirea validat

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;

descrierea ieirii 3_stat

Obs. : - pentru starea de nalt impedan se folosete


simbolul Z (majuscul);

- descrierea ieirii 3-state se poate face


i cu instruciunea if-then-else , n cadrul unui proces
senzitiv la q i oe.

TS : process(q, oe)
begin
if oe=1 then y <= q ;
else y <= ZZZZ ;
end if ;
end process TS ;

Exemplu :

numrtor de 4 bii cu validarea numrrii, reset asincron i

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

q este senzitiv la reset i clk

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

- Numrtorul i ieirea TS sunt descrse prin


dou procese distincte, n cadrul aceleiai arhitecturi.
- q se declar ca semnal intern (nu aparine portului).

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 .

Exemplu : numrtor presetabil de 4 bii, folosind ieirea i ca intrare de iniializare :

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 :

- validarea numrrii (count_enable)


- iniializare sincron (load)
- ieire TS (oe)
- folosirea pinilor de ieire pentru iniia
Descrierea numrtorului :

oe

clk

clk
count_en
load

q [7:0]
i_o [ 7 : 0 ]

data [ 7 : 0 ]

count_en

load

q+1

i_o

q este senzitiv la clk


1)
Prioriti : 2)
3)

Descrierea ieirii TS :

oe
0
1

q+

i_o
"ZZ ..Z"
q

i_o este senzitiv la q i


oe

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" ;

S-ar putea să vă placă și