|
|
  |
Реализация ОЗУ на блочной памяти на Virtex4, Синтезируется на LUTы, как принудить на BlockRAM |
|
|
|
Dec 30 2008, 10:49
|
Участник

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

|
В проекте имеется 3 памяти: 2 ОЗУ и один ПЗУ, XST упорно не хочет размещать их на блочку и пихает в луты.
Можно ли принудительно заставить синтезировать память на BlockRAM ? иначе занимает пол кристалла.
|
|
|
|
|
Dec 30 2008, 11:15
|
Участник

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

|
Описание памяти делалось по их шаблону (кнопочка с лампочкой  )
Сообщение отредактировал Andrey_GTI - Dec 30 2008, 11:15
|
|
|
|
|
Dec 30 2008, 12:50
|

Знающий
   
Группа: Свой
Сообщений: 541
Регистрация: 11-04-05
Из: Москва
Пользователь №: 4 045

|
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"
--------------------
Дурак, занимающий высокий пост, подобен человеку на вершине горы - все ему кажется маленьким, а всем остальным кажется маленьким он сам. /Законы Мерфи/
|
|
|
|
|
Dec 30 2008, 12:51
|
Участник

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

|
Сейчас реализовано вот так вот.
(* 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.
Сообщение отредактировал Andrey_GTI - Dec 30 2008, 12:52
|
|
|
|
|
Dec 30 2008, 13:04
|
Участник

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

|
Да, спасибо, уже догадался...
|
|
|
|
|
Dec 31 2008, 09:08
|
Участник

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

|
Но теперь такая проблема, что память вообще не работает.... читаются нули, и ничего не записывается. Единственное, что есть в логе подозрительного
INFO:Xst:1787 - Unable to map block <RASP8192X16M16> on BRAM. Output <DOUT<15>> is not connected to a FF
|
|
|
|
|
Jan 2 2009, 18:43
|
Знающий
   
Группа: Свой
Сообщений: 552
Регистрация: 29-02-08
Пользователь №: 35 481

|
Цитата(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 запихать.
|
|
|
|
|
Jan 2 2009, 19:38
|

я только учусь...
     
Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839

|
Вот пример ОЗУ на 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 там есть примеры всех синтезируемых конструкций (тригеры, счетчики, мультиплексоры и т.д.)
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Jan 13 2009, 08:44
|
Участник

Группа: Новичок
Сообщений: 68
Регистрация: 2-03-07
Пользователь №: 25 817

|
Я так понял вы хотите использовать ресурсы блочной памяти, но не получается. В настройках Xilinx Project Navigator по умолчанию cтоит использование распределенной памяти, чтобы поменять на использование блочной памяти надо щелкнуть на главном файле проэкта, выбрать Synthesize->Properties, выбрать вкладку HDL-Options->RAM-Style->BLOCK. Может это решит проблему!
|
|
|
|
|
Jan 13 2009, 08:53
|
Участник

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

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