Hardware Reference
In-Depth Information
procedure
init(
signal
fifo:
inout
tFIFO)
is
begin
fifo.lz <= 0;
fifo.sz <= 0;
fifo.leer <=true;
fifo.voll <=false;
end procedure
;
init
FIFO-
Objekt
)
WEB-Projekt:P3.4/FIFO_pack.vhdl
Die Schreibmethode übernimmt den Eingabewert nur, wenn der FIFO nicht
voll ist. Bei Übernahme wird das Flag »leer« gelöscht und nach der Übernah-
me die Adresse weitergeschaltet. Die Adressweiterschaltung erfolgt zirkular
mit Hilfe der Modulo-Operation. Nach der höchsten Adresse folgt die kleinste
Adresse:
function
inc(x: tAdrIdx)
return
tAdrIdx
is
begin
return
(x+
1
)
mod
(tAdrIdx'high+
1
);
end function
;
)
WEB-Projekt:P3.4/FIFO_pack.vhdl
Wenn die Schreib-Adresse dabei die Lese-Adresse einholt, wird das Flag »voll«
gesetzt und der FIFO übernimmt bei nachfolgenden Schreiboperationen keine
weiteren Daten.
procedure
write(x: tDaten;
signal
fifo:
inout
tFIFO)
is
begin
if not
fifo.voll
then
fifo.Mem(fifo.sz) <= x;
fifo.leer <=false;
fifo.sz <= inc(fifo.sz);
if
fifo.sz=fifo.lz
then
fifo.voll <=true;
end if
;
end if
;
end procedure
;
write
x
FIFO-
Objekt
)WEB-Projekt:P3.4/FIFO_pack.vhdl
Die Lesemethode ist ähnlich aufgebaut. Sie hat statt des Eingabesignals das
Ausgabesignal als Übergabeparameter. Wenn der FIFO nicht leer ist, wird der
Wert, auf den der Lesezeiger zeigt, ausgegeben, das Flag »voll« gelöscht, der
Lesezeiger weitergestellt und, falls der Lesezeiger den Schreibzeiger eingeholt
hat, das Flag »leer« gesetzt.
procedure
read(
signal
y:
out
tDaten;
signal
fifo:
inout
tFIFO)
is
begin
if not
fifo.leer
then
y <= fifo.Mem(fifo.lz);
fifo.voll <=false;
fifo.lz <= inc(fifo.lz);
if
fifo.lz=fifo.sz
then
fifo.leer <=true;
end if
;
end if
;
end procedure
;
read
x
FIFO-
Objekt
⇒
Web-Projekt:P3.4/FIFOpack.vhdl