Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Инициализация блочной памяти
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Maverick
Интересует как это сделать с помощью HDL языка (желательно VHDL).
И существует ли она вообще начальная инициализация памяти FPGA фирмы Actel с помощью HDL языка?
help.gif
PS Отладочная плата. Программное обеспечение последней версии.
PS PS Для FPGA фирмы Xilinx делалось просто.
Maverick
что неужели никто не работал с Actel?

PS помогите разобраться, плиз
Kuzmi4
А разве $readmemh() кто-то отменял ?

На вхдл-е там функцию свою ваять нужно - нету такого простого решения.
Maverick
Поясню для ясности
Имеется ввиду инициализация внутренней памяти 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
А приведённый выше пример не пашет под Actel ??
Джеймс
Цитата(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-технология.
Там, где Вы купили эту отладочную плату, есть служба технической поддержки. Задайте вопрос (только четко, а то из вашего первого сообщения даже непонятно, для моделирования это нужно или для железа), - получите ответ.
Kuzmi4
2 Джеймс
Документальное подтвержение того что синплифай кушает $readmemh() без вопросов laughing.gif
www.actel.com
page 5
Andrew_
На момент включения питания память не может быть инициализирована.
В документе ProASIC®3E Handbook стр. 310 Initializing the RAM/FIFO предлагается использовать JTAG для инициализации или самому написать блок, который загрузит данные с внешнего флеша (ну или с внутреннего, если хватит 1024 бита)
DW0
У актеля понятия первой инициализации вообще отсутствует, даже триггеры при подачи питания включаются как попало, и в памяти может быть мусор, поэтому при глобальном ресете с наружного пина необходимо инициализировать каждый триггер асинхронным сбросом или установкой, и память не исключение по ней тоже нужно пробегаться и записывать значения каким-нибудь автоматом. Тот ресет что есть у встроенной памяти сбрасывает только порты и не сбрасывает содержимое.

так что вот так.

это пока только SRAM-технология позволяет все инициализировать.
YVA
Цитата(Maverick @ Jul 14 2010, 19:13) *
Интересует как это сделать с помощью HDL языка (желательно VHDL).
И существует ли она вообще начальная инициализация памяти FPGA фирмы Actel с помощью HDL языка?
help.gif
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 раз


Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.