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

Инициализация блочной памяти

Интересует как это сделать с помощью HDL языка (желательно VHDL).

И существует ли она вообще начальная инициализация памяти FPGA фирмы Actel с помощью HDL языка?

:help:

PS Отладочная плата. Программное обеспечение последней версии.

PS PS Для FPGA фирмы Xilinx делалось просто.

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


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

что неужели никто не работал с Actel?

 

PS помогите разобраться, плиз

 

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


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

А разве $readmemh() кто-то отменял ?

 

На вхдл-е там функцию свою ваять нужно - нету такого простого решения.

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


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

Поясню для ясности

Имеется ввиду инициализация внутренней памяти 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

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


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

А разве $readmemh() кто-то отменял ?

А приведённый выше пример не пашет под Actel ??

Ну вот что писать без знакомства с проблематикой?..

 

 

что неужели никто не работал с Actel?

PS помогите разобраться, плиз

Со SmartFusion действительно еще никто не работал. В ProAsic, ProAsic+, ProAsic3 то, что вам нужно, было невозможно. Не забывайте, что это Flash-технология, а у Xilinx - SRAM-технология.

Там, где Вы купили эту отладочную плату, есть служба технической поддержки. Задайте вопрос (только четко, а то из вашего первого сообщения даже непонятно, для моделирования это нужно или для железа), - получите ответ.

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


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

2 Джеймс

Документальное подтвержение того что синплифай кушает $readmemh() без вопросов :laughing:

www.actel.com

page 5

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


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

На момент включения питания память не может быть инициализирована.

В документе ProASIC®3E Handbook стр. 310 Initializing the RAM/FIFO предлагается использовать JTAG для инициализации или самому написать блок, который загрузит данные с внешнего флеша (ну или с внутреннего, если хватит 1024 бита)

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


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

У актеля понятия первой инициализации вообще отсутствует, даже триггеры при подачи питания включаются как попало, и в памяти может быть мусор, поэтому при глобальном ресете с наружного пина необходимо инициализировать каждый триггер асинхронным сбросом или установкой, и память не исключение по ней тоже нужно пробегаться и записывать значения каким-нибудь автоматом. Тот ресет что есть у встроенной памяти сбрасывает только порты и не сбрасывает содержимое.

 

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

 

это пока только SRAM-технология позволяет все инициализировать.

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

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


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

Интересует как это сделать с помощью HDL языка (желательно VHDL).

И существует ли она вообще начальная инициализация памяти FPGA фирмы Actel с помощью HDL языка?

:help:

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 раз

 

 

 

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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