Ник:
Пароль:

Контакты

Cтатус Skype: starterkit.ru
тел.: (+7 3412) 478-448
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
E-mail: info@starterkit.ru
Google+
Партнеры:
otladka.com.ua - г.Киев
tixer.ru - г.Москва

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:0
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » FPGA
Конфигурация ПЛИС при помощи ARM
efreet
Добавлено 08.02.2010 11:31
0
Сообщение: 1
efreet
0

Пункты: 464
Регистрация: 08.02.2010
Здравствуйте, товарищи!

Не так давно разбираюсь с платой SK-AT91SAM9260-S3E, сейчас заткнулся на задаче конфигурации ПЛИС при помощи ARM/Linux. Пока думаю подключить JTAG ПЛИС к ARM через GPIO.

Может быть, кто-нибудь уже сталкивался с подобной задачей и может предложить более красивое/удобное решение? В любом случае буду рад любым советам по организации процесса загрузки конфигурации в ПЛИС через GPIO->JTAG (установка таймера, DMA).
Спуститься к концу Подняться к началу
Персональная информация
Strijar
Добавлено 08.02.2010 11:38 Сообщение: 2
Strijar
Ранг
5

Группа: Клиенты
Пункты: 1618
Регистрация: 21.04.2009
Пол: Мужчина
Более правильно через SPI, если он заведен с CPU на FPGA
Спуститься к концу Подняться к началу
Персональная информация
efreet
Добавлено 08.02.2010 15:57 Сообщение: 3
efreet
0

Пункты: 464
Регистрация: 08.02.2010
Спасибо! Сейчас мельком глянул даташит платы, вроде что-то от SPI1 заведено на FPGA. Буду ковырять в этом направлении
Спуститься к концу Подняться к началу
Персональная информация
Pavel Ivanchenko
Добавлено 08.02.2010 20:29 Сообщение: 4
Pavel Ivanchenko
Admin
4.45

Пункты: 79054
Регистрация: 24.03.2009
Пол: Мужчина
О заливке конфигурации через реализацию протоколов JTAG с ARM-а лучше забыть, если нет особого академического желания.
Ну а по существу задачи, конфигурационный вход FPGA запараллелен на ARM и "задвинуть" туда BIT-ник особого труда не должно составить.
Спуститься к концу Подняться к началу
Персональная информация
0xff
Добавлено 07.06.2010 18:16 Сообщение: 5
0xff
0

Регистрация: 07.06.2010
Возникла та же проблема. Правильно ли я понимаю, что SPI на FPGA с контроллера все-таки не заведен?

Таким образом, пробую заливать через GPIO. Делаю так:
1. Устанавливаю все пины в режим GPIO
- PC9 (PROG_B) - output
- PC7 (DIN) - output
- PC6 (CCLK) - output
- PC4 (DONE) - input
INIT_B (FB56), я так понимаю, никуда не заведен, только на X12, т.е. программно ошибку заливки никак не проверить
2. Дергаю PROG_B, DONE на плате гаснет
3. Начинаю слать данные Bit-Banging'ом побитно:
- Выставляю выход DIN (PC7) в соответствии с текущим битом данных
- Делаю задержку в 10 мкс
- Выставляю CCKL (PC6) в 1
- Делаю задержку в 10 мкс
- Выставляю CCKL (PC6) в 0
- и так далее в цикле, пока не кончатся данные

По идее должно работать, но не работает... Пробовал мониторить INIT_B светодиодом на X12 (между пином 30 и 4 (+3.3В)). Когда дергаю PROG_B, INIT_B гаснет и загарается снова, т.е. из 0 в 1 и опять в 0.

Также, в мануале есть такая фраза, что для конфигурирования ПЛИС может потребоваться больше синхроимпулсов, чем количество бит в прошивке. Как это понимать?

Есть ли у кого-то удачный опыт заливки контроллером? Заранее спасибо за помощь
Спуститься к концу Подняться к началу
Персональная информация
erma2002
Добавлено 30.06.2010 04:44 Сообщение: 6
erma2002
0

Пункты: 114
Регистрация: 30.06.2010
Пол: Мужчина
Может еще нужно кому-то :)
Код компилировался с помощью IAR. Под линух думаю перепишите. Изначально вызов Init, потом передаем битник с помощью SendPart и Finish.

Код


#define PIN_Xilinx_CCLK {1 << 6, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT}
#define PIN_Xilinx_NPROG {1 << 9, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_OUTPUT_1, PIO_DEFAULT}
#define PIN_Xilinx_DONE {1 << 4, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_INPUT, PIO_DEFAULT}
#define PIN_Xilinx_DIN {1 << 7, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT}
#define PINS_Xilinx PIN_Xilinx_CCLK, PIN_Xilinx_NPROG, PIN_Xilinx_DONE, PIN_Xilinx_DIN

#define PIN_Xilinx_CCLK_IN {1 << 6, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_INPUT, PIO_DEFAULT}
#define PIN_Xilinx_NPROG_IN {1 << 9, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_INPUT, PIO_DEFAULT}
#define PIN_Xilinx_DONE_IN {1 << 4, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_INPUT, PIO_DEFAULT}
#define PIN_Xilinx_DIN_IN {1 << 7, AT91C_BASE_PIOC, AT91C_ID_PIOC, PIO_INPUT, PIO_DEFAULT}

