Цитата(des00 @ May 5 2014, 09:53)

если все так как вы говорите, то
set_false_path -from [get_ports{flash_*}] -to [all_clocks]
set_false_path -from [all_clocks] -to [get_ports{flash_*}]
+
set_instance_assignment -name FAST_INPUT_REGISTER ON -to flash_xx
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_xx
Спасибо за ответ.
То что вы описали, я понял так: надо квартусу сказать, чтобы он не анализировал пути между клоками и ногами, подкюченными к флешке, то есть не пытался как то оптимизировать/подогнать эти пути, а вместо этого, чтобы он тупо засунул данные ноги в "быстрые регистры".
Я так сделал. Ну с первым то пунктом ни каких проблем.
А вот второй полностью не выполнился.
Прописал следующее:
set_instance_assignment -name FAST_INPUT_REGISTER ON -to flash_RB_n
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_WE_n
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_RE_n
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_WP_n
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_ALE
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_CLE
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_CE_n
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_CE2_n
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_CE3_n
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_CE4_n
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_CE5_n
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_CE6_n
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_CE7_n
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_CE8_n
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_DQio[0]
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_DQio[1]
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_DQio[2]
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_DQio[3]
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_DQio[4]
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_DQio[5]
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_DQio[6]
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to flash_DQio[7]
Для ALE,CLE,WE,RE,WP квартус написал, что не может упаковать ноду.
Вот для RE:
Warning (176225): Can't pack node flash_RE_n~output to I/O pin
Warning (176260): Can't pack node cpu:cpu_inst|nios_core:...:nand_flash_interface_pm|inner_work_RE_n~_wirecell and I/O node flash_RE_n~output -- one node must be a logic cell and one must be an I/O cell
И после этого частоа 100МГц упала до 93, появилась куча Failling Paths.
Решил откатить все назад: set_false_path закомментарил, FAST_OUTPUT_REGISTER закомментарил.
Вообще проблема с проектом следующая.
К ПЛИС подклено 4 нанд-флеш. Общий объем 128ГБ. Размер старницы 4096Б. Для контроля целостности и корректности записанных и прочитанных данных реализован механизм ЕСС (по Хеммингу) с возможностью обнаружения 1 или 2 ошибок и коррекцией только 1 ошибки на всю страницу. ЕСС пишется в служебную область страницы за 4096 байтом.
Проблема в том, что с изрядной частотой ЕСС срабатывает и обнаруживает ошибки, причем каждый раз на разных страницах, хотя записываю всегда оно и тоже.
Как я понимаю такого быть не должно.
Так как ЕСС обнаруживает ошибку уже после анализа всей страницы, а не в самый момент ее проявления, то сейчас реализован такой тест: записываю на одну страницу просто счетчик.
Затем вычитываю этот счетчик 1000 раз.
Результат чтения сравниваю с истинным счетчиком.
И так прохожу по всей флешке.
Это позволяет обнаружить ошибку тут же, и вывести ее в сигналтап.
По задумке: если имеются битые ячейки в нанд-флеш, то каждый раз на одних и тех же битых страницах я должен получать 1000 неудачных чтений, если битых ячеек нет - то 1000 удачных чтений.
Я же получаю следующее:
например, 30 страниц может вычитаться удачно, при чтении следующей страницы может быть несколько неудачных чтений из 1000. Потом опять несколько десятков удачных страниц, потом опять - иногда одно не удачное чтение, иногда больше: 2, 35, 259, 957.
Картина все время меняется.
Циклограмма работы с нанд-флеш сейчас отшлифована до идеала, все с хорошим запасом, там где требуется 7нс на предустановку данных на линии, я выставляю за 20нс и тому подобное.
Вот например один из сигналтапов с отловленной ошибкой.
flash_RE - сигнал чтения,
flash_DQio - двунаправленная шина данных, адреса, команд
inner_DQio_in - переименование flash_DQio вне процесса.
out_data - защелкнутые под процессом данные inner_DQio_in.
Опускаю RE, по даташиту максимум через 16нс должны придти данные, они приходят уже через 10 нс,
поднимаю RE, и на следющий такт защелкиваю входные данные inner_DQio_in в регистр out_data.
Из этой картинки видно, что данные должны быть (в hex) : 49, 4A, 4B, 4C, 4D.
А имеем: 49, 4A,
5B, 4C, 4D.
Если посмотреть на шину flash_DQio, то видно что откуда-то появился одиночный импульс в 4 бите flash_DQio[4]. Причем не до и не после этого импульса в этом бите не должно быть высокого уровня большое количество тактов.
Отсюда вопрос, откуда этот импульс взялся?
1. Может ли причиной его появления быть нарушение времянок в ПЛИС?
Если да, то буду дальше копать.
2. Может ли причиной его появления быть какие то внешние факторы: импульсные помехи, что еще (я в этих вопрос не имею достаточного опыта).
Если да, то тогда уже буду отпинывать проблему к разработчикам схемы, платы. Там еще так получается, плисина расположена на отдельной печатной плате, 4 нанд-флешки на другой печатной плате. Эти две платы стыкуются между собой штыревым разъмом HM2J09PE5118N9 и HM2S30PE5101N9
http://www.chipdip.ru/product/hm2j09pe5118n9lf/http://www.newark.com/fci/hm2s30pe5101n9lf...acle/dp/71K4963(может это сразу кому-то что-то скажет)