Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с флэш-памятью
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Muscat
Те, кто видел мои прошлые темы, наверное уже догадался, что я снова про декодер Витерби :-)

Я дописал HDL код, погонял его, все работает Ок. Перехожу к синтезу и отладке в железке.
И возникает вот какой вопрос.

Последовательность из демодулятора для проверки декодера я моделирую в матлабе, записать их можно в каком угодно виде.
Сейчас я объявил их в виде константы в упаковке
Код
type Ara is array (NATURAL RANGE <>) of std_logic_vector (Input_Bits-1 downto 0);
constant InP: Ara:=("011111","000111","000001","101000",..............................,"000000");


Далее описал генератор, который читает эти данные и выдает на кодер. Все работает Ок.
Теперь вопрос, каким образом тестировать реальную ПЛИС

Имеется отладочная плата
http://www.actel.com/products/hardware/dev...sic3l.aspx#docs
На ней есть встроенная флэш-память, есть 2 USB порта, один для программирования, вторым собсно можно пользоваться.

У меня нет никакого опыта в работе с флэш-память, в книгах тоже пока ничего не нашел.
Подскажите какой нибудь материал по тому, как работать с памятью? Я это вижу так, что предварительно во флэш записываются кодированные символы, затем небольшой блок внутри самого ПЛИСа обращается к этой памяти и подает данные на вход кодера. Как это сделать? Ткните пальцем что ли.

Вариант второй, с использованием порта. Распайку ног нашел, но вот каким образом с компьютера подавать символы на этот порт? Как там всякие прерывания и прочие радости? Можно ли делать это из среды Матлаб или САПРа ПЛИС?
Спасибо
XVR
Все зависит от способа подключения FLASH к FPGA. С USB лучше не связываться - там парой проводов не обойтись, понадобится целый софтверный стек (или хардверный - для настоящих мазохистов smile.gif )
Насколько я понял по беглому взгляду на ссылку, у FPGA есть интегрированный Cortex? Если да, то проще будет заливать данные из него
Muscat
Нашел программу для заливки данных во флэш. Уже хорошо.
Теперь понять бы как научиться читать флэшку из ПЛИСа
XVR
Цитата(Muscat @ Nov 3 2010, 20:20) *
Теперь понять бы как научиться читать флэшку из ПЛИСа
Силой мысли 1111493779.gif Ту на форуме далеко не все телепаты и так же не знатоки девбоардов от Actel, что бы наизусть помнить схему подключения флешки в FPGA на вашей борде. Может вы все таки озвучите, как оно подключено?

Muscat
Прошу прощения, я не обратил внимание, что по приведенной выше ссылке документация доступная только после регистрации.

Разводка ног памяти
http://dl.dropbox.com/u/2827213/Different/...heets/Flash.png
Схематик-лист
http://dl.dropbox.com/u/2827213/Different/..._KIT_SCS_SS.pdf
(Распайка флэш - лист 3, секция B-5)

Мануал на весь кит
http://dl.dropbox.com/u/2827213/Different/...uide%20v1.4.pdf

Ман на флэшку
http://dl.dropbox.com/u/2827213/Different/...Flash%20J3D.pdf

В общих чертах становится понятно, но не ясен механизм. С оперативной памятью более менее ясно - подводится счетчик, выставляется WE и пишем. А тут сигналы, назначение которых не вполне ясно.
Я еще конечно покопаюсь, но думаю, что кто то уже решал подобную задачу, хотелось бы почитать какую нибудь статью про практику работы с флэш-памятью и примерами кода.
XVR
Посмотрел.
Цитата
В общих чертах становится понятно, но не ясен механизм.
Механизм подробно описан в DS на флешку (глава 9 и приложение A). В двух словах - читается как обычная SRAM память. Пишется с помощью специальных серий обычных записей и чтений (что и куда писать описано в DS). Перед записью необходимо стереть блок/сектор (так же спец. последовательностью записей/чтений)
Цитата
А тут сигналы, назначение которых не вполне ясно.
Это какие например? По моему там все кристально ясно:
FLASH_RST_N - Сброс управляющих схем флэша (рекомендуется подавать вначале работы)
FLASH_LCE_N - Выборка м/сх (сюда нужно подать 0, что бы данный флэш откликался на следующие сигналыsmile.gif
FLASH_WE_N - Запись (нулем)
FLASH_OE_N - Чтение (нулем)
MEM_ADDR - Шина адреса
MEM_DATA - Шина данных



Да, по замыслу авторов борды FLASH вместе с SRAM подключался ко встроенному Cortex'у
Muscat
А что такое Cortex?
_ANDREW
Muscat, я не тестировал декодер Витерби, и с Actel не работал, но имеется небольшой опыт тестирования других декодеров на Virtex5...
Честно, я не вникал в архитектуру Actel, но в Virtex есть блочная память, думаю она есть и у Actel. так вот, я всегда использовал для теста эту самую память...
Организую её как ROM и либо файлом, либо из vhd файла определяю начальные значения ячеек, а потом просто счётчиком по порядку перебираю ячейки...
но всё это получится если длина кодового слова у Вас вместится в неиспользуемую память...
И, если не секрет, для каких кодов Витерби делаете?? А то у меня тоже этот тип в дальнейшем, похоже, намечается...
Maverick
Цитата(Muscat @ Nov 7 2010, 17:20) *
А что такое Cortex?

Ответ здесь (Cortex-M1) и здесь(Cortex-M3)
XVR
Цитата(Muscat @ Nov 7 2010, 18:20) *
А что такое Cortex?
Встроенный в FPGA процессор
Muscat
Про кортекс да,хорош вопрос был, вчера уже мозги туго соображали. В любом случае спасибо за ссылки =)

