Jump to content

    
Sign in to follow this  
Muscat

Работа с флэш-памятью

Recommended Posts

Maverick,

1,024 bits of user flash memory не спасут отца русской демократии.

Я по-моему достаточно ясно сформулировал свой вопрос выше.

 

Вы написали, что не знали о существовании flash memory в ПЛИС - я указал источник где ее увидеть. Вопросы? Или не нужно было показывать?

 

PS Отец русской демократии волен делать как ему хочется...

Share this post


Link to post
Share on other sites
Например здесь - смотрим таблицу.

 

 

Я пока использую - SmartGen RAM.

Это на стр. 78 документа "Actel HDL Coding Style Guide" и показано...

 

PS Я писал письмо по этому поводу в Actel. Ответил, что вышлет описание на HDL.

 

 

Достаточно странно отвечать на мой вопрос моей же цитатой, не находите?

 

Как объявить память я понял. Вопрос в том, каким образом задать это значение по умолчанию. Я привел 3 варианта, которые я пока вижу, хочу узнать как поступали другие. Опробовать смогу только в четверг.

Share this post


Link to post
Share on other sites
_ANDREW, я тоже уже склоняюсь к тому, чтобы попробовать положить все на блочную память.

Как это лучше сделать в HDL коде?

1) Внутри архитектуры сигнала объявить сигнал типа массив с предварительным заданием значений

2) Внутри процесса объявить переменную, с предварительным заданием

3) Оставить все, как есть у меня сейчас - массив входных данных объявлен константой в упаковке

 

Я всегда делаю 1. вот небольшой пример

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity ROM is
port (CLK : in std_logic;
     EN : in std_logic;
     ADDR : in std_logic_vector(15 downto 0);
     DATA : out std_logic_vector(31 downto 0));
end ROM;

architecture syn of ROM is





   type rom_type is array (0 to 1007) of std_logic_vector (31 downto 0);                 
   signal ROM : rom_type:= (


X"00000000",   X"00040050",   X"000d00c0",   X"00cc01f0",   X"00ea0180",   X"01bb0080",   X"01aa0090",   X"01720120",
X"014d0100",   X"011001f1",   X"010a00c1",   X"00000010",   X"00110160",   X"00710200",   X"00810110",   X"008901a0",
X"008d0111",   X"00b801e0",   X"00c10112",   X"01cb0230",   X"016c0091",   X"015a0150",   X"00000020",   X"00130181",
X"004d0210",   X"006800c2",   X"006c0140",   X"00cc0092",   X"01e401d0",   X"01c00130",   X"01a201e1",   X"01630093",
X"01200141",   X"00000030",   X"001200d0",   X"001901c0",   X"00620231",   X"00680211",   X"007800a0",   X"009d0142",
X"00ad00f0",   X"01d401c1",   X"01b30220",   X"01740190",   X"00000040",   X"00120212",   X"00310131",   X"00550170",
X"009b0221",   X"00bd00d1",   X"00e300a1",   X"01400232",   X"012b0041",   X"012d0070",   X"01220171",   X"00000051"

-- и так далее	

);                        
attribute ROM_STYLE : string;   ---атрибуты для того чтобы при синтезе распределение было в блоковую память
attribute ROM_STYLE of ROM: signal is "block";

begin



   process (CLK)
   begin
       if (CLK'event and CLK = '1') then
           if (EN = '1') then
		DATA <= ROM(conv_integer(ADDR));
           end if;
       end if;
   end process;

end syn;

у Вас будут скорее всего другие атрибуты, или можно обойтись без них, с помощью настроек синтеза..

Edited by _ANDREW

Share this post


Link to post
Share on other sites
Muscat

Сравните то что в документе на стр. 78 и то что привел _ANDREW описание на VHDL правда для XILINX.

 

на 78 странице память подключена как примитив, а вот на стр 76, внизу (Register-Based Dual-Port SRAM) подключение памяти как синтезируемого компонента... и практически тоже самое что и в моём коде (только я прописал ROM с инициализированными значениями). Честно говоря, думаю что отличия в архитектуре у разных компаний не велики..

и я обычно не подключаю блоки как примитивы, лучше писать на чистом языке, с настройкой синтеза атрибутами, чем лепить примитивы, и каждый раз переделывать проект под разные микросхемы.

Share this post


Link to post
Share on other sites
на 78 странице память подключена как примитив, а вот на стр 76, внизу (Register-Based Dual-Port SRAM) подключение памяти как синтезируемого компонента... и практически тоже самое что и в моём коде (только я прописал ROM с инициализированными значениями). Честно говоря, думаю что отличия в архитектуре у разных компаний не велики..

и я обычно не подключаю блоки как примитивы, лучше писать на чистом языке, с настройкой синтеза атрибутами, чем лепить примитивы, и каждый раз переделывать проект под разные микросхемы.

Правильно!

Я хотел показать эту разницу Muscat - Вы опередили с ответом :)

PS У меня не получилось

