-
1. Data: 2014-07-08 21:07:54
Temat: VHDL - RAM obsługujący read-during-write
Od: Jakub Rakus <s...@o...pl>
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
-
2. Data: 2014-07-09 00:28:56
Temat: Re: VHDL - RAM obsługujący read-during-write
Od: Adam Górski <gorskiamalpa@wpkropkapl>
W dniu 2014-07-08 21:07, Jakub Rakus pisze:
> 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
-
3. Data: 2014-07-09 00:39:34
Temat: Re: VHDL - RAM obsługujący read-during-write
Od: Adam Górski <gorskiamalpa@wpkropkapl>
W dniu 2014-07-08 21:07, Jakub Rakus pisze:
> 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
-
4. Data: 2014-07-09 23:29:00
Temat: Re: VHDL - RAM obsługujący read-during-write
Od: Jakub Rakus <s...@o...pl>
On 09.07.2014 00:39, Adam Górski wrote:
> 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