Марсоход

МАРСОХОД

Open Source Hardware Project

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Еще один простой программатор ПЛИС

E-mail Печать PDF

В прошлой статье я писал, что такое JTAG и TAP контроллер. Эти знания нам помогут сделать свой простой программатор для ПЛИС компании Альтера.

Я хочу сделать очень простой программатор, который будет работать через последовательный порт. Последовательный порт хорош тем, что он весьма распространен, прост в программировании и, к тому же, существуют недорогие устройства USB-to-COM. Есть надежда, что мой программатор будет работать и через такой переходник. На компьютере я буду запускать мою специальную программу, управляющую программатором. Нам ее предстоит написать (в смысле я ее уже написал и расскажу как она работает).

Итак, в разъеме JTAG есть 4 существенные для нас сигнала: TDI, TMS, TCK и TDO.
Первые три сигнала являются входами для программируемой микросхемы ПЛИС, то есть мы с компьютера должны ими управлять. Управление каждым сигналом должно быть произвольным, любой из них мы можем в любой момент времени установить или сбросить. У последовательного порта есть несколько сигналов, подходящих для этих целей:

  • RTS - он будет соответствовать сигналу TDI интерфейса JTAG
  • DTR - он будет соответствовать сигналу TMS
  • TX - будет соответствовать сигналу TCK

Кроме этого, на JTAG есть выходной сигнал TDO, состояние которого нам нужно уметь читать с компьютера. Будем использовать для этих целей сигнал CTS последовательного порта.

С сигналами разобрались, но есть одна проблема. Нужно сделать преобразователь уровней сигналов последовательного порта. Конечно можно использовать специализированные микросхемы преобразователей уровня, их существует великое множество. Например, вот такая есть микросхема icon HIN202 (625.08 Кбайт) 

Мы (как всегда) пойдем своим путем. Сделаем программатор по вот такой схеме:

схема простого программатора ПЛИС через последовательный порт

Несколько резисторов, стабилитроны, светодиоды для отладки программы и.. это все - проще не бывает.

Вот фотографии нашего программатора, вид сверху:

простой программатор ПЛИС через последовательный порт

Вид снизу:

простой программатор последовательного порта вид снизу

Программу я буду писать на языке C в среде Microsoft Visual Studio v10.
Моя программа будет состоять как бы из двух логических частей. Первая часть - это управление сигналами последовательного порта, а значит это и управление сигналами JTAG. Вторая часть программы - это чтение *.SVF файла, его интерпретация и последовательное исполнение. В прошлой статье я писал, что SVF файл описывает последовательность команд для TAP контроллера программируемой микросхемы. Среда Altera Quartus II может генерировать SVF файлы для откомпилированных проектов.

Для управления последовательным портом я буду пользоваться API функциями OS Windows:

  1. CreateFile(..) - используется, чтобы открыть последовательный порт
  2. EscapeCommFunction(..) - с параметрами SETRTS или CLRRTS для установки или сброса сигнала TDI
  3. EscapeCommFunction(..) - с параметрами SETDTR или CLRDTR для установки или сброса сигнала TMS
  4. EscapeCommFunction(..) - с параметрами SETBREAK или CLRBREAK для установки или сброса сигнала TCK
  5. GetCommModemStatus(..) - чтобы прочитать состояние линии CTS и соответственно узнать значение сигнала TDO от интерфейса JTAG

В программе определены две очень важные функции:
int sir(int nclk, int val);
int sdr(int nclk, int val);

Первая функция sir(..) записывает в регистр команд TAP контроллера программируемой микросхемы значение val длинной nclk бит. Вторая функция sdr(..) записывает в регистр данных TAP контроллера программируемой микросхемы значение val длинной nclk бит.

Функции выглядят примерно одинаково и делают примерно одно и то же. Используя сигнал TMS и TCK они переводят TAP контроллер в состояние записи соответствующего регистра IR или DR согласно диаграмме состояний (TAP state-machine) описанной в предыдущей статье. Сигнал TDI используется для последовательной передачи данных в регистр TAP, а сигнал TDO используется для чтения из контроллера ответных данных.

Теперь об интерпретаторе SVF файла.
Итак, Вы сделали проект для ПЛИС, откомпилировали его с помощью Quartus и получили SVF файл для программирования микросхемы.

SVF - это текстовый файл. Наша программа будет построчно считывать его и интерпретировать команду в этой строке и исполнять ее. Я не знаю всех подробностей стандарта SVF файлов, но то что я вижу в файле сгенерированном квартусом - это очень простой файл. Одна строка - одна команда. Нет никаких условных или безусловных переходов или подпрограмм. Таким образом, чтение и построчное исполнение SVF файла - вполне удобное для нас решение.

Собственно нужно реализовать только несколько основных команд: RUNTEST, SIR, SDR. Как вы конечно догадались команда SIR - записать число в регистр команд TAP и SDR - записать число в регистр данных. RUNTEST - это пауза, когда контроллер остается в состоянии IDLE. Скажу честно, что паузы я в своей программе выдерживаю не строго. У нас и так получится очень медленная частота записи из-за программной реализации протокола передачи. Так что выдерживать паузы согласно SVF надеюсь не обязательно.

Ну вот собственно программа написана и откомпилирована с помощью Visual Studio.
Вы можете скачать ее исходники и бинарный файл на нашем сайте: icon Программатор через последовательный порт (51.89 Кбайт)

Программа консольная, принимает 2 параметра в командной строке: имя последовательного порта и имя файла SVF. Например, вот так:


