FPGA RAM/SRAM в VHDL

Сегодня у меня закончились ворота на моем Xylinx Spartan 3 (Basys2 от Digilent) FPGA.

Это не было для меня неожиданностью, так как я реализовал массив 8 бит x 2048 для использования в качестве буфера FIFO.

Код:type MEMORY is array(0 to (MEM_L - 1)) of std_logic_vector(7 downto 0);

где MEM_Lцелое число, значение 2048.

Я прочитал краткое описание продукта и, насколько я понимаю, на ПЛИС серии Spartan 3E имеется 72 КБ двунаправленной оперативной памяти.

Однако я не знаю, как его использовать (запрограммировать) с помощью VHDL. Как мне объявить, что я хочу, чтобы некоторые данные хранились в оперативной памяти?

Первоначально я предполагал, что использование оперативной памяти зависит от компилятора (инструментов синтезатора и реализации) и что я не мог контролировать ее непосредственное использование, однако я подозреваю, что ошибался в этом предположении, потому что процесс реализации не удался из-за мой FIFO слишком велик для количества поддерживаемых ворот. (Приблизительно 100 тыс. ворот.)

Я должен добавить, что я не смог найти ответ через Google, возможно, я не совсем знал, что искать?

РЕДАКТИРОВАТЬ: Это должно было сказать 78 КБ оперативной памяти, 78000 бит.

Ответы (2)

Самое простое, что можно сделать (IMO), — это напрямую создать экземпляр примитива устройства в вашем VHDL. Таким образом, вы не полагаетесь на инструменты для определения блочной оперативной памяти. В ISE перейдите в «Правка» -> «Языковые шаблоны», и вы сможете открыть шаблон. (Конечно, вы захотите выбрать Spartan-3E, хотя я думаю, что примитив в этом случае тот же.)

выбор примитива устройства

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

Другим вариантом является использование Core Generator, который, возможно, более «удобен для пользователя» в настройке, но медленный во время начального синтеза. Вы также можете сгенерировать весь FIFO таким образом.

Возможно, кто-то может рассказать о методах вывода блочной ОЗУ.

Ах, я вижу, где я могу найти информацию о том, как использовать эти устройства? Я предполагаю, что сначала создаю тип ОЗУ, делая что-то вроде signal my_ram: RAMB16_S9_S9?
Вам придется переориентировать свое мышление, потому что это модуль, а не сигнальная сущность. В шаблоне есть инструкция по использованию. Также взгляните на XAPP463.
Я следовал инструкциям — скопировал код под строкой «скопировать ниже сюда» и вставил его в раздел архитектуры. При синтезе появляется ошибка: ERROR:HDLParsers:164 - Line 83. parse error, unexpected IDENTIFIERЭто связано со строкой: за RAMB16_S9_S9_inst : RAMB16_S9_S9которой следует generic map ( ...Любые идеи?
@ user3728501, похоже на синтаксическую ошибку. Но убедитесь, что вы также вставили строки библиотеки UNISIM.
Да, я сделал это, буквально просто скопировал это, но я попробую еще раз

XST может автоматически определять блоки оперативной памяти.

Прочтите Xilinx «Руководство пользователя XST» ref. UG627

«Двухпортовое ОЗУ с синхронным чтением (сквозное чтение)»

architecture syn of rams_11 is
    type ram_type is array (63 downto 0) of std_logic_vector (15 downto 0);
    signal RAM : ram_type;
    signal read_a : std_logic_vector(5 downto 0);
    signal read_dpra : std_logic_vector(5 downto 0);
begin
    process (clk)
    begin
        if (clk’event and clk = ’1’) then
            if (we = ’1’) then
                RAM(conv_integer(a)) <= di;
            end if;
            read_a <= a;
            read_dpra <= dpra;
        end if;
    end process;
    spo <= RAM(conv_integer(read_a));
    dpo <= RAM(conv_integer(read_dpra));
end syn;

Также есть решение, когда порт чтения и записи имеют разные часы. BlockRAM — это зарегистрированная память, поэтому вы не можете читать ее содержимое асинхронно. Также может быть несколько опций для проверки в диалоговом окне синтеза ISE...