Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с BRAM Памятью на Хилинх
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Iskatel
Помогите пожаилуста с BRAM

не могу сообразить что и как нужно делать чтобы Xilinx синтезатор MemoryNext как Block RAM организовал. Я понимаю что RAM двухпортовыи Read and Write, но мне надо два раза считать и два раза переписать его. А вот сделать этого не могу. Я думал что Синтезатор имеет определённую интелигенцию и понимает, что я одновреммено только в одном месте, считываю либо записываю в память, но я как видно ошибаюсь, и вместо BRAM синтезатор использует кучу регистров. Помогите пожайлуста
Мой код выглядит следуюшим образом:

type MemoryTyp is array (0 to StateNumber-1) of signed(MWidth-1 downto 0);
signal Memory : MemoryTyp := (others => (others =>'0')) ;
signal MemoryNext : MemoryTyp := (others => "10000000") ;
begin
Symbol_Read: process(Clock)
begin

if rising_edge(Clock) then
if (Flanke = '1') then
Counter <= Counter+1;
CopyBckEnbl <= '0';
--....
end if;
--.....
if(counter = RecivedBit) then -- RecivedBit == 2 bits Read
if (CopyBckEnbl = '0') then MN_Tmp <= MemoryNext(NEWSTATE); end if;-- 1 raz schitat

if(TaktCnt > 6 and TaktCnt < 14)then--14
if( MN_Tmp < LargestValue ) then
MemoryNext(NEWSTATE_1) <= LargestValue; end if; -- 1 once write
--......
end if;

if(TaktCnt = 13)then ---13
Counter <= 0;
TaktCnt <=0;
CopyBckEnbl <= '1';
else TaktCnt <= TaktCnt+1;
end if;
end if;

if ( CopyBckEnbl = '1' ) then
Memory(CBCnt) <= MemoryNext(CBCnt);end if; --2 read is a Copy back
if (CBCnt= 64)then CBCnt <= 0;
CopyBckEnbl <= '0';
SetEnbl <= '1';
else CBCnt <= CBCnt+1;
end if;
end if;

if ( SetEnbl = '1' ) then
MemoryNext(SetEnblCnt) <= ( "10000000"); -- 2 Write set a smallest value
--.......
if (SetEnblCnt= 64)then SetEnblCnt <= 0;
SetEnbl <= '0';
-- ..........
else SetEnblCnt <= SetEnblCnt+1;
end if;
end if;
end if;
end process Symbol_Read;
end Behavioral;
XVR
У вас получилось 4 однонаправленных порта. Для того, что бы синтезировался BRAM у него должно быть не более 2х двунаправленных (в смысле - для чтения/записи) портов. Т.е. адреса (в пределах одного порта) должны совпадать и условия чтения/записи должны быть взаимоисключающими. Ну и синтезатор это все должен понять sm.gif
Kompot
Цитата(Iskatel @ Apr 3 2011, 19:16) *
Помогите пожаилуста с BRAM

не могу сообразить что и как нужно делать чтобы Xilinx синтезатор MemoryNext как Block RAM организовал. Я понимаю что RAM двухпортовыи Read and Write, но мне надо два раза считать и два раза переписать его. А вот сделать этого не могу. Я думал


Давненько не брал в руки шашек...

Что-то вы не с того конца зашли. Если вы точно знаете, что вам нужно, то идете прямо в Кореген и с визардом вместе генерируете себе блок памяти с нужными свойствами. Он гарантированно будет лучше чем любой синтезированный, ибо уже аппаратно оптимизирован.

На будущее - далеко не все железо, что есть на борту современных ФПГА можно вот так просто выразить на VHDL и ожидать, что оно синтезируется. Надо либо читать доку на синтезатор (там до запятой расписывается как из ЯВУ инстанцировать определенные железные компоненты, но возможно это не всегда), либо корегеном (для памяти особенно), либо просто свои обертки писать и напрямую вставлять например двунаправленный выходной буфер с третим состоянием и DDR регистром в пине.
Iskatel
Цитата(XVR @ Apr 4 2011, 12:17) *
У вас получилось 4 однонаправленных порта. Для того, что бы синтезировался BRAM у него должно быть не более 2х двунаправленных (в смысле - для чтения/записи) портов. Т.е. адреса (в пределах одного порта) должны совпадать и условия чтения/записи должны быть взаимоисключающими. Ну и синтезатор это все должен понять sm.gif


Так вот в этом то и проблема адреса ставил все одинаковые и для меня выглядит всё взаимноисключающим, а вот синезатор этого понимать не хочет
XVR
Цитата(Iskatel @ Apr 4 2011, 14:22) *
Так вот в этом то и проблема адреса ставил все одинаковые и для меня выглядит всё взаимноисключающим, а вот синезатор этого понимать не хочет
Посмотрите в доке (в описании библиотеки, а точнее BRAM'а) - там есть шаблоны на HDL. Их синтезатор понимать обязан rolleyes.gif (Кстати, там еще могут быть дополнительные ограничения, ну например невозможность извлечь из описание 2х двунарпавленных порта smile3046.gif Почитайте там же )

Иван Панченко
действительно, примеры стандартных компонентов лучше посмотреть в : Xilinx_folder\ISE_DS\ISE\doc\usenglish\isehelp\xst.pdf.
Но даже грамотно написанная память, будет разводится много дольше, чем сгенерированная CoreGenerator. Возможно можно попытаться, найти какую-то галочку в оптимизации(чувствуется,что синтезатор пытается ее соптимизировать) - но мне не удалось.
Iskatel
Спасибо всем за советы. Кореген то что нужно при этой задаче. BRAM сгенерировал привязал
и сейчас всё работает как часы. Все попытки заставить синтезатор самому сгенерировать Block RAM
провалились.
ADA007
Цитата(Iskatel @ Apr 9 2011, 11:18) *
Все попытки заставить синтезатор самому сгенерировать Block RAM
провалились.

Чтобы не мучать синтезатор и себя Xilinx выпускает специально UG для тех, кто умеют читать ... читаем XST User Guide ... там все написано как в виде HDL представить тот или иной примитив понятный XST...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.