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