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

а то создание большив массивов из std_logic_vector отъедает кучу времени на компиляцию и количество логических вентилей быстро нарастает до единиц тысяч!
DmitryR
Надо почитать документацию на то программное обеспечение, которым вы пользуетесь. Там в примерах расписано, как надо кодить распространенные конструкции, чтобы они синтезились предсказуемо.
penauch
Цитата(DmitryR @ Nov 5 2009, 10:01) *
Надо почитать документацию на то программное обеспечение, которым вы пользуетесь. Там в примерах расписано, как надо кодить распространенные конструкции, чтобы они синтезились предсказуемо.


тоесть насколько я понял из вашего ответа, что в Vhdl нету такой синтаксической конструкции для работы с памятью?
andrew_b
Цитата(penauch @ Nov 5 2009, 11:13) *
тоесть насколько я понял из вашего ответа, что в Vhdl нету такой синтаксической конструкции для работы с памятью?
В VHDL памяти как таковой нет. Скажу Вам по секрету: в нем много чего нет. Вот как именно написать нечто, чтобы синтезатор воспринял это как память, -- это и есть задача разработчика. Таки читайте доку на Ваш синтезатор. Там это написано.

Или воспользуётесь поиском по форуму -- вопрос уже обуждался.
dvladim
Цитата(penauch @ Nov 5 2009, 10:27) *
как использовать встроенную память в ПЛИС? (как объявить в vhdl?)

Такие вещи, как правило, не описываются в HDL. В Альтере для этого пользуются Мегавизардом - генерится компонент с нужными характеристиками. В ксайлинксах, наверное, тоже что-то подобное есть.
DmitryR
Мегавизардом - это если платформенно-независимый код не нужен.
SM
Наиболее правильный подход - сгенерировать блок памяти при помощи Memory Compiler и подключить его в проект как модуль. А вот эти самые Memory Compiler-ы они могут называться по-разному в разном софте. Где-то это мегавизард, где-то еще что-то. Описывать память конструкциями языка есть смысл только в том случае, если синтез этого модуля не планируется, а только моделирование.

Цитата(DmitryR @ Nov 5 2009, 11:49) *
Мегавизардом - это если платформенно-независимый код не нужен.

Как раз с точностью до наоборот - мегавизардом, если платформонезависимый код НУЖЕН. Так как на любой платформе есть свой мемори компилер. Или конструкцией HDL, если четко привязываться к определенному синтезатору и рекомендациям по инферрингу от него.
Builder
Цитата(SM @ Nov 5 2009, 12:52) *
Как раз с точностью до наоборот - мегавизардом, если платформонезависимый код НУЖЕН. Так как на любой платформе есть свой мемори компилер. Или конструкцией HDL, если четко привязываться к определенному синтезатору и рекомендациям по инферрингу от него.

добавлю. Если компилится на разных платформах, выносим память в отдельный модуль, где по дефайну
вставляется нужная версия для нужной платформы.
Дефайн выводим на верхний уровень, для всего проекта.
o-henry
Цитата(dvladim @ Nov 5 2009, 10:44) *
В ксайлинксах, наверное, тоже что-то подобное есть.
В ксайлинксах это называется Core Generator.

Еще в ISE есть волшебная кнопочка в виде лампочки и с названием Language Template.
После нажатия на волшебную кнопочку можно заглянуть в раздел
VHDL->Synthesis Construct->CodingExamples->RAM

Еще есть и документация - но этим путем редко кто идет laughing.gif
SM
Цитата(Builder @ Nov 5 2009, 12:00) *
добавлю. Если компилится на разных платформах, выносим память в отдельный модуль, где по дефайну
вставляется нужная версия для нужной платформы.
Дефайн выводим на верхний уровень, для всего проекта.

Ага. Именно так. Только дефайн я предпочитаю выносить не на верхний уровень (кстати не очень понимаю, как это возможно), а вообще в опции синтезатора.
penauch
меня интересует в vhdl, квартус, альтера циклон-2

вот с них пожалста... по конкретнее...

напишите шаблон памяти хотя бы 1k x 8
SM
Цитата(penauch @ Nov 5 2009, 16:09) *
меня интересует в vhdl, квартус, альтера циклон-2

Найдите в меню квартуса мегавизард, в нем сгенерируйте нужную память, он сгенерирует все что надо, и шаблон, как ее подключить в проект, и модуль самой памяти.
DmitryR
Цитата(penauch @ Nov 5 2009, 16:09) *
напишите шаблон памяти хотя бы 1k x 8
Прочитайте хотя бы http://www.altera.com/literature/hb/qts/qts_qii51007.pdf

Как что там не поймете - пишите.
penauch
разобрался, спасибо.

