Реализация модуля ЦОС на FPGA
В качестве модуля ЦОС, для реализации данного проекта, был выбран модуль прямого и обратного БПФ, т.к. данное преобразование занимает значимое место в цифровой обработке сигналов и часто применяется.
Аппаратная реализация.
    В качестве отладочной платы для данного проекта была использована разработка компании ZTEX: USB-FPGA Module 1.11+Analog Experimental Board 1.10. Далее для краткости будем называть данный комплект ЦОC-FPGA модуль.
            
    Рис.1. USB-FPGA Module 1.11                                    Рис. 2. Analog Experimental Board 1.10.
Данный комплект на своем борту имеет:
·         - Xilinx Spartan 6 LX9 to LX25;
·         - Высокоскоростной (480 MBit/s) USB интерфейс;
·         - Микроконтроллер Cypress CY7C68013A EZ-USB FX2;
·         - 128 Kbit EEPROM памяти;
·         - 64 MB DDR SDRAM ;
·         - AVR ATXmega128A1 микроконтроллер для работы с аналоговыми сигналами:
o   2 8-канальных, 12 Bit, 2 Msps (ADC);
o   2 двух-канальных, 12 Bit, 1 Msps (DAC);
o   4 Аналоговых компоратора (AC) с оконными функциями;
o   128 KByte Flash + 2 KByte EEPROM;
 
    Для конфигурирования модуля и загрузки прошивки используется FWLoader. Есть два способа запуска FWLoader. Либо, выполнив Баш скрипт FWLoader в каталоге Java либо выполнив:
java -cp [<path to>]FWLoader.jar FWLoader <options>
где <path to> обозначает каталог, в котором установлен FWLoader.jar  (например, каталог Java-пакета SDK).(для удобства и последующего многократного использования можно создавать .bat файлы с данной командой.)
    При запуске FWLoader сканирует совместимые устройства. По умолчанию он выполняет поиск устройств производителя ZTEX и код продукта.
опции   
 Есть два вида опций, порядковые и глобальные. Глобальные параметры оцениваются в первую очередь. Порядковые опции оцениваются после этого в порядке их появления.
Глобальные опции
опции
описание
-c
Проверяет на Cypress EZ-USB устройства без ZTEX прошивки
-v <VID> <PID>
Поиск устройств с даннымми  Vendor ID и Product ID
-vc
Поиск устройств с ZTEX прошивкой и Cypress Vendor ID, и Product ID, равные 0x4b4 0x8613
-s <sn string>
 Сканирование только устройств с серийным номером
-d <number>
Индекс Устройства (по умолчанию: 0, используется -р, чтобы получить список)
-f
Добавляет прошивку и битовый поток. Это позволяет переписать несовместимые прошивки или сконфигурировать FPGA.
-p
Печатает список доступных устройств
-h
Напечатать помощь
Порядковые опции
опции
описание
-i
Напечать информацию о устройстве
-ii
Напечать информацию о устройстве + возможности
-if
Напечатать состояние FPGA
-ss <sn string>
Установить серийный номер EZ-USB прошивку (используется с -uu или -ue)
-ru
Сброс EZ-USB микроконтроллера
-uu <ihx file>
Загрузка EZ-USB прошивки
-bs 0|1|A
Подкачка бит для битовых потоков: 0: отключено, 1: включено,: автоматическое обнаружение
Следующие опции требуют установленную ZTEX прошивку (например, по -uu <firmware>)
-rf
Сброс FPGA
-uf <bitstream>
Загрузка битового потока для FPGA
-re
Отключение EZ-USB прошивки в EEPROM
-ue <ihx file>
Загрузка EZ-USB прошивки в EEPROM
-rm
Отключить битовый поток на флэш
-um <bitstream>
Загрузить битового потока во флэш
 
Для начала необходимо установить прошивку standalone(она позволит конфигурировать FPGA из флэш-памяти и загружать встроенное ПО из EEPROM), находящуюся в пакете SDK. Это можно сделать выполнив:
FWLoader -c -uu standalone.ihx -ue standalone.ihx
 
     Следует отметить, что модуль ЦОС-FPGA идеально подходит под концепцию разработки SDR устройств.
      Рис. 3. Упрощенная модель SDR устройства.
 
   Рассмотрим данную модель более полно, и сопоставим ее с нашим модулем. В случае разработки модуля БПФ, мы должны получить устройство, функциональная схема которого показаны на следующем рисунке:
Рис. 4. Функциональная схема модуля БПФ.
       
    Программная реализация.
   Теперь рассмотрим программную модель:
Рис. 5. Программная модель модуля БПФ.
 
 Из данной схемы видно, что главными задачами разработки программного обеспечения является:
