Jump to content

    
Sign in to follow this  
vpd

Загрузка в active serial и режим user i/o для ASDO + nCSO

Recommended Posts

Вот какие грабли. Хотел сделать так, чтобы можно было обновлять EPCS4 прямо из EP2C5, в котором живет проект с PCI устройством. Повелся на то, что символ EP2C5 с сайта Альтеры, был нарисован так, что оба сигнала ASDO и nCSO там обозначены просто как user I/O. Когда дошло дело до программирования, то вдруг оказывается, что при выборе в качестве режима конфигурирования active serial пины двойного назначения nCSO и ASDO становятся доступными только на вход. А мне то как раз и надо там иметь выходы, причем именно с тем же смыслом, что и на этапе загрузки.

 

Два вопроса:

1) Отчего квартус не дает сделать мне там выходы?

2) Можно ли его обмануть? Ну, например, я скажу ему, что режим у меня вовсе не active serial, а какой-нибудь иной, чтобы он разблокировал пины, затем я сделаю sof (или даже pof), воткну его руками в проект прошивки для EPCS4 и залью в EEPROM. Это заработает?

 

В общем-то неохота лишние "макароны" на плату навешивать, цепляя ASDO и nCSO к резервным I/O.

 

еще такой вопрос. Сделал совсем простой проект счетчика светодиодом помигать, чтобы проверить первую плату. По JTAG работает, через EEPROM - нет. Причем сама EPCS4 зашивается правильно и проверяется. Сел все проверять по новой, так ничего и не обнаружил такого. От безысходности снял галку "compressed bitstream" в настройках устройства. И без нее все работает. Что это такое? Что-то я раньше не замечал, чтобы сжатие битстрима приводило к отказу загрузки. Скорость DCLK выбрана медленная.

Edited by Hoodwin

Share this post


Link to post
Share on other sites
при выборе в качестве режима конфигурирования active serial пины двойного назначения nCSO и ASDO становятся доступными только на вход

 

В настройках проекта в разделе девайс есть кнопка "Device and Pin Options..." там закладка "Dual-Purpose Pins". Именно там задаётся, как ведут себя некоторые системные пины после конфигурации. Обычно по умолчанию они отключаются в третье состояние или остаются системными, поэтому надо сначала задать режим пользовательского пина, а затем с этой опцией перекомпилировать, чтобы суметь использовать его в своём проекте.

Edited by Mihey yxNet

Share this post


Link to post
Share on other sites

Так говорю же, когда выбран режим конфигурирования active serial, то квартус не дает менять тип пинов ASDO и nCSO, там только один вариант есть as input tri-stated. По крайней мере так ведет себя версия 9.1sp2. Отсюда и вопрос возник.

Share this post


Link to post
Share on other sites

В самих настройках не даёт выбрать другой тип пинов? Или ругается при компиляции?

Сама возможность выставить такие опции в указанной вкладке при выставленном активном последовательном конфигурировании (в соседней вкладке) у меня по крайней мере в 9.0 была и как опция воспринималась. Даже несмотря на директиву "As input tri-stated" для Unused Pins.

Edited by Mihey yxNet

Share this post


Link to post
Share on other sites

Если хотите использовать ПЛИС для программирования EPCS, то Вам необходимо использовать мегафункцию ALTASMI_PARALLEL.

Во вложении пример её использования.

EPCS_BRIDGE
(
input clk_epcs, // - такт для EPCS (20 МГц)
input clk_host, // - такт для управляющей логики
input [7:0] ctrl_in, // - шина данных для регистра управления
input wr_ctrl, // - разрешение записи в регистр управления
input [23:0] address_in, // - начальный адрес адрес для чтения/записи EPCS (автоинкремент)
input wr_address, // - разрешение записи начального адреса
input [7:0] data_in, // - шина данных
input wr_data, // - разрешение записи данных
output wr_full, // - переполнение FIFO для записи
input rd_data, // - строб для чтения данных (запрос, 1 байт)
output [7:0] data_out, // - последний прочитанный байт
output busy - // флаг занятости (1 - идёт выполнение команды)
) ;

 

Краткая инструкция для данного модуля:

Для подключения к проекту нужно добавить в проект файл EPCS_BRIDGE.qip.

Для разрешения операций стирания/записи необходимо записать в регистр управления последовательность байт: 'E', 'N', 'A'.

Перед тем как программировать EPCS нужно её стереть, для этого необходимо записать в регистр управления последовательность байт: 'E', 'R', 'S'.

Размер записываемого блока памяти должен быть кратен 256 байтам.

Для запрещения операций стирания/записи необходимо записать в регистр управления последовательность байт: 'D', 'I', 'S'.

 

P.S. Если будете использовать мой модуль не забудьте перегенерить мегафунции под Вашу EPCS.

EPCS_BRIDGE.rar

Share this post


Link to post
Share on other sites

Хм. Тут вопрос уперся в то, что для работы с EPCS через родные ножки AS нужно какой-то стандартный кор использовать, или это все же можно делать в общем виде? Я вот гляжу в Embedded Peripherals IP User Guide, там написано про необходимость каких то настроек на уровне устройства:

 

