МАРСОХОД

Open Source Hardware Project

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

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

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

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

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

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

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

HIN202 ( 640086 bytes )
 

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

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

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

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

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

Вид снизу:

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

Программу я буду писать на языке 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.
Вы можете скачать ее исходники и бинарный файл на нашем сайте: 

Программа консольная, принимает 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. Немного мудрено получилось, но работает.

 

 

Комментарии  

0 #15 nckm 09.08.2014 07:31
Цитирую DR:
Не получается прошить ПЛИС. При запуске mbftdi.exe окно сразу закрывается и ничего не происходит.

запускайте из под командной строки программы cmd.exe, тогда окно не закроется и увидите, что там пишется. И какая плис? Подано ли на нее питание?
0 #14 DR 08.08.2014 09:10
Не получается прошить ПЛИС. При запуске mbftdi.exe окно сразу закрывается и ничего не происходит.
0 #13 DR 08.08.2014 09:09
не получается прошить. При запуске mbftdi.exe окно сразу же сворачивается. чем дело?
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 info@marsohod.org
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
Вы здесь: Начало Разное Еще один простой программатор ПЛИС