·         - разработка host-программы;
·         - разработка драйвера для USB;
·         - подготовка бинарного файла для входных данных;
·         - разработка программы БПФ;
·         - разработка программы для аналогового модуля (АЦП) (В случае, если входные данные будут подаваться в аналоговом виде).
 
Рассмотрим подробнее каждый из этих пунктов отдельно:
1)       Разработка host-программы. Данная программа должна выполнять следующие действия:
·         Читать данные из бинарного файла.
·         Загружать данные в USB модуля ЦОС-FPGA.
·         Получать результат с USB модуля ЦОС-FPGA.
·         Записывать данные в бинарный файл.
 
Текст программы:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <usb.h>
 
#define BUFSIZE  256
 
struct usb_device *device;
usb_dev_handle *handle;
char buf[BUFSIZE];
FILE *fp;
FILE *f;
 
// find the first ucecho device
struct usb_device *find_device ()
{
    struct usb_bus *bus_search;
    struct usb_device *device_search;
 
    bus_search = usb_busses;
    while (bus_search != NULL)
    {
      device_search = bus_search->devices;
      while (device_search != NULL)
      {
          if ( (device_search->descriptor.idVendor == 0x221a) && (device_search->descriptor.idProduct == 0x100) )
          {
            handle = usb_open(device_search);
            usb_get_string_simple(handle, device_search->descriptor.iProduct, buf, BUFSIZE);
            if ( ! strncmp("ucecho", buf , 6 )  )
                return device_search;
            usb_close(handle);
          }
          device_search = device_search->next;
      }
        bus_search = bus_search->next;
    }
   
    return NULL;
}
 
// main
int main(int argc, char *argv[])
{
    usb_init();                                // initializing libusb
    usb_find_busses();                         // ... finding busses
    usb_find_devices();                        // ... and devices
 
    device = find_device();                    // find the device (hopefully the correct one)
 
    if ( device == NULL ) {                    // nothing found
      fprintf(stderr, "Cannot find ucecho device\n");
      return 1;
    }
 
    if (usb_claim_interface(handle, 0) < 0) {
      fprintf(stderr, "Error claiming interface 0: %s\n", usb_strerror());
      return 1;
    }
 
       fp = fopen("E:\\e\\host_fpga\\out.dat", "wb");
    if(fp == NULL) {
        perror("error out.txt");
        return EXIT_FAILURE;
    }
 
            f = fopen("E:\\e\\host_fpga\\sin.dat", "rb");
    if(f == NULL) {
        perror("error in.txt");
        return EXIT_FAILURE;
                  }
   
   while (!feof(f)) {//работает
      // read string from stdin
            fread(buf, BUFSIZE, 16, f);
     
      printf(buf);
           
      // write string to ucecho device
      int i = usb_bulk_write(handle, 0x04, buf, strlen(buf)+1, 1000);
      if ( i < 0 ) {
          fprintf(stderr, "Error sending data: %s\n", usb_strerror());
          return 1;
      }
      printf("Send %d bytes: `%s'\n", i , buf);
 
      // read string back from ucecho device
      i = usb_bulk_read(handle, 0x82, buf, BUFSIZE, 1000);
      if ( i < 0 ) {
          fprintf(stderr, "Error readin data: %s\n", usb_strerror());
          return 1;
      }
      printf("Read %d bytes: `%s'\n", i , buf);
 
    fwrite(buf, BUFSIZE, 16, fp);
 
 
  }
fclose(fp);
fclose(f);
    usb_release_interface(handle, 0);
    usb_close(handle);
    return 0;
}
2) Драйвер для USB был взят из пакета SDK, распространяемого компанией производителем модуля ЦОС-FPGA.
3)       В качестве сигнала входных данных используется файл, из лабораторной работы №3 «Исследование методов обработки сигналов в терминале GSМ». http://radiolay.ru/viewtopic.php?f=3&t=145
4)       В качестве программы БПФ для FPGA была выбрана следующая готовая разработка: http://opencores.org/project,pipelined_fft_256 . Данная программа обладает следующей структурой:
Рис. 6. Блок диаграмма ядра FFT256.
 
BUFRAM256- буфер данных с записью строк и чтением столбцов;
FFT16- 16-точечное дпф;
CNORM- Сдвигатель на 0, 1, 2, 3 бита влево;
ROTATOR256- Комплексный перемножитель с поворачивающими множителями;
СТ256- счетчик;
 
В данный момент остаются открытыми следующие вопросы:
1)       разработка мультиплексора и демультиплексора для записи и получения данных через USB.
2)       Разработка программы обработки результатов.
3)       Разработка программы для работы с АЦП (В случае аналоговых входных данных) .
© 2008 - 2012 Omoled, 5.0.4467.33859
© 2008 - 2012 Omoled, 5.0.4467.33859