но он по прежнему не использует биты памяти!!!

ниже лог компиляции - желаемое здействовать обведено красным
DmitryR
Значит плохо разобрались.
SM
Цитата(penauch @ Nov 5 2009, 16:48) *
но он по прежнему не использует биты памяти!!!

Отсюда можно сделать лишь два выводы. В мегавизарде Вы ему специально указали делать память из логики, а не из памяти. Либо пытаетесь делать то, чего не надо - описывать память самостоятельно HDL-конструкциями.
AndrewS6
В квартусе есть шаблоны языковых конструкций, а также полные схемы в т.ч. и памяти.
Edit->Insert Template->VHDL->Full Designs->RAMs and ROMs
penauch
спасибо. проработал два варианта - через wizard и через edit. Через edit описание памяти вклинивается в исходный файл проекта, но по-прежнему память синтезируется из вентилей.

если делать через wizard, то создаётся отдельный файл с описанием памяти где в generic указано "M4K" тоесть из ячеек памяти делать, так?

но подключить файл не удалось - как это сделать?

во вторых - как с этой памятью работать?
память однопортовая с we и clk.

и зачем мне clk? мне нужна асинхронная память - какую там не нашёл sad.gif

мне же нужно работать с памятью как с массивом std_logic_vector - и не хотелось бы всякие стробы и клоки примешивать, тоесть нужно чтоб переменные синтезировались из памяти а не из вентилей.
такое возможно?

если нет, то как пользоваться вышеупомянутой однопортовой памятью?
des00
Цитата(penauch @ Nov 5 2009, 19:19) *
и зачем мне clk? мне нужна асинхронная память - какую там не нашёл sad.gif


блин да прочитайте даташит на используемую ФПГА в конце то концов, в альтерах асинхронной блочной памяти после флексов небыло, нет и скорее всего не будет !!!
EvgenyNik
1. Из меню Edit вставляете template "нужная Вам RAM"
(берёте бубен, набедренную повязку и в ритме тумба-умба > п. 2) smile.gif
2. Настраиваете: главное меню Assignments > пункт Settings > категория Analysis & Syntethesys settings > кнопка More settings > опции (Auto RAM replacement = ON, Auto RAM to logic cell conversion = OFF)
P.S. Это в QII-7.2 так, в других версиях может последовательность и направление вложения опций отличаться, но сути дела не меняет.
SM
Цитата(des00 @ Nov 6 2009, 07:21) *
в альтерах асинхронной блочной памяти после флексов небыло, нет и скорее всего не будет !!!

Во первых с ацексов, а во вторых будет - в арриях и стратиксах последних вернули в виде распределенки.
Костян
Цитата(penauch @ Nov 5 2009, 23:19) *
 Через edit описание памяти вклинивается в исходный файл проекта, но по-прежнему память синтезируется из вентилей.


чтобы этого не происходило , нужно явно задавать тип памяти через настройки синтезатора (как Вам уже написали выше) либо через атрибуты языка hdl (читайте документацию на используемый синтезатор).
des00
Цитата(SM @ Nov 6 2009, 02:46) *
Во первых с ацексов, а во вторых будет - в арриях и стратиксах последних вернули в виде распределенки.


насчет асексов мог ошибаться и я говорил о блочной памяти, а не о распределенной %)
SM
Цитата(penauch @ Nov 6 2009, 04:19) *
но подключить файл не удалось - как это сделать?

Файл просто добавить в проект, а в тот файл, где используется память. Описание компонента - генерируется визардом, его только включить не забыть. Ну и экземпляр - через memory_inst: memory_name PORT MAP ( .... );

Цитата(penauch @ Nov 6 2009, 04:19) *
Через edit описание памяти вклинивается в исходный файл проекта, но по-прежнему память синтезируется из вентилей.

И будет из вентилей, пока хотите асинхронную. Так как, как уже сказали, асинхронного режима у M4K нет.

Цитата(des00 @ Nov 6 2009, 11:50) *
о блочной памяти, а не о распределенной %)


Так они распределенку сделали в виде блочной - один блок = 1 MLAB = 640 бит = 64x10 | 32x20
des00
Цитата(SM @ Nov 6 2009, 02:56) *
Так они распределенку сделали в виде блочной - один блок = 1 MLAB = 640 бит = 64x10 | 32x20


я бы не стал так однозначно утверждать. Назвать можно все что угодно и как угодно, вот из даташита на стратикс 4
Цитата
The LAB of Stratix IV has a new derivative called Memory LAB (MLAB), which adds look-up table (LUT)-based SRAM capability to the LAB as shown in Figure 2–2.
....
You can use MLAB ALM as a regular LAB ALM or configure it as a dual-port SRAM, as shown

