Maverick_ 15 14 июля, 2010 Опубликовано 14 июля, 2010 · Жалоба Интересует как это сделать с помощью HDL языка (желательно VHDL). И существует ли она вообще начальная инициализация памяти FPGA фирмы Actel с помощью HDL языка? PS Отладочная плата. Программное обеспечение последней версии. PS PS Для FPGA фирмы Xilinx делалось просто. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 15 июля, 2010 Опубликовано 15 июля, 2010 · Жалоба что неужели никто не работал с Actel? PS помогите разобраться, плиз Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 15 июля, 2010 Опубликовано 15 июля, 2010 · Жалоба А разве $readmemh() кто-то отменял ? На вхдл-е там функцию свою ваять нужно - нету такого простого решения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 15 июля, 2010 Опубликовано 15 июля, 2010 · Жалоба Поясню для ясности Имеется ввиду инициализация внутренней памяти FPGA, чтобы после включения эту информацию можно было использовать. Для Xilinx делалось следующим образом Инициализация блочной памяти library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use std.textio.all; entity init_mem is Port ( clk : in STD_LOGIC; addr : std_logic_vector (4 downto 0); we : in STD_LOGIC; data_in : in STD_LOGIC_VECTOR (3 downto 0); data : out STD_LOGIC_VECTOR (3 downto 0)); end init_mem; architecture Behavioral of init_mem is type initmem is array(0 to 31) of bit_vector(3 downto 0); impure function InitRamFromFile (InitRamFile : in string) return initmem is FILE ram_file : text is in InitRamFile; variable line_ram : line; variable ram : initmem; begin for I in initmem'range loop readline (ram_file, line_ram); read (line_ram, ram(I)); end loop; return ram; end function; signal ram : initmem := InitRamFromFile("ram_file.txt"); signal mem_data : std_logic_vector (3 downto 0); attribute RAM_STYLE : string; attribute RAM_STYLE of ram : signal is "BLOCK"; begin process (clk, ram, mem_data) begin if clk'event and clk = '1' then if we = '1' then ram(conv_integer(addr)) <= to_bitvector(data_in); end if; mem_data <=to_stdlogicvector(ram(conv_integer(addr))); end if; data <= mem_data; end process; end Behavioral; Содержание файла «ram_file.txt», который должен находиться в каталоге проекта. 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 1011 1100 1101 1110 1111 1111 1111 Интересует подобное для Actel Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 15 июля, 2010 Опубликовано 15 июля, 2010 · Жалоба А приведённый выше пример не пашет под Actel ?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Джеймс 3 15 июля, 2010 Опубликовано 15 июля, 2010 · Жалоба А разве $readmemh() кто-то отменял ? А приведённый выше пример не пашет под Actel ?? Ну вот что писать без знакомства с проблематикой?.. что неужели никто не работал с Actel? PS помогите разобраться, плиз Со SmartFusion действительно еще никто не работал. В ProAsic, ProAsic+, ProAsic3 то, что вам нужно, было невозможно. Не забывайте, что это Flash-технология, а у Xilinx - SRAM-технология. Там, где Вы купили эту отладочную плату, есть служба технической поддержки. Задайте вопрос (только четко, а то из вашего первого сообщения даже непонятно, для моделирования это нужно или для железа), - получите ответ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 15 июля, 2010 Опубликовано 15 июля, 2010 · Жалоба 2 Джеймс Документальное подтвержение того что синплифай кушает $readmemh() без вопросов :laughing: www.actel.com page 5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andrew_ 0 30 июля, 2010 Опубликовано 30 июля, 2010 · Жалоба На момент включения питания память не может быть инициализирована. В документе ProASIC®3E Handbook стр. 310 Initializing the RAM/FIFO предлагается использовать JTAG для инициализации или самому написать блок, который загрузит данные с внешнего флеша (ну или с внутреннего, если хватит 1024 бита) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DW0 0 10 августа, 2010 Опубликовано 10 августа, 2010 (изменено) · Жалоба У актеля понятия первой инициализации вообще отсутствует, даже триггеры при подачи питания включаются как попало, и в памяти может быть мусор, поэтому при глобальном ресете с наружного пина необходимо инициализировать каждый триггер асинхронным сбросом или установкой, и память не исключение по ней тоже нужно пробегаться и записывать значения каким-нибудь автоматом. Тот ресет что есть у встроенной памяти сбрасывает только порты и не сбрасывает содержимое. так что вот так. это пока только SRAM-технология позволяет все инициализировать. Изменено 10 августа, 2010 пользователем DW0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yudin Vladimir 0 15 сентября, 2010 Опубликовано 15 сентября, 2010 · Жалоба Интересует как это сделать с помощью HDL языка (желательно VHDL). И существует ли она вообще начальная инициализация памяти FPGA фирмы Actel с помощью HDL языка? PS Отладочная плата. Программное обеспечение последней версии. PS PS Для FPGA фирмы Xilinx делалось просто. Давно в версии Libero 6.2 я делал следующим образом: -- Version: 6.2 6.2.50.1 library ieee; use ieee.std_logic_1164.all; library proasic3; entity ROMD512X8 is port(DATAA : in std_logic_vector(7 downto 0); ADDRESSA : in std_logic_vector(8 downto 0); RWA : in std_logic; BLKA : in std_logic; QA : out std_logic_vector(7 downto 0); DATAB : in std_logic_vector(7 downto 0); ADDRESSB : in std_logic_vector(8 downto 0); RWB : in std_logic; BLKB : in std_logic; QB : out std_logic_vector(7 downto 0); CLOCK : in std_logic); end ROMD512X8; architecture DEF_ARCH of ROMD512X8 is component RAM4K9 generic (MEMORYFILE:string := ""); port(ADDRA11, ADDRA10, ADDRA9, ADDRA8, ADDRA7, ADDRA6, ADDRA5, ADDRA4, ADDRA3, ADDRA2, ADDRA1, ADDRA0, ADDRB11, ADDRB10, ADDRB9, ADDRB8, ADDRB7, ADDRB6, ADDRB5, ADDRB4, ADDRB3, ADDRB2, ADDRB1, ADDRB0, DINA8, DINA7, DINA6, DINA5, DINA4, DINA3, DINA2, DINA1, DINA0, DINB8, DINB7, DINB6, DINB5, DINB4, DINB3, DINB2, DINB1, DINB0, WIDTHA0, WIDTHA1, WIDTHB0, WIDTHB1, PIPEA, PIPEB, WMODEA, WMODEB, BLKA, BLKB, WENA, WENB, CLKA, CLKB, RESET : in std_logic := 'U'; DOUTA8, DOUTA7, DOUTA6, DOUTA5, DOUTA4, DOUTA3, DOUTA2, DOUTA1, DOUTA0, DOUTB8, DOUTB7, DOUTB6, DOUTB5, DOUTB4, DOUTB3, DOUTB2, DOUTB1, DOUTB0 : out std_logic); end component; component VCC port( Y : out std_logic); end component; component GND port( Y : out std_logic); end component; signal VCC_1_net, GND_1_net : std_logic ; begin VCC_2_net : VCC port map(Y => VCC_1_net); GND_2_net : GND port map(Y => GND_1_net); ROMD512X8_R0C0 : RAM4K9 generic map(MEMORYFILE => "ROMD512X8_R0C0.mem") port map(ADDRA11 => GND_1_net, ADDRA10 => GND_1_net, ADDRA9 => GND_1_net, ADDRA8 => ADDRESSA(8), ADDRA7 => ADDRESSA(7), ADDRA6 => ADDRESSA(6), ADDRA5 => ADDRESSA(5), ADDRA4 => ADDRESSA(4), ADDRA3 => ADDRESSA(3), ADDRA2 => ADDRESSA(2), ADDRA1 => ADDRESSA(1), ADDRA0 => ADDRESSA(0), ADDRB11 => GND_1_net, ADDRB10 => GND_1_net, ADDRB9 => GND_1_net, ADDRB8 => ADDRESSB(8), ADDRB7 => ADDRESSB(7), ADDRB6 => ADDRESSB(6), ADDRB5 => ADDRESSB(5), ADDRB4 => ADDRESSB(4), ADDRB3 => ADDRESSB(3), ADDRB2 => ADDRESSB(2), ADDRB1 => ADDRESSB(1), ADDRB0 => ADDRESSB(0), DINA8 => GND_1_net, DINA7 => DATAA(7), DINA6 => DATAA(6), DINA5 => DATAA(5), DINA4 => DATAA(4), DINA3 => DATAA(3), DINA2 => DATAA(2), DINA1 => DATAA(1), DINA0 => DATAA(0), DINB8 => GND_1_net, DINB7 => DATAB(7), DINB6 => DATAB(6), DINB5 => DATAB(5), DINB4 => DATAB(4), DINB3 => DATAB(3), DINB2 => DATAB(2), DINB1 => DATAB(1), DINB0 => DATAB(0), WIDTHA0 => VCC_1_net, WIDTHA1 => VCC_1_net, WIDTHB0 => VCC_1_net, WIDTHB1 => VCC_1_net, PIPEA => GND_1_net, PIPEB => GND_1_net, WMODEA => GND_1_net, WMODEB => GND_1_net, BLKA => BLKA, BLKB => BLKB, WENA => RWA, WENB => RWB, CLKA => CLOCK, CLKB => CLOCK, RESET => VCC_1_net, DOUTA8 => OPEN , DOUTA7 => QA(7), DOUTA6 => QA(6), DOUTA5 => QA(5), DOUTA4 => QA(4), DOUTA3 => QA(3), DOUTA2 => QA(2), DOUTA1 => QA(1), DOUTA0 => QA(0), DOUTB8 => OPEN , DOUTB7 => QB(7), DOUTB6 => QB(6), DOUTB5 => QB(5), DOUTB4 => QB(4), DOUTB3 => QB(3), DOUTB2 => QB(2), DOUTB1 => QB(1), DOUTB0 => QB(0)); end DEF_ARCH; Файл ROMD512X8_R0C0.mem X00000000 X00000011 X00000110 X00001001 X00001101 X00010000 X00010011 X00010110 X00011001 и т.д. 512 раз Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться