mml 0 29 ноября, 2012 Опубликовано 29 ноября, 2012 · Жалоба Еcть исходный огромный массив данных в текстовом файле в формате .coe Radix = 16; Width = 18; Data = 3efc3, 00096, 00094, ... 12345; Как средствами VHDL подключить этот файл к проекту и заполнить соответствующим образом поля gINIT_00...gINIT_3F , INITP_00...INITP_07? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stu 0 29 ноября, 2012 Опубликовано 29 ноября, 2012 · Жалоба не сталкивался с форматом .coe и не уверен, что квартус его норм хавает, поэтому самое первое, что пришло в голову из .coe сделать .mif (с помощью ms_excel) и уже обращаться по конкретным адресам в altsyncram а если .coe поддерживается квартусом, думаю предложат более простой вариант Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 29 ноября, 2012 Опубликовано 29 ноября, 2012 · Жалоба квартус его норм хаваетВы бы хоть тему прочитали, что ли... Как средствами VHDL подключить этот файл к проекту и заполнить соответствующим образом поля gINIT_00...gINIT_3F , INITP_00...INITP_07?Проще всего сгенерировать память в CoreGenerator и там указать этот файл как инициализирующий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
irum4 0 29 ноября, 2012 Опубликовано 29 ноября, 2012 · Жалоба Для симуляции - через 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"; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mml 0 29 ноября, 2012 Опубликовано 29 ноября, 2012 · Жалоба не сталкивался с форматом .coe и не уверен, что квартус его норм хавает, поэтому самое первое, что пришло в голову из .coe сделать .mif (с помощью ms_excel) и уже обращаться по конкретным адресам в altsyncram а если .coe поддерживается квартусом, думаю предложат более простой вариант 1. При чем тут квартус. В заголовке же написано, что речь о ксайлинксе. 2. .coe это специальный файл для конфигурации через корегенератор. Но мне надо инициализировать с помощью VHDL без корегенератора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 29 ноября, 2012 Опубликовано 29 ноября, 2012 (изменено) · Жалоба Здравствуйте. Простейший пример инициализации. Правда память придётся ручками сделать. 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; А привести файл к нужному формату - не так уж сложно. Изменено 29 ноября, 2012 пользователем TRILLER Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mml 0 29 ноября, 2012 Опубликовано 29 ноября, 2012 · Жалоба Плохо то, что если разбить длинные строки 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: Для имплементации - через атрибуты Я это знаю. Мне нужно автоматизировать заполнение этих длинных строк. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 29 ноября, 2012 Опубликовано 29 ноября, 2012 · Жалоба Ваш пример приведет к генерации РАМ на слайсах. А мне нужно инициализировать встроеный блок РАМ. Для определения вида памяти необходимо пользоваться соответствующими атрибутами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dima_spb 0 29 ноября, 2012 Опубликовано 29 ноября, 2012 · Жалоба Ваш пример приведет к генерации РАМ на слайсах. А мне нужно инициализировать встроеный блок РАМ. Причем таблица инициализации очень большая. А меняться она может часто. Полностью согласен! Вариант 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться