Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Реализация ОЗУ на блочной памяти на Virtex4
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Andrey_GTI
В проекте имеется 3 памяти: 2 ОЗУ и один ПЗУ, XST упорно не хочет размещать их на блочку и пихает в луты.

Можно ли принудительно заставить синтезировать память на BlockRAM ? иначе занимает пол кристалла.
andrew_b
Цитата(Andrey_GTI @ Dec 30 2008, 14:49) *
Можно ли принудительно заставить синтезировать память на BlockRAM ? иначе занимает пол кристалла.
Конечно, можно. Сначала надо прочитать туториал на xst. Там есть примеры кода.
Andrey_GTI
Описание памяти делалось по их шаблону (кнопочка с лампочкой smile.gif)
BSV
1. Воспользоваться поиском по форуму.
2. Почитать Constraints Guide

Ленивый Вы, однако... На VHDL так как-то будет:
Код
type RAM_ARRAY is array (0 to 2**ADDR_WIDTH - 1) of STD_LOGIC_VECTOR(DATA_WIDTH - 1 downto 0);
signal RAM : RAM_ARRAY;
attribute RAM_STYLE: string;
attribute RAM_STYLE of RAM : signal is "block"; -- или "distributed"
Andrey_GTI
Сейчас реализовано вот так вот.

(* bram_map="yes" *)

module RASP8192X16M16(DOUT,AD,CEN,CLK,DIN,OE,WE);


output [15:0]DOUT; // output data (read)
input CLK; // clock
input CEN; // chip enable (active low)
input WE; // write enable (active low)
input [12:0] AD; // addres of memory
input [15:0] DIN; // input data (write)
input OE;

// Only for TEST

reg [15:0] DOUT;

reg [15:0] mem [0:8191]; //4095

always @(posedge CLK)
begin
if (CEN == 1'b0) // clock enable
if (WE == 1'b1) mem [AD] <= DIN; // write operation
else
if (OE == 1'b1) DOUT <= mem [AD]; // read operation
end

endmodule

Но синтезатор пишет

INFO:Xst:2664 - HDL ADVISOR - Unit <RASP8192X16M16> : The RAM <Mram_mem> will be implemented on LUTs either because you have described an asynchronous read or because of currently unsupported block RAM features. If you have described an asynchronous read, making it synchronous would allow you to take advantage of available block RAM resources, for optimized device usage and improved timings. Please refer to your documentation for coding guidelines.

Хотя описание полностью синхронное, по одному CLK.
BSV
Может быть, в этом if (OE == 1'b1) дело, попробуйте убрать.
И вообще, запись и чтение - два независимых процесса, в один if их лучше не пихать.
Беру свои слова назад, зависит от желаемого режима работы памяти.
Andrey_GTI
Да, спасибо, уже догадался...
Andrey_GTI
Но теперь такая проблема, что память вообще не работает.... читаются нули, и ничего не записывается. Единственное, что есть в логе подозрительного

INFO:Xst:1787 - Unable to map block <RASP8192X16M16> on BRAM. Output <DOUT<15>> is not connected to a FF
Михаил_K
Цитата(Andrey_GTI @ Dec 31 2008, 12:08) *
Но теперь такая проблема, что память вообще не работает.... читаются нули, и ничего не записывается. Единственное, что есть в логе подозрительного

INFO:Xst:1787 - Unable to map block <RASP8192X16M16> on BRAM. Output <DOUT<15>> is not connected to a FF


Что то я не помню, чтобы в шаблонах Xilinx было вот это

Код
if (WE == 1'b1) mem [AD] <= DIN; // write operation
else
if (OE == 1'b1) DOUT <= mem [AD]; // read operation


Не может она работать в таком режиме. Есть лишь глобальный вход разрешения работы и вход разрешения записи. Также память производит считывание всегда, а у вас либо чтение либо запись. Поэтому синтезатор и не может ее в BRAM запихать.
Maverick
Вот пример ОЗУ на VHDL
Запись входных данных производится по положительному (нарастающему) фронту сигнала синхронизации при наличии выскокого логического уровня на входе разрешения записи. При отсутствии фронта тактового сигнала и выскоком логическом уровне на входе разрешения записи данные из ячейки, номер которой определяется состоянием сигналов на адресных входах, передаются на выходы ОЗУ. Операция чтения данных из ОЗУ выполняется также при наличии низкого логического уровня на входе разрешения записи независимо от поведения сигнала синхронизации. Первый порт предназначен только для чтения информации, хранящейся в ОЗУ. Второй порт позволяет выполнять как операции чтения, так и записи входных данных.

Описание портов:
clk − вход тактовой частоты.
we − одноразрядный вход разрешения записи;
a − 17 разрядный адресный вход первого порта;
dpra – 17 разрядный адресный вход второго порта;
di − 16 разрядный вход данных;
spo – информационный 16 разрядный выход первого порта;
dpo – информационный 16 разрядный выход второго порта;

Код
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ram1024_16 is
    Port ( clk : in std_logic;
           we : in std_logic;
           a : in std_logic_vector(16 downto 0);
           dpra : in std_logic_vector(16 downto 0);
           di : in std_logic_vector(15 downto 0);
           spo : out std_logic_vector(15 downto 0);
           dpo : out std_logic_vector(15 downto 0));
end ram1024_16;
architecture behavioral of ram1024_16 is
type ram_type is array (1023 downto 0) of std_logic_vector (15 downto 0);

signal RAM: ram_type;
signal read_a:  std_logic_vector(16 downto 0);
signal read_dpra:  std_logic_vector(16 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 behavioral;


Есть Language Templates в Xilinx ISE там есть примеры всех синтезируемых конструкций (тригеры, счетчики, мультиплексоры и т.д.) smile.gif
Waldemarius
Я так понял вы хотите использовать ресурсы блочной памяти, но не получается. В настройках Xilinx Project Navigator по умолчанию cтоит использование распределенной памяти, чтобы поменять на использование блочной памяти надо щелкнуть на главном файле проэкта, выбрать Synthesize->Properties, выбрать вкладку HDL-Options->RAM-Style->BLOCK. Может это решит проблему!
Andrey_GTI
Цитата(Waldemarius @ Jan 13 2009, 11:44) *
Я так понял вы хотите использовать ресурсы блочной памяти, но не получается. В настройках Xilinx Project Navigator по умолчанию cтоит использование распределенной памяти, чтобы поменять на использование блочной памяти надо щелкнуть на главном файле проэкта, выбрать Synthesize->Properties, выбрать вкладку HDL-Options->RAM-Style->BLOCK. Может это решит проблему!


Спасибо, но это все не помогало, дело было в доп. сигнале OE, который несовместим с шаблоном описания для блочной памяи.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.