... лучше писать на чистом языке, с настройкой синтеза атрибутами, ...

для ПЛИС фирмы Actel так описать блочную память. Регистровая память - не проблема. Из-за этого я и соответствующий вопрос и задал...

PS PS SmartGen RAM - это программа, которая генерирует макрос RAM памяти для ПЛИС, типа CoreGenerator у Xilinx

Share this post


Link to post
Share on other sites
PS У меня не получилось для ПЛИС фирмы Actel так описать блочную память.

 

а почему не получилось??? синтезатор ругается?? каким Вы синтезатором пользуетесь??

Share this post


Link to post
Share on other sites

пробовал использовать атрибуты синтеза, делал аккурат по образцу из хелпа

 

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

library synplify;


entity ROM is
port (CLK : in std_logic;
EN : in std_logic;
ADDR : in std_logic_vector(6 downto 0);
DATA : out std_logic_vector(6-1 downto 0));
end ROM;

architecture syn of ROM is

-- mem is the signal that defines the RAM

type MEM is array (0 to 127) of std_logic_vector (6-1 downto 0);

signal ROM : MEM:=("000000",.................,"000000");

attribute syn_ramstyle : string;
attribute syn_ramstyle of ROM : signal is "block_ram";

 

Синтезировал кусок кода из coding Style Guide. синтезатор продолжал все делать на регистрах. Единственный рабочий способ, тот о котором говорил Maverick, использовать coreGen. но это какой то извратский способ. Написал письмо в тех поддержку. Жду ответа.

Share this post


Link to post
Share on other sites
Синтезировал кусок кода из coding Style Guide. синтезатор продолжал все делать на регистрах.
Видимо способ использования этой памяти вами не позволил синтезатору поместить ее в BRAM. Какие нибудь warning'и в процессе синтеза были? В настройках синтезатора не запрещено синтезировать BRAM?

 

Share this post


Link to post
Share on other sites
В настройках синтезатора не запрещено синтезировать BRAM?

 

Помню был экзамен по курсу приемников, паренька спросили про выравниватель спектра. Он затормозил, понял что ничего не помнит про принципы работы, начал на ходу придумывать узкополосные фильтры, на что преподаватель прервал его и спокойно так ручкой прочетрил линию по спектру "вот так он его выравнивает".

Если бы я нашел пункт меню "Не использовать ячейки RAM" я обратил на это внимание =)

 

Как то плавно тема скатилась в объявление оперативной памяти.

Никаких других рабочих способов, кроме использования CoreGEN не нашлось, так что выложу тут его полностью, авось кому пригодится. Итак

 

1) Объявляем наше Entity, к которому в дальнейшем будем обращаться.

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity ram32_16 is 
port (WAddress, RAddress:in std_logic_vector(4 downto 0);
Data : in std_logic_vector (15 downto 0);
WClock, RClock,WE,RE:in std_logic;
Q :out std_logic_vector (15 downto 0));
end ram32_16;

architecture rtl of ram32_16 is
component ram
port (Data : in std_logic_vector (15 downto 0);
WE : in std_logic;
RE : in std_logic;
WClock : in std_logic;
RClock : in std_logic;
WAddress : in std_logic_vector (4 downto 0);
RAddress : in std_logic_vector (4 downto 0);
Q:  out std_logic_vector (15 downto 0)
);
end component;
begin
R_32_16: ram
port map (Data => Data, 
WE => WE, 
WAddress => WAddress, 
RE => RE, 
RAddress => RAddress, 
WClock => WClock,
RClock => RClock,
Q => Q);
end rtl;
-- RAM.vhd

 

2) Генерируем Two-Port Memmory. В либеро IDE справа внизу закладка Cores.

RAM.png

 

3)Собсно все, синтезируем.

RAM_RTL.png

 

Но первый вопрос никуда не делся. Сейчас я храню 128 тестовых байт по 6 бит внутрях самой ПЛИС, ясно что этот метод подходит только на начальных этапах отладки.

Поэтому вовзаращаясь к первоначальной теме - как работать с flash-памятью?

Есть ли у кого примеры?

Share this post


Link to post
Share on other sites

Пришел ответ от службы технической поддержки, огромное спасибо Карпову Сергею!

 

Память синтезируется в виде блоков при использовании атрибута

type mem_type is array (DATA_DEPTH downto 0) of std_logic_vector (7 downto 0);
    signal mem: mem_type;

    attribute syn_ramstyle : string;
    attribute syn_ramstyle of mem : signal is [b]"no_rw_check"[/b];

Атрибут block_ram используется только для семейств ProASIC Plus.

 

 

Share this post


Link to post
Share on other sites
Поэтому вовзаращаясь к первоначальной теме - как работать с flash-памятью?

Есть ли у кого примеры?

Конкретно на ваш кит - вряд ли, уж больно нераспространенное (по равнению с Altera & Xilinx) семейство.

 

Если вам нужно только чтение - то работать так же, как с SRAM (с ее чтением насколько я помню у вас проблем не было)

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this