Загрузка ALTERA FPGA с помощью внешнего хост-процессора
17.01.2010 00:34

Типы конфигурации FPGA

Существует несколько способов загрузки Altera FPGA. Их можно разделить по следующим параметрам:

Параллельный или последовательный способ (Parallel or Serial)

  • "Последовательный" - 8-битные данные загружаются в ПЛИС по одной линии данных DATA[0] последовательно.
  • "Параллельный" - 8-битные данные загружаются в ПЛИС по нескольким линиям данных DATA[7..0] параллельно.

Активный или пассивный способ (Active or Passive)

  • "Активный" - FPGA сама инициализирует загрузку и загружет прошивку с внешнего устройства (FLASH памяти и т.п.)
  • "Пассивный" - FGPA загружается внешним устройством (CPU, MAXII Device и п.р.)

Joint Test Action Group (JTAG)

  • JTAG интерфейс
Ссылки на datasheet'ы Stratix II, Stratix III, Cyclon III, глава "Configuring XXX Devices"

 

Схема конфигурации FPGA

Для примера возьмем пассивный последовательный (PS) режим конфигурации.

Схема конфигурации PS (Passive Serial) ПЛИС и таймдиаграмма взяты из даташита на Stratix III

Stratix III configuration scheme

Гр.1. Схема конфигураци Stratix III

В качестве внешнего хоста возьмем любой процессор или микроконтроллер. Из схемы выше видно, что для последовательного режима загрузки ПЛИС необходимо как минимум 5 IO-портов:

  • CONF_DONE
  • nSTATUS
  • DATA0
  • nCONFIG
  • DCLK

Бинарный файл прошивки

Бинарный файл прошивки можно получить сконвертировав *.sof файл в *.rbf (Raw Binary File). Для этого в  Quartus II Altera выбирамем меню "File->Convert Programming Files..." и указываем следующие настройки.

 

convert sof to rbf

Тайм-диаграмма

Задача загрузить бинарный файл прошивки согласно тайм-диаграмме.

Stratix III configuration timechart

Гр.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
        }
    }

    p = pRBFdata;     // buffer with *.rbf data

    //-------------------------------------
    // 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;

        p++;
        cnt++;
        if(cnt > nSize)
        {
            return -3; //CONF_DONE pin error
        }    
    }        
    
    return 0;    
}

* Линия CONF_DONE может поднятся до того как файл полностью загружен.