Реализация модуля ЦОС
на 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