_ANDREW, я тоже уже склоняюсь к тому, чтобы попробовать положить все на блочную память.
Как это лучше сделать в HDL коде?
1) Внутри архитектуры сигнала объявить сигнал типа массив с предварительным заданием значений
2) Внутри процесса объявить переменную, с предварительным заданием
3) Оставить все, как есть у меня сейчас - массив входных данных объявлен константой в упаковке

Насколько я помню из описаний, синтезатор игнорирует все предварительные задания сигналов вида
Код
signal A: std_logic_vector(2downto0) :="111";


Кодер стандартный 7(133,171), реализация алгоритма на трейбеке (меня тут помнится уверяли, что трейкбек обязателен, так вот если что трейбек это просто один из вариантов реализации), мягкие решения по 3 бита, глубина 64.
Maverick
Цитата(Muscat @ Nov 8 2010, 12:42) *
Про кортекс да,хорош вопрос был, вчера уже мозги туго соображали. В любом случае спасибо за ссылки =)

_ANDREW, я тоже уже склоняюсь к тому, чтобы попробовать положить все на блочную память.
Как это лучше сделать в HDL коде?
1) Внутри архитектуры сигнала объявить сигнал типа массив с предварительным заданием значений
2) Внутри процесса объявить переменную, с предварительным заданием
3) Оставить все, как есть у меня сейчас - массив входных данных объявлен константой в упаковке

Насколько я помню из описаний, синтезатор игнорирует все предварительные задания сигналов вида
Код
signal A: std_logic_vector(2downto0) :="111";


Кодер стандартный 7(133,171), реализация алгоритма на трейбеке (меня тут помнится уверяли, что трейкбек обязателен, так вот если что трейбек это просто один из вариантов реализации), мягкие решения по 3 бита, глубина 64.

Как Вы будете в HDL коде описывать блочную память для ПЛИС Actel? Меня также интересует описание для Flash и SRAM памяти, которые имеются в ПЛИС. Примеры описаний...
PS Мои попытки успехом не увенчались...
XVR
Цитата
я тоже уже склоняюсь к тому, чтобы попробовать положить все на блочную память.
Блочная память живет ВНУТРИ FPGA, использовать в ее качестве внешнюю FLASH или SRAM не получится. Если вам хватит ее объема, то вам повезло smile.gif
Muscat
Описание блочной RAM памяти присутствует в CodingStyle Guide.
http://dl.dropbox.com/u/2827213/Different/...yle%20Guide.pdf
Страница 78
Если что, то видя большой блок триггерной памяти, синтезатор все равно делает его на встроенной RAM.

О встроенной в ПЛИС флэш памяти не слышал, я хотел заюзать ту мелкосхему флэш, которая уже стоит на отладочной плате.

Так как объявить значение RAM?
Maverick
Цитата(Muscat @ Nov 8 2010, 15:37) *
О встроенной в ПЛИС флэш памяти не слышал, я хотел заюзать ту мелкосхему флэш, которая уже стоит на отладочной плате.

Например здесь - смотрим таблицу.

Цитата(Muscat @ Nov 8 2010, 15:37) *
Так как объявить значение RAM?

Я пока использую - SmartGen RAM.
Это на стр. 78 документа "Actel HDL Coding Style Guide" и показано...

PS Я писал письмо по этому поводу в Actel. Ответил, что вышлет описание на HDL.
Muscat
Maverick,
1,024 bits of user flash memory не спасут отца русской демократии.
Я по-моему достаточно ясно сформулировал свой вопрос выше.
Maverick
Цитата(Muscat @ Nov 8 2010, 17:25) *
Maverick,
1,024 bits of user flash memory не спасут отца русской демократии.
Я по-моему достаточно ясно сформулировал свой вопрос выше.


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

PS Отец русской демократии волен делать как ему хочется...
Muscat
Цитата(Maverick @ Nov 8 2010, 18:10) *
Например здесь - смотрим таблицу.


