RTV forum PL | NewsGroups PL

Wyjaśnienie działania pamięci RAM w VHDL przy operacjach read-during-write

VHDL - RAM obsługujący read-during-write

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Wyjaśnienie działania pamięci RAM w VHDL przy operacjach read-during-write

Jakub Rakus
Guest

Tue Jul 08, 2014 7:07 pm   



Przeglądając tutoriale na temat sposobów pisania kodu HDL tak, żeby
syntetyzator maksymalnie wykorzystał specjalizowane bloki FPGA natknąłem
się na prosty przykład pamięci RAM obsługującej operacje typu read
during write:

ARCHITECTURE rtl OF single_clock_ram IS
TYPE MEM IS ARRAY(0 TO 31) OF STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL ram_block: MEM;
BEGIN
PROCESS (clock)
BEGIN
IF (clock'event AND clock = '1') THEN
IF (we = '1') THEN
ram_block(write_address) <= data;
END IF;
q <= ram_block(read_address);
-- VHDL semantics imply that q doesn't get data
-- in this clock cycle
END IF; END PROCESS; END rtl;

Nie do końca rozumiem dlaczego niby to:
q <= ram_block(read_address);
ma się wykonać dopiero przy następnym wejściu w proces? Że niby jak jest
spełniony IF we='1' to wszystko poza nim się nie wykona?

--
Pozdrawiam
Jakub Rakus

Adam GĂłrski
Guest

Tue Jul 08, 2014 10:28 pm   



W dniu 2014-07-08 21:07, Jakub Rakus pisze:
Quote:
Przeglądając tutoriale na temat sposobów pisania kodu HDL tak, żeby
syntetyzator maksymalnie wykorzystał specjalizowane bloki FPGA natknąłem
się na prosty przykład pamięci RAM obsługującej operacje typu read
during write:

ARCHITECTURE rtl OF single_clock_ram IS
TYPE MEM IS ARRAY(0 TO 31) OF STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL ram_block: MEM;
BEGIN
PROCESS (clock)
BEGIN
IF (clock'event AND clock = '1') THEN
IF (we = '1') THEN
ram_block(write_address) <= data;
END IF;
q <= ram_block(read_address);
-- VHDL semantics imply that q doesn't get data
-- in this clock cycle
END IF; END PROCESS; END rtl;

Nie do końca rozumiem dlaczego niby to:
q <= ram_block(read_address);
ma się wykonać dopiero przy następnym wejściu w proces? Że niby jak jest
spełniony IF we='1' to wszystko poza nim się nie wykona?



Poczytaj o różnicach pomiędzy signal i variable.

Wprost mówiąc :

Jeżeli sygnały ( signal ) wewnątrz procesu mają przypisaną nową
"wartość" to jest ona "widziana" dopiero po restarcie procesu.

Jeżeli zmienne ( variable ) wewnątrz procesu mają przypisaną nową
"wartość" to jest ona "widziana" już w następnej "instrukcji" sekwencyjnej.

Tak proces "wykonuje" się sekwencyjnie ( zaraz mnie ktoś zamorduje ).

Pzdr

Adam

---
Ta wiadomość e-mail jest wolna od wirusów i złośliwego oprogramowania, ponieważ ochrona avast! Antivirus jest aktywna.
http://www.avast.com

Adam GĂłrski
Guest

Tue Jul 08, 2014 10:39 pm   



W dniu 2014-07-08 21:07, Jakub Rakus pisze:
Quote:
Przeglądając tutoriale na temat sposobów pisania kodu HDL tak, żeby
syntetyzator maksymalnie wykorzystał specjalizowane bloki FPGA natknąłem
się na prosty przykład pamięci RAM obsługującej operacje typu read
during write:

ARCHITECTURE rtl OF single_clock_ram IS
TYPE MEM IS ARRAY(0 TO 31) OF STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL ram_block: MEM;
BEGIN
PROCESS (clock)
BEGIN
IF (clock'event AND clock = '1') THEN
IF (we = '1') THEN
ram_block(write_address) <= data;
END IF;
q <= ram_block(read_address);
-- VHDL semantics imply that q doesn't get data
-- in this clock cycle
END IF; END PROCESS; END rtl;

Nie do końca rozumiem dlaczego niby to:
q <= ram_block(read_address);
ma się wykonać dopiero przy następnym wejściu w proces? Że niby jak jest
spełniony IF we='1' to wszystko poza nim się nie wykona?


Zapomniałem odpowiedzieć na twoje pytanie.
Wykona się. Powiedziałbym że się zdarzy.
Tyle że q będzie miała starą wartość.

Dla uproszczenia wyobraź sobie że mamy tylko jedną komórkę tej pamięci.
Jedno słowo 32 bitowe.
Ram_block przyjmie nową wartość kiedy we ='1' ale PO zdarzeniu , którym
jest narastające zbocze zegara.

Kiedy występuje zbocze zegara ram_block ma ciągle starą wartość.
I właśnie ta stara wartość zostanie zatrzaśnięta w q.

Podobno dla programisty nie ma znaczenia w czym programuje, ale tu jest
wyjątkowo pod górę bo są konstrukcje które nie mają sensy z punktu
widzenia programisty.

Adam

---
Ta wiadomość e-mail jest wolna od wirusów i złośliwego oprogramowania, ponieważ ochrona avast! Antivirus jest aktywna.
http://www.avast.com

Jakub Rakus
Guest

Wed Jul 09, 2014 9:29 pm   



On 09.07.2014 00:39, Adam Górski wrote:

Quote:
Zapomniałem odpowiedzieć na twoje pytanie.
Wykona się. Powiedziałbym że się zdarzy.
Tyle że q będzie miała starą wartość.

Dla uproszczenia wyobraź sobie że mamy tylko jedną komórkę tej pamięci.
Jedno słowo 32 bitowe.
Ram_block przyjmie nową wartość kiedy we ='1' ale PO zdarzeniu , którym
jest narastające zbocze zegara.

Kiedy występuje zbocze zegara ram_block ma ciągle starą wartość.
I właśnie ta stara wartość zostanie zatrzaśnięta w q.

Podobno dla programisty nie ma znaczenia w czym programuje, ale tu jest
wyjątkowo pod górę bo są konstrukcje które nie mają sensy z punktu
widzenia programisty.

Adam

---
Ta wiadomość e-mail jest wolna od wirusów i złośliwego oprogramowania,
ponieważ ochrona avast! Antivirus jest aktywna.
http://www.avast.com


Dzięki za proste i zrozumiałe wytłumaczenie problemu, teraz już kumam!

--
Pozdrawiam
Jakub Rakus

elektroda NewsGroups Forum Index - Elektronika Polska - Wyjaśnienie działania pamięci RAM w VHDL przy operacjach read-during-write

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map