c:\MarsBlaster.exe COM4 my_proj.svf


Подключаю плату Марсоход к нашему программатору, подключаем его к компьютеру подаем питание.

программирование ПЛИС через последовательный порт

Вот как идет программирование:

Вот еще видео, как идет программирование с другого ракурса:

Похоже все работает!!!

PS: ложка дегтя.
Через переходник USB-to-COM тоже работает, но очень медленно. Программирование платы Марсоход (включая проверку после записи) занимает около 5 минут. Причина в том, что управление сигналами идет через USB и чтение ответного сигнала TDO занимает очень много времени (2-3 миллисекунды). Избавиться от этого вот так просто не получится. Нужно делать более сложный программатор, с более сложной логикой работы, что бы обмен вести не побитно, а хотя бы байтами, тогда можно сделать гораздо быстрее.

Ну и еще обратите внимание на схеме программатора есть "обратная связь" с 6й на 3ю ножки разъема COM порта. Это то же нужно - как раз для работы через переходник USB-to-COM. Эта обратная связь позволяет точно сказать пришли ли данные о статусе TDO или еще нет. Я устанавливаю TCK и читаю через обратную связь его же - пришел он или еще нет. Если пришел, значит с ним пришел и TDO. Немного мудрено получилось, но работает.

 

 

 
Расскажите всем:
Опубликовать в Twitter Написать в Facebook Поделиться ВКонтакте Записать себе в LiveJournal Показать В Моем Мире В дневник на LI.RU Поделиться ссылкой на Я.ру Поделиться ссылкой в Одноклассниках

Комментарии 

 
0 #12 nckma 10.10.2012 15:03
Цитирую MIKE:
Вопрос. Будет ли работать с циклоном 3 или 4.
файл SVF немного другой. Выводится огромный массив SDR 2944296 TDI (00000000FFFFFF ...)
TCK (такты) идут, а TDI нет.
Кто поможет?

Конкретно эта программа из этого проекта с Cyclone работать не будет - как раз потому, что SVF интерпретируетс я не до конце корректно. Гораздо более правильная интерпретация файла SVF в утилите MBFTDI, но она не поддерживает "этот" простой программатор :sad:
Цитировать
 
 
0 #11 MIKE 10.10.2012 12:45
Вопрос. Будет ли работать с циклоном 3 или 4.
файл SVF немного другой. Выводится огромный массив SDR 2944296 TDI (00000000FFFFFF ...)
TCK (такты) идут, а TDI нет.
Кто поможет?
Цитировать
 
 
0 #10 mike 18.06.2012 13:51
Спасибо ребята!!!Весь интернет перерыл и нигде ничего похожего найти не мог,а то у меня ноут,хрен подрубишся.Спасибо!!!
Цитировать
 
 
0 #9 Dreddlampard 22.03.2012 19:57
Привет) Можно вот узнать,как работает ф-я int pulse_tck_r()? А то я не понял что-то) А вот сигнал TDO,он сам получается как-то устанавливается в 0 или 1,а как это связать с ТАР-контроллером? А мы лишь его считываем получается?) По TDI понятно,выставл яя на нём 1 или 0 по нарастающему фронту TCK и находясь в регистре инструкций(shif t-IR) или регистре данных,мы записываем(сдви гаем) в эти регистры какое-то значение)
Цитировать
 
 
0 #8 nckm_ 01.11.2011 17:32
Цитирую Ryan Gibson:
Hey,

Just used Google translate to read this. Fantastic blog. Outstanding content.

Do you have an email address i can grab you on I have a few questions i'd like to run by you.

Thank you,

Ryan

hello! You may write questions to
Цитировать
 
 
0 #7 Ryan Gibson 01.11.2011 14:33
Hey,

Just used Google translate to read this. Fantastic blog. Outstanding content.

Do you have an email address i can grab you on I have a few questions i'd like to run by you.

Thank you,

Ryan
Цитировать
 
 
+2 #6 nckm_ 25.05.2011 06:40
Цитирую franta:
У меня нет Visual Studio восможно скачать кде то MarsBlaster.exe ?

так исполняемый файл там же есть в архиве
Цитировать
 
 
-1 #5 franta 24.05.2011 19:13
У меня нет Visual Studio восможно скачать кде то MarsBlaster.exe ?
Цитировать
 
 
0 #4 Alexey 24.05.2011 02:19
Отлично, теперь есть возможность шиться с ноутбуков! Спасибо! А можно такое же только с вашим BT-модулем сотворить и шиться с Java например с Android?
Цитировать
 
 
0 #3 maxxir 23.05.2011 17:32
Браво! Очередная конгениальная левая резьба от
марсоходов :roll:
Цитировать
 
 
+1 #2 Ю р и й 23.05.2011 05:07
Цитирую Coocos:
Спасибо! Отличная статья!

Для владельца ноутбука самое то. Вопрос: какая минимальная частота JTAG поддерживается нашими ПЛИС?

Максимальная - 18мГц, а на минимальную, по моему, нет
никаких ограничений.
Цитировать
 
 
0 #1 Coocos 22.05.2011 18:10
Спасибо! Отличная статья!

Для владельца ноутбука самое то. Вопрос: какая минимальная частота JTAG поддерживается нашими ПЛИС?
Цитировать
 

Добавить комментарий


Защитный код
Обновить


GitHub YouTube Twitter

Подписка RSS

marsohod.org - лента

Последние комментарии:

На форуме:

Нет новых сообщений.