Перейти к содержанию
    

Как инициализировать RAM блок Xilinx

Еcть исходный огромный массив данных в текстовом файле в формате .coe

Radix = 16;

Width = 18;

Data =

3efc3,

00096,

00094,

...

12345;

Как средствами VHDL подключить этот файл к проекту и заполнить соответствующим образом поля gINIT_00...gINIT_3F , INITP_00...INITP_07?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не сталкивался с форматом .coe и не уверен, что квартус его норм хавает, поэтому самое первое, что пришло в голову из .coe сделать .mif (с помощью ms_excel) и уже обращаться по конкретным адресам в altsyncram

 

а если .coe поддерживается квартусом, думаю предложат более простой вариант

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

квартус его норм хавает
Вы бы хоть тему прочитали, что ли...

 

Как средствами VHDL подключить этот файл к проекту и заполнить соответствующим образом поля gINIT_00...gINIT_3F , INITP_00...INITP_07?
Проще всего сгенерировать память в CoreGenerator и там указать этот файл как инициализирующий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для симуляции - через generic map:

ram_1024_x_18: RAMB16_S18

--synthesis translate_off

--INIT values repeated to define contents for functional simulation

generic map ( INIT_00 => X"00560074006DCD06CD010213025B01F1011B01C000FB02A0028400230E08C001",

...

INIT_3F => X"43FE800100000000000000000000000000000000000000000000000000000000",

INITP_00 => X"239288A22236CCDBCCCCC8DA220CDA333238CCC88CCC883D234FFFFFFE3FFFF3",

...

INITP_07 => X"F000000000000000000000000000000000000000000000000000000000000000")

--synthesis translate_on

port map( .....

Для имплементации - через атрибуты

-- Attributes to define ROM contents during implementation synthesis.

-- The information is repeated in the generic map for functional simulation

--

attribute INIT_00 : string;

...

attribute INIT_3F : string;

attribute INITP_00 : string;

...

attribute INITP_07 : string;

--

-- Attributes to define ROM contents during implementation synthesis.

--

attribute INIT_00 of ram_1024_x_18 : label is "00560074006DCD06CD010213025B01F1011B01C000FB02A0028400230E08C001";

...

attribute INIT_3F of ram_1024_x_18 : label is "43FE800100000000000000000000000000000000000000000000000000000000";

attribute INITP_00 of ram_1024_x_18 : label is "239288A22236CCDBCCCCC8DA220CDA333238CCC88CCC883D234FFFFFFE3FFFF3";

...

attribute INITP_07 of ram_1024_x_18 : label is "F000000000000000000000000000000000000000000000000000000000000000";

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не сталкивался с форматом .coe и не уверен, что квартус его норм хавает, поэтому самое первое, что пришло в голову из .coe сделать .mif (с помощью ms_excel) и уже обращаться по конкретным адресам в altsyncram

 

а если .coe поддерживается квартусом, думаю предложат более простой вариант

1. При чем тут квартус. В заголовке же написано, что речь о ксайлинксе.

2. .coe это специальный файл для конфигурации через корегенератор. Но мне надо инициализировать с помощью VHDL без корегенератора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте. Простейший пример инициализации. Правда память придётся ручками сделать.

 

type ram_type is array (0 to 7) of std_logic_vector(7 downto 0);

signal ram : ram_type :=

(

"00000000",

"00000001",

"00000011",

"00000001",

"00000001",

"00000001",

"00000001",

"10000001");

 

signal data : STD_LOGIC_VECTOR (7 downto 0);

 

begin

 

process(clka)

begin

if (clka = '1' and clka'event) then

if ena = '1' then

ram(conv_integer(addra)) <= dia;

end if;

end if;

end process;

 

process(clkb)

begin

if (clkb = '1' and clkb'event) then

if enb = '1' then

data <= ram(conv_integer(addrb));

end if;

end if;

end process;

 

dob <= data;

 

А привести файл к нужному формату - не так уж сложно.

Изменено пользователем TRILLER

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Плохо то, что если разбить длинные строки INIT_NN на части по четыре 16чных знака, то окажется, что

инициализация идет в обратном порядке.

 

Пробовал изменить порядок операторами сдвига, как в примере ниже. Операторы сдвига не работают. В чем моя ошибка использования

операторов сдвига?

 

 

INIT_00 => (X"0001" ror 240)& --0

(X"0002" ror 224)&

(X"0003" ror 208)&

(X"0004" ror 192)&

(X"0005" ror 176)&

(X"0000" ror 160)&

(X"0000" ror 144)&

(X"0000" ror 128)&

(X"0000" rol 128)&

(X"0000" rol 144)&

(X"000a" rol 160)&

(X"000b" rol 176)&

(X"000c" rol 192)&

(X"000d" rol 208)&

(X"000e" rol 224)&

(X"000f" rol 240) --15

 

 

Здравствуйте. Простейший пример инициализации. Правда память придётся ручками сделать.

Ваш пример приведет к генерации РАМ на слайсах. А мне нужно инициализировать встроеный блок РАМ.

Причем таблица инициализации очень большая. А меняться она может часто.

 

Для симуляции - через generic map:

Для имплементации - через атрибуты

Я это знаю.

Мне нужно автоматизировать заполнение этих длинных строк.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ваш пример приведет к генерации РАМ на слайсах. А мне нужно инициализировать встроеный блок РАМ.

Для определения вида памяти необходимо пользоваться соответствующими атрибутами.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ваш пример приведет к генерации РАМ на слайсах. А мне нужно инициализировать встроеный блок РАМ.

Причем таблица инициализации очень большая. А меняться она может часто.

Полностью согласен!

Вариант 1. Что вам мешает сгенерить (вкоргене) необходиму память, а потом её использовать в вашей программе. Подключить её. Это так кретично, именно описать?

 

Вариант 2. Могу ошибаться , но мне кажется это именно то что жаждет автор темы=)

 

 -- The libraries ieee.std_logic_unsigned and std.textio will need to be included
-- with this example
-- The following code will infer a Single port Block RAM and initialize it using a FILE

-- Place the following code before the begin of the architecture

   type <ramtype> is array(0 to <ram_width>) of bit_vector(<ram_addr_bits> downto 0);    
   impure function <ram_function_name> (<ram_file_name> : in string) return <ramtype> is                                                   
      FILE <ram_file>         : text is in <ram_file_name>;                       
      variable <line_name> : line;                                 
      variable <ram_name>       : <ramtype>;                                      
   begin                                                        
      for I in <ramtype>'range loop                                  
          readline (ram_file>, <line_name>);                             
          read (<line_name>, <ram_name>(I));                                  
      end loop;                                                    
      return <ram_name>;                                                  
   end function;                                                

   signal <ram_name> : <ramtype> := <ram_function_name>("<file_name>");

-- Place the following after the begin
begin                                                        

   process (<clock>)                                                
   begin                                                        
      if <clock>'event and <clock> = '1' then                              
         if <write_enable> = '1' then                                             
            <ram_name>(conv_integer(<address>)) <= to_bitvector(<data_in>);         
         end if;                                                      
            <data_out> <= to_stdlogicvector(<ram_name>(conv_integer(<address>)));      
      end if;                                                      
   end process;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...