реклама на сайте
подробности

 
 
> Block RAM на VHDL в Spartan3, Could not implement Block RAM. Is the read address registered using th
Vadim_nsk
сообщение Jun 28 2006, 09:38
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 7-09-05
Из: г. Новосибирск
Пользователь №: 8 335



При описании памяти как массива производится чтение и запись по разным адресам, при этом чтение производится ассинхронно, а запись синхронно.
При объявлении массива указываю атрибут:
attribute syn_ramstyle : string;
attribute syn_ramstyle of data_array_1 : signal is "block_ram";--"no_rw_check";

При этом Synplify Pro 8.4 в отчете выдает следующее сообщение:
Could not implement Block RAM. Is the read address registered using the same clock as the RAM?

Код примерно следующий:

entity name is
clock : in std_logic;
din : in signed( 15 downto 0 );
write : in std_logic;
dout : out signed( 15 downto 0 );
...
end name;

architecture name_body of name is

subtype data_type is signed( 15 downto 0 );
type data_array_type is array( 0 to 7 ) of data_type;
signal data_array_1 : data_array_type := ( others => to_signed( 0, data_type'length ) );
signal data_array_2 : data_array_type := ...;
attribute syn_ramstyle : string;
attribute syn_ramstyle of data_array_1 : signal is "block_ram";--"no_rw_check";
attribute syn_ramstyle of data_array_2 : signal is "block_ram";--"no_rw_check";

signal rd1_addr, wr1_addr : unsigned( 2 downto 0 ) := to_unsigned( 0, 4 );
signal rd2_addr, wr2_addr : unsigned( 2 downto 0 ) := to_unsigned( 0, 4 );
signal A, C : data_type := to_signed( 0, data_type'length );

body

A <= data_array_1( to_integer( rd1_addr ) );
C <= data_array_2( to_integer( rd2_addr ) );

process( reset, clock )
begin
if reset = '1' then
A <= to_signed( 0, data_type'length );
C <= to_signed( 0, data_type'length );
rd1_addr <= ...;
wr1_addr <= ...;
rd2_addr <= ...;
wr2_addr <= ...;
...
elsif rising_edge( clock ) then
dout <= A * C;
if write = '1' then
data_array_1( to_integer( wr1_addr ) ) <= din;
end if;
rd1_addr <= rd1_addr + 1;
wr1_addr <= wr1_addr + 1;
rd2_addr <= rd2_addr + 1;
end if;
end process;

end name_body;

Как нужно описывать RAM в виде массива, чтобы Synplify сделал из него BlockRAM?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
maior
сообщение Jun 29 2006, 14:26
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 177
Регистрация: 21-10-04
Пользователь №: 948



Hо ведь есть еще стандартные примитивы памяти (блочной и распределенной),
на базе которых можно сделать универсальные параметризиремые (через generic)
бибиотечные элементы. Я так и делал для виртексов 2 и 4 (один элемент годился для обоих
и позволял строить память почти любой конфигурации!).
Для спартанов - тоже не должно быть проблем.
И не заморачивался ни с coregen, ни с behaviorial, которое по-разному и неустойчиво
интерпретируется разными синтезаторами в разных условиях и для
разных (даже слегка разных!) чипов.
Go to the top of the page
 
+Quote Post
Gorby
сообщение Jun 30 2006, 09:32
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 449
Регистрация: 28-10-04
Из: Украина
Пользователь №: 1 002



Цитата(maior @ Jun 29 2006, 18:26) *
Hо ведь есть еще стандартные примитивы памяти (блочной и распределенной),
на базе которых можно сделать универсальные параметризиремые (через generic)
бибиотечные элементы. Я так и делал для виртексов 2 и 4 (один элемент годился для обоих
и позволял строить память почти любой конфигурации!).
Для спартанов - тоже не должно быть проблем.
И не заморачивался ни с coregen, ни с behaviorial, которое по-разному и неустойчиво
интерпретируется разными синтезаторами в разных условиях и для
разных (даже слегка разных!) чипов.


Фактически, вы руками доделали некоторую часть работы. Которую запросто мог за вас сделать Кореген. Более того, вам пришлось разбираться с тонкостями использования тех примитивов - причем обременительными тонкостями, типа зануления старших адресов если используется не вся память и построение дешифраторов, если требуется бОльшая. И зачем?! Когда есть кореген, одним движением пальца делающий все это.

Насчет переносимости, разных синтезаторов и проч. Сдается мне, что проблему сильно преувеличивают.

Не знаю, кто как, но я только один раз кардинально менял окружение. С Леонардо Спектрум для Atmel FPSLIC прыгнул на Spartan2 и XST (ISE). Разумеется, блоки памяти потребовали кардинальной переделки. Которая заключалась всего лишь в генерации оных в Корегене.
Затем перешел на Спартан 3, так ничего и не поменялось. Сгенерировал то же самое в Корегене.

А теперь пожалуйста ответьте, как часто вам, уважаемые коллеги, пришлось переходить (в ходе разработки ОДНОГО изделия) на кардинально другие FPGA и кардинально другие синтезаторы?

Ото ж... А на рихтовку своих исходников с целью сделать их универсальными вы потратите очень много времени с непредсказуемым результатом. (речь идет об аппаратно-специфических вещах, память, DDR регистры и проч.).

Моя идеология проста: делаем на plain VHDL все, что можно. По возможности без атрибутов и прочих бубенцов. Все специфическое включаем в блэк-боксы, их генерируем в целевой среде. Констрейны и прочие весьма зависимые прибамбасы (распиновка, типы выводов и тд) делаем исключительно в целевой среде. И не паримся. При переходе на что-то другое у нас остается везде компилируемый чистый VHDL, блэк-боксы создаем по-новой - тут уж никуда не деться. А констрейны, пинауты и иже с ними в новой среде все равно придется вбивать по-новой. Каламбурчик.


--------------------
Умею молчать на 37 языках...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Vadim_nsk   Block RAM на VHDL в Spartan3   Jun 28 2006, 09:38
- - oval   Цитата(Vadim_nsk @ Jun 28 2006, 13:38) Пр...   Jun 28 2006, 09:43
|- - Vadim_nsk   Цитата(oval @ Jun 28 2006, 16:43) Канал ч...   Jun 28 2006, 11:47
|- - oval   Цитата(Vadim_nsk @ Jun 28 2006, 15:47) Ци...   Jun 28 2006, 12:16
- - avesat   Проще использовать готовые RAM блоки, рекомендован...   Jun 28 2006, 10:03
- - des00   откуда у блочной памяти асинхронные сбросы ? чита...   Jun 28 2006, 10:44
- - des00   какая разница ? вы позволили синтезатору доопредел...   Jun 28 2006, 12:07
- - vetal   Возможно, что дело еще в: Кодrd1_addr <= rd1_a...   Jun 28 2006, 12:09
- - Gorby   Извините, что врываюсь... Почему-то никто ни слов...   Jun 28 2006, 12:16
- - Mad Makc   ЦитатаПочему-то никто ни слова не произнес про COR...   Jun 28 2006, 13:11
- - Wild   Если адрес чтения успевает устанавливаться к серид...   Jun 29 2006, 11:54
- - maior   Цитата(Gorby @ Jun 30 2006, 13:32) ... Фа...   Jun 30 2006, 12:58
- - des00   МОЕ ИМХО на весь этот счет, у памяти 2 конфигураци...   Jul 1 2006, 06:42
- - qwqw   У меня Spartan2 а не 3, но думаю это непринципиаль...   Aug 23 2006, 09:08
- - BSV   Пытался делать такую штуку в ISE 4.2. Были проблем...   Aug 23 2006, 19:42
- - qwqw   разрядность портов: A (запись) = 8 B(чтение) = 32 ...   Aug 24 2006, 08:44
- - BSV   А синтезатор-то что говорит? В Вашей реализации я ...   Aug 24 2006, 10:59
- - BSV   Попробовал - таки да, не хавает, говорит, что вмес...   Aug 24 2006, 11:40
- - qwqw   насчет ошибки я не согласен, если посмотрите в при...   Aug 24 2006, 14:05
- - BSV   Зачем Вам противофазный клок? Если нужен отрицател...   Aug 24 2006, 14:46


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th August 2025 - 02:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01717 секунд с 7
ELECTRONIX ©2004-2016