будет тоже самое если назвать SLICEM у хилых каким нить RAMD и заявить что это блочная память с асинхронным чтением, только маленькая. Хотя на деле будут те же яйца вид сбоку %)
SM
Цитата(des00 @ Nov 6 2009, 13:29) *
я бы не стал так однозначно утверждать. Назвать можно все что угодно и как угодно, вот из даташита на стратикс 4

Так одно дело было бы, если бы отдельно взятый ALM можно было бы переключить в режим памяти 64х1 или 32х2, так нет - только блок целиком. И название - MLAB - буква B означает Block. И заметьте, не я это придумал wink.gif
des00
Цитата(SM @ Nov 6 2009, 04:45) *
Так одно дело было бы, если бы отдельно взятый ALM можно было бы переключить в режим памяти 64х1 или 32х2, так нет - только блок целиком. И название - MLAB - буква B означает Block. И заметьте, не я это придумал wink.gif


прекрасно понимаю что вы тут не причем %) ну не сделали альтеровцы адресный генератор на каждый ALM, а сделали общий на LAB. Но самой сути это не меняет, память эта асинхронная по той причине что на LUT е основана, который и является памятью. ИМХО LUT ресурс более распределенный чем блочный, полагаю на этом можно спор о терминах окончить %)
DmitryR
Можно я еще скажу? У этого MLAB всего два входа byte enable, поэтому если вы делаете память 32x20 на MLAB, то byte enable получается на 10 бит. А мне вот надо было довольно много памяти сделать с byte enable по 4 бита - и половина блока пропадает впустую, ее уже как логику тоже не использовать. Короче это безобразие, а не память.
des00
Цитата(DmitryR @ Nov 6 2009, 05:11) *
Можно я еще скажу? У этого MLAB всего два входа byte enable, поэтому если вы делаете память 32x20 на MLAB, то byte enable получается на 10 бит. А мне вот надо было довольно много памяти сделать с byte enable по 4 бита - и половина блока пропадает впустую, ее уже как логику тоже не использовать. Короче это безобразие, а не память.


А RMW цикл не получилось использовать ? асинхронное чтение тут как раз рулит smile.gif
o_khavin
Цитата
А RMW цикл не получилось использовать ? асинхронное чтение тут как раз рулит

это Xilinx рулит... rolleyes.gif
Цитата
А мне вот надо было довольно много памяти сделать с byte enable по 4 бита

а какой глубины нужна память? может на рассыпухе проще будет?
penauch
c помощью визарда создал такой файл mem.vhd:

Код
LIBRARY ieee;
USE ieee.std_logic_1164.all;

LIBRARY altera_mf;
USE altera_mf.all;

ENTITY mem IS
    PORT
    (
        clock        : IN STD_LOGIC;
        data        : IN STD_LOGIC_VECTOR (14 DOWNTO 0);
        rdaddress        : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
        wraddress        : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
        wren        : IN STD_LOGIC  := '1';
        q        : OUT STD_LOGIC_VECTOR (14 DOWNTO 0)
    );
END mem;


ARCHITECTURE SYN OF mem IS

    SIGNAL sub_wire0    : STD_LOGIC_VECTOR (14 DOWNTO 0);



    COMPONENT altsyncram
    GENERIC (
        address_reg_b        : STRING;
        clock_enable_input_a        : STRING;
        clock_enable_input_b        : STRING;
        clock_enable_output_a        : STRING;
        clock_enable_output_b        : STRING;
        intended_device_family        : STRING;
        lpm_type        : STRING;
        numwords_a        : NATURAL;
        numwords_b        : NATURAL;
        operation_mode        : STRING;
        outdata_aclr_b        : STRING;
        outdata_reg_b        : STRING;
        power_up_uninitialized        : STRING;
        ram_block_type        : STRING;
        read_during_write_mode_mixed_ports        : STRING;
        widthad_a        : NATURAL;
        widthad_b        : NATURAL;
        width_a        : NATURAL;
        width_b        : NATURAL;
        width_byteena_a        : NATURAL
    );
    PORT (
            wren_a    : IN STD_LOGIC;
            clock0    : IN STD_LOGIC;
            address_a    : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
            address_b    : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
            q_b    : OUT STD_LOGIC_VECTOR (14 DOWNTO 0);
            data_a    : IN STD_LOGIC_VECTOR (14 DOWNTO 0)
    );
    END COMPONENT;

