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

awa

Участник
  • Постов

    6
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о awa

  • День рождения 07.02.1972

Контакты

  • Сайт
    Array

Информация

  • Город
    Array
  1. Вот подробнее, но как то сумбурно получилось. Для начала, несколько общих моментов. 1. Как дохнет NAND флеш. В отличие от HDD, в которых портятся сразу участки данных, в NAND дохнут отдельные биты, поэтому и алгоритм проверки и восстановления здесь расчитан на такое поведение. Тут расписано в картинках как он работает. http://www.samsung.com/global/business/sem...algo_040624.pdf 2. Страницы могут быть четырех видов: 1) Чистые(стертые) - после команды стирания заполнены кодом 0xFF; 2) Записанные - в них хранится актуальная информация; 3) Устаревшие - в них хранится устаревшая информация. Они ждут своей очереди чтобы быть стертыми или перезаписанными. 4) Сбойные - в них выявлены сбойные биты. Для работы они не используются. 3. Добавочные байты (заголовок) каждой страницы как и сами данные защищается ECC. (Я реализовывал свою FFS для размера страницы 512+16 байт и использовал 2 массива по 3 байта под два ECC для 256 байт каждый и 12 бит под ECC первых 8 байт из добавочных 16, остальные 8 - сами ECC и есть) В заголовке я так же хранил: - количество перезаписей данной страницы (16 бит) - номер записи для контроля дублей при записи. (2 бита) - признак битости данной страницы. (6 бит) - признак устаревшей страницы (4 бита) А так же: - номер файла, в который входит эта страница - ссылка на следующую старницу данного файла или ссылка на себя же для индикации конца цепочки. Это было сделано чтобы избежать организации отдельного FAT. В общем случае тут можно хранить номер логического "идеального блока" памяти. При старте системы происходит монтирование флешки, то есть считываются заголовки всех страниц и в памяти стоится таблица, в которой указано, что в какой физической странице лежит. Заодно проводится проверка на некорректное завершение последней работы с флешкой и устраняются ошибки. Запись логического блока происходит след. образом. 1) в таблице в памяти находим в какой физической странице лежит послений актуальный вариант этого блока, если его еще небыло записано, то переходим к п.3. 2) считываем заголовок страницы старого блока, увеличиваем 2-хбитный счетчик дублей и копируем в заголовок нового 3) находим чистую страницу, и пишем в нее или перезаписываем какую-нибудь устаревшую если чистых больше нет. 4) Пишем в старую страницу признак "устаревшая". Благодаря 2-хбитному счетчику дублей решается проблема определения актуальных данных в случае пропадания питания между 3 и 4 пунктами. Эта проверка проводится при монтировании системы. Для стирания блока просто пишем признак "устаревшая". При выборе страницы для записи можно выбирать с минимальным кол-вом перезаписей. Правда в моем случае было ограничение на суммарное количество записей в банк, после которого необходимо было перезаписать все страницы в этом банке. Есть еще такое понятие "сборка мусора". Это когда используется возможность быстро стереть сразу все страницы в блоке. Это делают, когда почти не остается чистых страниц, но много устаревших. В этом случае выбирается блок с минимальным числом актуальных (или максимальным числом устаревших) страниц, которые переписывются в другие блоки, а этот блок стирается. У себя я это не использовал.
  2. Можно покопаться в исходниках файловой системы YAFFS (http://ru.wikipedia.org/wiki/YAFFS/ http://www.yaffs.net/), если есть много свободного времени. ;) В двух словах, надо разделить физический блок памяти (страницу NAND например) и логический. В таком случае вся реализация контроля целостности, равномерности распределения перезаписей и т.п. будет реализовываться при работе с физическим блоком. Вот тут как раз и используются те самые дополнительные байты в каждой странице NAND. Таким образом получается, что при работе с логическими блоками Вы уже не думаете о всех заморочках NAND, а просто используете "идеальные" блоки памяти, на которые можно хоть FAT положить. Но в Вашем случае можно вместо FAT и по проще самопальную "файловую систему" использовать. При указанном подходе отпадает надобность в такой таблице. Для каждого физического блока все служебные данных хранятся в его же дополнительных байтах. Если интересует, могу коротко рассказать суть. Когда то разрабатывал подобную FS (еще до появления YAFFS, вернее параллельно с ней по времени). Единственно, что к FPGA это не имеет никакого отношения, чистое программирование.
  3. Часть схемы работает на частоте 400Мгц. Задаю констрейн set_max_delay между группой регистров из этой части, но ставлю ограничение 2 нс, а не 2.5 нс. Компилю. TimeQuest ругается, что максмальный Slack=-0.499 нс. (т.е суммарная задержка 2.499 нс). Причем все остальные задержки в норме. Ладно, ставлю ограничение 2.5 нс, компилю по новой. Теперь начинает ругаться, что Slack отрицательный по другим сигналам , ведь только что они были нормальные. Я понимаю, что в этот раз он развел проект чуть по другому, но странно как то. Ведь получалось в прошлый раз все времена вписывались в 2.5 нс, а теперь нет. И еще, у меня почему то виснет TimeQuest когда компилится проект. Доходит до 23% и все. При этом пишет в Message (1 warning - видимо имеется в виду "Critical Warning: Timing requirements not met"): Приходится нажимать кнопку STOP каждый раз. Проверял на двух компьютерах с QuartusWEB 8SP1.
  4. Да, Вы правы, тайминги квартусу не указываю. В прошлых проектах и так все удовлетворяло (скорость и сложность были ниже). Только контролирую результат в Compilation Report -> Timing Analizer. А тут чувствую совсем никуда не денешся. Ткните, пожалуйста, меня носом как это все настраивается.
  5. 1) Maximum Fan-Out установил в Assignment Editor для конкретного регистра. test_io:inst1|DWrReg[0] Maximum Fan-Out 16 Yes Название регистра взял из Timing Optimization Advisor. Тут же кстати показано и сколько fan-out у него. 2) Почему вручную не вышло - не знаю. Может чего не так делал. Смотрю результат в Chip Planner. Честно показывает 33 fan-out. 32 на пины и один внутри. 3) Нет дуплицирования и соответственно отсюда тайминги не те. Насчет установки в исходнике, я как то даже проморгал что так можно. Еще осваиваюсь с verilog. Посмотрел в доке. Поставил /* synthesis syn_maxfan = 16 */ и, о чудо, - сработало. Правда попытки выставить параметр в 4 или 20 были проигнорированиы, все равно бъет на 2-а по 17 fan-out. Ну да ладно, главное, что тайминги в норме. Спасибо большое за помощь, а то я уже совсем измучился. PS. Прошу прощения за глупые вопросы, я с FPGA работаю "наскоками", это не основная моя работа. Раньше с MAX Plus работал в графике да в AHDL. Теперь вот на Verilog перешел, только главный модуль в графике оставляю.
  6. Вот тут как раз подобный глюк вылез. В составе схемы был модуль с 16 выходами на пины - все разводилось и работало прекрасно. Поставил два таких модуля, фиттер их соптимизировал и получилось у одного из регистров 32 fan-out идущих на пины, раскиданные по 3-м сторонам корпуса. Теперь задержка на некоторых из них слишком большая и по частоте не проходит. Ставлю "Maximum Fan-Out" для этого регистра в 16 - фиттер игнорирует почему то. Пытался "дуплицировать" вручную - тоже не вышло. Даже не пойму куда копать дальше. PS. Камень - CycloneII, Quartus - 7 версии.
×
×
  • Создать...