const Pin pin_xilinx_CCLK = PIN_Xilinx_CCLK;
const Pin pin_xilinx_NPROG = PIN_Xilinx_NPROG;
const Pin pin_xilinx_DONE = PIN_Xilinx_DONE;
const Pin pin_xilinx_DIN = PIN_Xilinx_DIN;

const Pin pin_xilinx_CCLK_IN = PIN_Xilinx_CCLK_IN;
const Pin pin_xilinx_NPROG_IN = PIN_Xilinx_NPROG_IN;
const Pin pin_xilinx_DONE_IN = PIN_Xilinx_DONE_IN;
const Pin pin_xilinx_DIN_IN = PIN_Xilinx_DIN_IN;

void Spartan3EInitConfiguration()
{
PIO_Configure(&pin_xilinx_CCLK, 1);
PIO_Configure(&pin_xilinx_NPROG, 1);
PIO_Configure(&pin_xilinx_DONE, 1);
PIO_Configure(&pin_xilinx_DIN, 1);
PIO_Clear(&pin_xilinx_NPROG); // Start pulse to FPGA
while (PIO_Get(&pin_xilinx_DONE)){}
//wait(500ns); pri f = 200MHz - 100 taktov
PIO_Set(&pin_xilinx_NPROG);
}

void Spratan3EWriteConfigurationPart(unsigned char * buffer, unsigned short length)
{
unsigned short i;
unsigned char i8;
unsigned char byte;
for (i = 0; i < length; i++)
{
byte = buffer[i];
for (i8 = 0; i8 < 8; i8++)
{
if ((byte & 0x80) == 0x80) { AT91C_BASE_PIOC->PIO_SODR = 1 << 7; } //DIN
else { AT91C_BASE_PIOC->PIO_CODR = 1 << 7; }
AT91C_BASE_PIOC->PIO_SODR = 1 << 6;
//PIO_Set(&pin_xilinx_CCLK); //Send 1 bit
byte = byte << 1;
//PIO_Clear(&pin_xilinx_CCLK);
AT91C_BASE_PIOC->PIO_CODR = 1 << 6;
}
}
PIO_Clear(&pin_xilinx_DIN);
}

void Spartan3EFinishConfiguration()
{
PIO_Configure(&pin_xilinx_CCLK_IN, 1);
PIO_Configure(&pin_xilinx_NPROG_IN, 1);
PIO_Configure(&pin_xilinx_DIN_IN, 1);
/*
PIO_Set(&pin_xilinx_DIN);
while (!PIO_Get(&pin_xilinx_DONE))
{
PIO_Set(&pin_xilinx_CCLK); //Send 1 bit
PIO_Clear(&pin_xilinx_CCLK);
} // Section from FPGA manual. Applyins CCLK with DIN = 1 until DONE
// After DONE apply additionaly 8 bits.
unsigned char i8;
for (i8 = 0; i8 < 8; i8++)
{
PIO_Set(&pin_xilinx_CCLK); //Send 1 bit
PIO_Clear(&pin_xilinx_CCLK);
}
PIO_Clear(&pin_xilinx_DIN);
*/
}

Спуститься к концу Подняться к началу
Персональная информация
Pavel Ivanchenko
Добавлено 30.06.2010 09:12 Сообщение: 7
Pavel Ivanchenko
Admin
4.45

Пункты: 79054
Регистрация: 24.03.2009
Пол: Мужчина
Спасибо за участие!
Спуститься к концу Подняться к началу
Персональная информация
0xff
Добавлено 01.07.2010 01:27 Сообщение: 8
0xff
0

Регистрация: 07.06.2010
erma2002, спасибо, сейчас более чем актуально :) DataFlash умерла похоже - FPGA с нее перестал грузиться и JTAG'ом не пишется больше...

Под линукс портировал, точнее копи-пастнул, обернул в драйвер, все работает. Как руки дойдут почищу и выложу

PS Нашел два косяка почему мог не работать мой вариант - в одном месте опечатка (жертва копи-пасты), а второе - пытался залить не *.bin, а *.bit, а он с заголовком
Спуститься к концу Подняться к началу
Персональная информация
efreet
Добавлено 01.07.2010 09:04 Сообщение: 9
efreet
0

Пункты: 464
Регистрация: 08.02.2010
Спасибо, erma2002!

Долго бился, пока не увидел у Вас установку DIN в 1 на время стартапа :) Без этого startup sequence не начинался даже, видимо

0xff, .bit заливается точно так же, FPGA игнорирует все данные до synchronization word
Спуститься к концу Подняться к началу
Персональная информация
erma2002
Добавлено 01.07.2010 21:53 Сообщение: 10
erma2002
0

Пункты: 114
Регистрация: 30.06.2010
Пол: Мужчина
У меня .bit не заливался. Что-то мне подсказывает, что он контрольную сумму еще считает и проверяет. .bin наверняка зальется. Еще кстати про фразу : Также, в мануале есть такая фраза, что для конфигурирования ПЛИС может потребоваться больше синхроимпулсов, чем количество бит в прошивке. Как это понимать? Без этого работает, так что кусок в финалайзе закоментирован. В теории все таки надо слать еще поток мусора пока DONE не перейдет в 1.

Кстати, никто случайно не писал процедуру сжатия битника? Пока не актуально, поэтому лень бьет писать :) Для линуха проблема вроде как проще решается, а вот когда делаешь свою прошивку тут граблей хватает.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » FPGA