| Загрузка ALTERA FPGA с помощью внешнего хост-процессора |
| 17.01.2010 00:34 | |
Типы конфигурации FPGAСуществует несколько способов загрузки Altera FPGA. Их можно разделить по следующим параметрам: Параллельный или последовательный способ (Parallel or Serial)
Активный или пассивный способ (Active or Passive)
Joint Test Action Group (JTAG)
Схема конфигурации FPGAДля примера возьмем пассивный последовательный (PS) режим конфигурации. Схема конфигурации PS (Passive Serial) ПЛИС и таймдиаграмма взяты из даташита на Stratix III
Гр.1. Схема конфигураци Stratix III В качестве внешнего хоста возьмем любой процессор или микроконтроллер. Из схемы выше видно, что для последовательного режима загрузки ПЛИС необходимо как минимум 5 IO-портов:
Бинарный файл прошивкиБинарный файл прошивки можно получить сконвертировав *.sof файл в *.rbf (Raw Binary File). Для этого в Quartus II Altera выбирамем меню "File->Convert Programming Files..." и указываем следующие настройки.
Тайм-диаграммаЗадача загрузить бинарный файл прошивки согласно тайм-диаграмме.
Гр.2. Тайм-диаграмма конфигурирования Stratix III PS-mode
Процесс конфигурирования очень прост. Линию порта nCONFIG опускаем в "0", ждем когда nSTATUS опустится в "0". Затем поднимаем nCONFIG и ждем пока nSTATUS не станет "1". После этого вся внутренняя конфигурационная память FPGA полностью сбросилась и FPGA перешла в режим конфигурирования. Затем на линию DATA синхронно с клоком DCLK выставляются побитно данные. Младший бит идет первым. Загрузка данных продолжается до тех пор пока CONF_DONE не станет "1". С этого момента конфигурация ПЛИС завершена, загрузку прошивки можно прекратить. Линия INIT_DONE показывает когда закончена инициализация ПЛИС загруженной программой прошивки. Этот порт опционален. Можно не использовать, если знание готовности работы ПЛИС не критично. Пример функции на языке си#define FPGA_nCONFIG //Define your IO pin here (output) #define FPGA_nSTATUS //Define your IO pin here (input) #define FPGA_CONF_DONE //Define your IO pin here (input) #define FPGA_DCLK //Define your IO pin here (output) #define FPGA_DATA0 //Define your IO pin here (output) int ConfigureFPGA(UCHAR * pRBFdata, int nSize) {
UDWORD time; int i; int cnt; UCHAR d0; UCHAR *p; //------------------------------------- //reset FPGA FPGA_nCONFIG = 0; Wait(10); //wait for nStatus becomes "0" time = GetTickCount(); while(FPGA_nSTATUS != 0) {
if((GetTickCount() - time) > 200) {
return -1; // Timeout error } } FPGA_nCONFIG = 1; //wait for FPGA ready time = GetTickCount(); while(FPGA_nSTATUS == 0) {
if((GetTickCount() - time) > 200) {
return -2; // Timeout error } }
// Load data cnt = 0; while(1) {
i = 0; d0 = (unsigned char)(*p); do {
FPGA_DATA0 = d0>>i; FPGA_DCLK = 1; FPGA_DCLK = 0; } while (7>i++); // FPGA_DATA0 = 0; if(FPGA_CONF_DONE == 1) break;
cnt++; if(cnt > nSize) {
return -3; //CONF_DONE pin error } } return 0; } * Линия CONF_DONE может поднятся до того как файл полностью загружен. |