BEGIN
    q    <= sub_wire0(14 DOWNTO 0);

    altsyncram_component : altsyncram
    GENERIC MAP (
        address_reg_b => "CLOCK0",
        clock_enable_input_a => "BYPASS",
        clock_enable_input_b => "BYPASS",
        clock_enable_output_a => "BYPASS",
        clock_enable_output_b => "BYPASS",
        intended_device_family => "Cyclone II",
        lpm_type => "altsyncram",
        numwords_a => 256,
        numwords_b => 256,
        operation_mode => "DUAL_PORT",
        outdata_aclr_b => "NONE",
        outdata_reg_b => "CLOCK0",
        power_up_uninitialized => "FALSE",
        ram_block_type => "M4K",
        read_during_write_mode_mixed_ports => "DONT_CARE",
        widthad_a => 8,
        widthad_b => 8,
        width_a => 15,
        width_b => 15,
        width_byteena_a => 1
    )
    PORT MAP (
        wren_a => wren,
        clock0 => clock,
        address_a => wraddress,
        address_b => rdaddress,
        data_a => data,
        q_b => sub_wire0
    );



END SYN;


и ещё mem_inst.vhd:

Код
mem_inst : mem PORT MAP (
        clock     => clock_sig,
        data     => data_sig,
        rdaddress     => rdaddress_sig,
        wraddress     => wraddress_sig,
        wren     => wren_sig,
        q     => q_sig
    );


как теперь этим пользоваться?
читать/записать...

и как включить в проект?
Ledmaster
Цитата(penauch @ Nov 9 2009, 07:20) *
как теперь этим пользоваться?
читать/записать...
и как включить в проект?


Может я сейчас глупость скажу, но всегда ли оправдано использование VHDL?
В графическом режиме таких вопросов не возникает.
Нажмите для просмотра прикрепленного файла
penauch
подцепил файл сгенеренный мегавизардом к проекту - стал компилироваться вместе с остальными файлами.

вопрос - как теперь в тексте программы использовать эту память?
andrew_b
Цитата(penauch @ Nov 9 2009, 16:00) *
вопрос - как теперь в тексте программы использовать эту память?
Ищите в книжке, как в VHDL используются компоненты (ключевое слово -- component instantiation).
SM
Вот в файле mem_inst.vhd самый что ни на есть конкретный пример, как использовать эту память.
penauch
я наконец-то хочу услышать ответ по этой памяти.

можно ли работу с ней сделать настолько же удобной как с массивами std_logic_vector ?

или прийдется стробировать и клочить вручную?
DmitryR
Цитата(penauch @ Nov 9 2009, 16:47) *
я наконец-то хочу услышать ответ по этой памяти.
Вы это, не школьный учитель, часом?

Цитата(penauch @ Nov 9 2009, 16:47) *
можно ли работу с ней сделать настолько же удобной как с массивами std_logic_vector ?
Двадвцать раз уже кажется вам объяснили: нет, нет и нет. Никакое железо не поддерживает всех конструкций языков высокого уровня, и искусство программирования на HDL заключается именно в знании аппаратуры и умением написать на HDL конструкции, которые в кокретном железе могут быть реализованы.
EvgenyNik
penauch, Вы вероятно программист, в смысле - программируете для МК, PC и т.п...
Вполне понятно, что хочется иметь аналогию того, как в программе для МК ведётся обращение к регистрам или ячейке памяти на низком уровне - примерно одинаково, или на высоком уровне - можно даже и не знать - что задействует для хранения переменной компилятор.
Но упускается важный момент - в случае с МК вся архитектура и растактовка сделана до Вас и на ещё БОЛЕЕ НИЗКОМ уровне. А ПЛИС это и есть конструктор того самого низкого железного уровня. Так что, описание ведётся не столько алгоритма, сколько архитектуры, которая позволяет этот алгоритм реализовать. В этом плане HDL-описание итак довольно высоко поднимает разработчика относительно gate-уровня.
Кроме того, организация сигнальных путей и законов управления. В случае с std_vector_logic на него выделяются отдельные физические пути и Вы всегда можете "обратиться" к нему. С памятью, всё-таки, дело обстоит посложнее именно физически (например: первым тактом ваша схема защёлкивает у себя адрес, вторым тактом этот адрес захватывается в ДША ОЗУ и выдаются данные, третьим тактом Вы эти данные захватываете в регистр своей схемы). А голом наборе вентилей никто за Вас времянки очерёдности и эти клоки формировать не будет хотя бы потому, что их просто нет, кроме тех, что Вы сами и завели на кристалл и которыми сами полностью и управляете - куда подвести, а куда нет, где по какому фронту защёлкнуть и т.д.
Но в общем на ваш вопрос можно ответить с некоторой степенью утвердительно - работу с некоторыми узлами можно облегчить, создав специальные автоматы (драйверы, контроллеры, как хотите) и вести обращение через них.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.