obsługujący read-during-write

Jul 08, 2014 3 Replies

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?


W dniu 2014-07-08 21:07, Jakub Rakus pisze:

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

W dniu 2014-07-08 21:07, Jakub Rakus pisze:

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

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required