|
|
  |
Инициализация блочной памяти, FPGA фирмы Actel |
|
|
|
Jul 15 2010, 09:21
|

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

|
Поясню для ясности Имеется ввиду инициализация внутренней памяти 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
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Jul 15 2010, 17:18
|
Местный
  
Группа: Свой
Сообщений: 462
Регистрация: 20-01-06
Пользователь №: 13 399

|
Цитата(Kuzmi4 @ Jul 15 2010, 13:05)  А разве $readmemh() кто-то отменял ? Цитата(Kuzmi4 @ Jul 15 2010, 13:24)  А приведённый выше пример не пашет под Actel ?? Ну вот что писать без знакомства с проблематикой?.. Цитата(Maverick @ Jul 15 2010, 12:08)  что неужели никто не работал с Actel? PS помогите разобраться, плиз Со SmartFusion действительно еще никто не работал. В ProAsic, ProAsic+, ProAsic3 то, что вам нужно, было невозможно. Не забывайте, что это Flash-технология, а у Xilinx - SRAM-технология. Там, где Вы купили эту отладочную плату, есть служба технической поддержки. Задайте вопрос (только четко, а то из вашего первого сообщения даже непонятно, для моделирования это нужно или для железа), - получите ответ.
|
|
|
|
|
Aug 10 2010, 15:59
|
Участник

Группа: Свой
Сообщений: 73
Регистрация: 9-08-10
Из: Украина
Пользователь №: 58 828

|
У актеля понятия первой инициализации вообще отсутствует, даже триггеры при подачи питания включаются как попало, и в памяти может быть мусор, поэтому при глобальном ресете с наружного пина необходимо инициализировать каждый триггер асинхронным сбросом или установкой, и память не исключение по ней тоже нужно пробегаться и записывать значения каким-нибудь автоматом. Тот ресет что есть у встроенной памяти сбрасывает только порты и не сбрасывает содержимое.
так что вот так.
это пока только SRAM-технология позволяет все инициализировать.
Сообщение отредактировал DW0 - Aug 10 2010, 16:00
|
|
|
|
|
Sep 15 2010, 05:25
|
Группа: Новичок
Сообщений: 9
Регистрация: 22-04-09
Пользователь №: 48 071

|
Цитата(Maverick @ Jul 14 2010, 19:13)  Интересует как это сделать с помощью 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 раз
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|