The Altera EPCS configuration device connects to the FPGA through dedicated pins

on the FPGA, not through general-purpose I/O pins. In all Altera device families

except Cyclone III and Cyclone IV, the EPCS serial flash controller core does not create

any I/O ports on the top-level SOPC Builder system module. If the EPCS device and

the FPGA are wired together on a board for configuration using the EPCS device (in

other words, active serial configuration mode), no further connection is necessary

between the EPCS serial flash controller core and the EPCS device.

 

Perform the following tasks in

the Quartus® II software to make the necessary pin assignments:

■ On the Dual-purpose pins page (Assignments > Devices > Device and Pin

Options), ensure that the following pins are assigned to the respective values:

■ Data[0] = Use as regular I/O

■ Data[1] = Use as regularr I/O

■ DCLK = Use as regular I/O

■ FLASH_nCE/nCS0 = Use as regular I/O

 

Что-то я не наблюдаю пока никаких намеков на настроки Data[0] и DCLK. При попытке добавить их в проект, оно ругается:

Error: Can't place multiple pins assigned to pin location Pin_1 (IOC_X0_Y13_N0)

Info: Pin cfg_sdo is assigned to pin location Pin_1 (IOC_X0_Y13_N0)

Info: Pin ~ASDO~ is assigned to pin location Pin_1 (IOC_X0_Y13_N0)

Error: Can't place multiple pins assigned to pin location Pin_2 (IOC_X0_Y13_N1)

Info: Pin cfg_cs is assigned to pin location Pin_2 (IOC_X0_Y13_N1)

Info: Pin ~nCSO~ is assigned to pin location Pin_2 (IOC_X0_Y13_N1)

Error: Can't place multiple pins assigned to pin location Pin_108 (IOC_X28_Y2_N0)

Info: Pin com3_rts is assigned to pin location Pin_108 (IOC_X28_Y2_N0)

Info: Pin ~LVDS41p/nCEO~ is assigned to pin location Pin_108 (IOC_X28_Y2_N0)

Error: Can't place multiple pins assigned to pin location Pin_206 (IOC_X1_Y14_N1)

Info: Pin prst is assigned to pin location Pin_206 (IOC_X1_Y14_N1)

Info: Pin ~LVDS11n/DEV_CLRn~ is assigned to pin location Pin_206 (IOC_X1_Y14_N1)

 

 

Share this post


Link to post
Share on other sites

Я в свое время разбирался с этим, вот тестовый проект с доступом к ножкам cycloneII. Там, собственно, только один модуль существенен EPCS_chip.vhd, остальное для примера. Это выдрано из NIOS, но не тащит за собой кучи мусора.

EPCS.ZIP

Share this post


Link to post
Share on other sites

BSACPLD

 

Спасибо большое, что ткнули носом в эту полезную функцию. Вот кстати дока по ней:

http://www.altera.com/literature/ug/ug_altasmi_parallel.pdf

 

Получилось по-быстрому сделать простенький тест с ней, действительно все собирается и рулит ножками AS. Пока что сделал чтение silicon ID, вроде сходится. осталось прикрутить к PCI устройству.

 

В общем, исходный вопрос отпал сам собой.

Share this post


Link to post
Share on other sites

Здравствуйте.

Не знаю как с использование ALTASMI, но при использовании epcs_flash_controller'а все нормально работает, и позволяет перевести зарезервированные выводы как user-io после конфигурирования.

Share this post


Link to post
Share on other sites

В qsf прописать конфигурационные пины, как пользовательские, и можно прошивать без каких-либо корок (проверено на Cyclone IV).

 

 

 

http://electronix.ru/forum/index.php?s=&am...t&p=1374405

Если у кого есть какая статистика, просьба привести.

Я только начал этим заниматься. По первым впечатлениям, приведенные алгоритмы заметно проиграют zip как для хорошо заполненных, так и для почти пустых дизайнов.

Share this post


Link to post
Share on other sites

Самое интересное, это сжатие сжатого Квартусом битстрима. У сжатого битстрима большой плюс - требует меньше секторов, и время стирания загрузочной флешки будет меньше. Но сжатый Квартусом битстрим заполненного кристала хуже сжимается простыми алгоритмами, чем несжатый...

Share this post


Link to post
Share on other sites

К каким выводам пришел. Средний размер сжатых Квартусом битстримов у меня ~200КБайт (для мелких Циклонов). Степень дополнительного сжатия zip-ом соответствует заполненности кристалла, и на выходе получается ~100КБ для ~наполовину заполненных кристаллов, и ~20КБ для почти пустых. Простые алгоритмы, основанные на сжатии нулей, проигрывают zip-у ~40КБ (на выходе получается соответственно ~140КБ и ~60КБ). Оптимизация простых алгоритмов дает непринципиальную разницу в несколько КБ. Скорость радиоканала у меня ~20КБайт/сек, выигрывать доли секунды нет никакого смысла. А в сжатии простыми алгоримами смысл есть, осталось только выбрать самый красивый из самых простых (те, что по ссылке выше, забраковал).

Edited by Leka

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