Я пока использую - SmartGen RAM.
Это на стр. 78 документа "Actel HDL Coding Style Guide" и показано...

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



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

Как объявить память я понял. Вопрос в том, каким образом задать это значение по умолчанию. Я привел 3 варианта, которые я пока вижу, хочу узнать как поступали другие. Опробовать смогу только в четверг.
_ANDREW
Цитата(Muscat @ Nov 8 2010, 13:42) *
_ANDREW, я тоже уже склоняюсь к тому, чтобы попробовать положить все на блочную память.
Как это лучше сделать в HDL коде?
1) Внутри архитектуры сигнала объявить сигнал типа массив с предварительным заданием значений
2) Внутри процесса объявить переменную, с предварительным заданием
3) Оставить все, как есть у меня сейчас - массив входных данных объявлен константой в упаковке


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

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;

у Вас будут скорее всего другие атрибуты, или можно обойтись без них, с помощью настроек синтеза..
Muscat
ANDREW, спасибо! Последний вопрос - это ведь под ксайлинкс? А какой синтезатор?
_ANDREW
Это для XILINX, атрибуты для родного XILINX SYN TOOLS (XST) который по умолчанию в ISE...
Maverick
Muscat
Сравните то что в документе на стр. 78 и то что привел _ANDREW описание на VHDL правда для XILINX.
_ANDREW
Цитата(Maverick @ Nov 8 2010, 22:43) *
Muscat
Сравните то что в документе на стр. 78 и то что привел _ANDREW описание на VHDL правда для XILINX.


на 78 странице память подключена как примитив, а вот на стр 76, внизу (Register-Based Dual-Port SRAM) подключение памяти как синтезируемого компонента... и практически тоже самое что и в моём коде (только я прописал ROM с инициализированными значениями). Честно говоря, думаю что отличия в архитектуре у разных компаний не велики..
и я обычно не подключаю блоки как примитивы, лучше писать на чистом языке, с настройкой синтеза атрибутами, чем лепить примитивы, и каждый раз переделывать проект под разные микросхемы.
Maverick
Цитата(_ANDREW @ Nov 8 2010, 22:26) *
на 78 странице память подключена как примитив, а вот на стр 76, внизу (Register-Based Dual-Port SRAM) подключение памяти как синтезируемого компонента... и практически тоже самое что и в моём коде (только я прописал ROM с инициализированными значениями). Честно говоря, думаю что отличия в архитектуре у разных компаний не велики..
и я обычно не подключаю блоки как примитивы, лучше писать на чистом языке, с настройкой синтеза атрибутами, чем лепить примитивы, и каждый раз переделывать проект под разные микросхемы.

Правильно!
Я хотел показать эту разницу Muscat - Вы опередили с ответом smile.gif
PS У меня не получилось
Цитата
... лучше писать на чистом языке, с настройкой синтеза атрибутами, ...

для ПЛИС фирмы Actel так описать блочную память. Регистровая память - не проблема. Из-за этого я и соответствующий вопрос и задал...
PS PS SmartGen RAM - это программа, которая генерирует макрос RAM памяти для ПЛИС, типа CoreGenerator у Xilinx
_ANDREW
Цитата(Maverick @ Nov 8 2010, 23:49) *
PS У меня не получилось для ПЛИС фирмы Actel так описать блочную память.


а почему не получилось??? синтезатор ругается?? каким Вы синтезатором пользуетесь??
Muscat
пробовал использовать атрибуты синтеза, делал аккурат по образцу из хелпа

Код
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. но это какой то извратский способ. Написал письмо в тех поддержку. Жду ответа.
XVR
Цитата
Синтезировал кусок кода из coding Style Guide. синтезатор продолжал все делать на регистрах.
Видимо способ использования этой памяти вами не позволил синтезатору поместить ее в BRAM. Какие нибудь warning'и в процессе синтеза были? В настройках синтезатора не запрещено синтезировать BRAM?
Muscat
Цитата
В настройках синтезатора не запрещено синтезировать 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.


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


Но первый вопрос никуда не делся. Сейчас я храню 128 тестовых байт по 6 бит внутрях самой ПЛИС, ясно что этот метод подходит только на начальных этапах отладки.
Поэтому вовзаращаясь к первоначальной теме - как работать с flash-памятью?
Есть ли у кого примеры?
Muscat
Пришел ответ от службы технической поддержки, огромное спасибо Карпову Сергею!

Память синтезируется в виде блоков при использовании атрибута
Код
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.

XVR
Цитата
Поэтому вовзаращаясь к первоначальной теме - как работать с flash-памятью?
Есть ли у кого примеры?
Конкретно на ваш кит - вряд ли, уж больно нераспространенное (по равнению с Altera & Xilinx) семейство.

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