Перейти к основному содержимому

JTAG порт

JTAG порт реализует соединение между стендом DE2-70 и инструментальным компьютером. Это соединение используется приложением Quartus II для загрузки файла программирования в кристалл ПЛИС на плате, посредством чего создаётся процессорная система. Соединение также используется приложением AMP для загрузки программы в оперативную память процессорной системы и управления её выполнением.

Порт JTAG включает универсальный асинхронный приемопередатчик (UART), который может использоваться для передачи символьных данных между инструментальным компьютером и программой, выполняемой в процессорной системе на стенде. Причем обмен между процессором Nios II и портом JTAG осуществляется параллельным кодом, а между JTAG и инструментальным компьютером последовательным кодом.

Если на инструментальном компьютере используется приложение AMP, то для передачи символьных данных в порт JTAG их следует печатать в терминальном окне приложения, предварительно поместив туда курсор с помощью мыши. Вывод символов в порт JTAG из процессорной системы Nios II будет приводить к отображению их в терминальном окне приложения АМР, выполняющегося на инструментальном компьютере.

Программный интерфейс JTAG порта состоит из двух 32-битных регистров, показанных на рис. 3.10. Регистр, доступный по адресу 0x10001000, является регистром данных. Регистр, доступный по адресу 0x10001004, является регистром управления.

Регистры порта JTAG UART

Когда символьные данные из инструментального компьютера посылаются в JTAG UART, то они сохраняются в 64-символьном буфере FIFO. Число символов, хранимых в настоящий момент в буфере FIFO, указывается в поле RAVAIL, которое представлено разрядами 31-16 регистра данных. Если буфер FIFO переполнен, то дополнительно посылаемые в него данные со стороны инструментального компьютера будут потеряны. Если данные присутствуют в буфере FIFO, то величина RAVAIL будет больше нуля и 15-ый бит регистра данных RVALID будет равен 1. Для процессора Nios II рассматриваемый буфер будет содержать вводимую им информацию. Поэтому будем называть его принимаемым. То есть он содержит предназначенные для чтения процессором Nios II символы.

Чтобы осуществить чтение символа из вершины буфера FIFO, необходимо прочитать содержимое регистра данных JTAG порта. При этом младшие разряды 7-0 регистра данных будут содержать код вводимого символа. Поле RAVAIL при выполнении чтения автоматически уменьшится на единицу, и это уменьшенное значение как раз и будет получено в результате чтения. Если данных в принимаемом буфере FIFO нет, то поле RVALID будет содержать нулевое значение, и результат чтения из разрядов 7-0 регистра данных будет не определен.

Контроллер JTAG UART также включает 64-символьный буфер FIFO, который хранит данные, ожидающие передачи в инструментальный компьютер. Символьные данные загружаются в этот буфер посредством записи в разряды 7-0 регистра данных. Следует заметить, что запись в этот регистр не оказывает никакого влияния на получаемые данные. Размер доступного пространства в текущий момент времени в записываемом буфере FIFO указывается в разрядах 31-16 регистра управления. Это поле WSPACE (см. рис. 3.10). Если буфер FIFO полон, то все данные, в последующем записываемые в регистр данных, будут теряться.

Бит 10 в регистре управления, названный AC, устанавливается в 1, если к JTAG UART был доступ со стороны инструментального компьютера. Этот бит может быть использован для проверки наличия установленного соединения инструментального компьютера с платой DE2-70. Бит АС может быть вновь очищен посредством записи в него 1. Биты регистра управления RЕ, WE, RI, WI обсуждаются в разделе 3.3.2.

Использование JTAG UART в программах на языке ассемблер и С

Листинг 5 и листинг 6 содержат простые примеры программ на языке ассемблер и C, которые используют JTAG UART. Обе версии программы выполняют одни и те же функции, т.е. они отправляют текстовую строку в JTAG UART и затем выполняют бесконечный цикл. В этом цикле выполняется чтение символьных данных, полученных из JTAG UART, и запись их обратно в JTAG UART для передачи в инструментальный компьютер. Если программа выполняется с использованием AMP, то любые символы, которые будут печататься с помощью клавиатуры в её терминальном окне, будут возвращены назад, что приведет к появлению их в терминальном окне. Файлы с исходными кодами программ, показанных в листингах 5 и 6, доступны как часть AMP. Эти файлы могут быть найдены в разделе «Sample programs» под именем JTAG UART.

Листинг 5. Пример программы на языке ассемблер, в котором используется JTAG UART

/*****************************************************************************
* Программа выполняет следующее:
* 1. отправляет символьную строку из текстовой строки в JTAG UART
* 2. считывает данные из JTAG UART
* 3. отправляет считанные данные обратно в JTAG UART
*****************************************************************************/
.text
.global _start
_start:
movia sp, 0x07FFFFFC /* определяем адрес вершины стека */

movia r6, 0x10001000 /* адрес порта в r6 */

movia r8, TEXT_STRING /* адрес текстовой строки в r8 */
LOOP:
ldb r5, 0(r8) /* считываем символ из текстовой строки в r5*/
call PUT_JTAG /* вызываем процедуру, которая отправляет символ в JTAG */

addi r8, r8, 1 /* адресуем следующий символ в строке */

br LOOP /* переходим на вывод очередного символа */

GET_JTAG:
ldwio r4, 0(r6) /*читаем регистр данных JTAG UART*/
andi r8, r4, 0x8000 /*проверяем, есть ли новые данные*/
beq r8, r0, GET_JTAG /*если данных нет, то ожидаем их появления*/
andi r5, r4, 0x00ff /*получаем данные*/

call PUT_JTAG /*отправляем символ обратно в JTAG UART*/
call GET_JTAG

.end

/*****************************************************************************
* Подпрограмма, которая выводит символы в JTAG UART
* r5 = выводимый символ
* r6 = JTAG UART базовый адрес
*****************************************************************************/
.global PUT_JTAG
PUT_JTAG:
/* сохраняем используемые регистры */
subi sp, sp, 4 /* резервирум место в стеке*/
stw r4, 0(sp) /* сохраняем r4 в стеке */

ldwio r4, 4(r6) /* читаем регистр управления JTAG UART */
andhi r4, r4, 0xffff /* проверяем есть ли место для записи в буфере UART */
beq r4, r0, KONEC /* если места нет, то переполнение буфера */
stwio r5, 0(r6) /* отправляем символ в UART */

OVERFLOW:
/* восстанавливаем содержимое r4 */
ldw r4, 0(sp)
addi sp, sp, 4

ret

/*****************************************************************************/
.data

TEXT_STRING:
.asciz "\nJTAG UART example code\n"

.end

Прерывания от JTAG UART

Регистры порта JTAG UART

Рис. 3.10, воспроизведенный на рис. 3.15, показывает регистры данных и управления JTAG UART. Как было сказано в разделе 3.2.4, поле RAVAIL в регистре данных отражает число символов, которые хранятся в получаемом буфере FIFO в текущий момент времени. Поле WSPACE в регистре управления показывает размер свободного места в байтах в передаваемом буфере FIFO, то есть число символов, которые можно еще в него записать. Биты RE и WE регистра управления (см. рис. 3.15) используются для того, чтобы разрешить прерывания процессора, связанные с приемом или передачей символов. Если прерывание разрешено, то оно будет происходить, когда RAVAIL для буфера FIFO принимаемых данных превысит 7, или WSPACE для буфера FIFO отправляемых данных станет меньше 7. Произошедшие прерывания будут сопровождаться установкой в 1 разрядов RI и WI в регистре управления, которые потом могут быть очищены путем чтения или записи данных из/в JTAG UART.

Последовательный порт

Последовательный порт в процессорной системе включает UART, который соединен с соответствующей микросхемой RS232 на плате. Этот UART конфигурируется для передачи восьми битов данных, одного стопового бита, бита нечетности. Он работает со скоростью 115200 бит в секунду. Программный интерфейс последовательного порта состоит из двух 32-битных регистров, показанных на рис. 3.11. Регистр, доступный по адресу 0x10001010, является регистром данных. Регистр, доступный по адресу 0x10001014, является регистром управления.

Регистры UART последовательного порта

Когда символьные данные пересылаются в процессорную систему через разъем RS232, они сохраняются в 128-символьном буфере FIFO. Как показано на рис. 3.11, число символов RAVAIL, хранимых в текущий момент времени в этом FIFO, представлено в битах 31-16 регистра данных. Если буфер FIFO получаемых данных полный, то дополнительные данные, переданные в процессорную систему, будут потеряны. Когда данные присутствуют в буфере FIFO получаемых данных, то величина бита 15 регистра данных (RVALID) будет равна 1.

Чтобы осуществить чтение символа из вершины буфера FIFO, необходимо прочитать содержимое регистра данных порта UART. При этом младшие разряды 7-0 регистра данных будут содержать вводимый символ. Поле RAVAIL при выполнении чтения автоматически уменьшится на единицу, и это уменьшенное значение как раз и будет получено в результате чтения. Если данных в принимаемом буфере FIFO нет, то поле RVALID будет содержать нулевое значение, и результат чтения из разрядов 7-0 регистра данных UART будет не определен.

Последовательный порт так же включает 128-символьный буфер FIFO, который хранит данные, ожидающие отправки в RS232. Символьные данные загружаются в этот буфер посредством записи в биты 7-0 регистра данных. Запись в регистр данных не оказывает никакого влияния на получаемые данные. Размер доступного пространства в текущий момент времени в заполняемом буфере FIFO указывается в разрядах 31-16 регистра управления. Это поле WSPACE (см. рис. 3.11). Если буфер FIFO заполнен, то все данные, в последующем записываемые в регистр данных, будут потеряны.

Биты регистра управления RE, WE, WI, RI обсуждаются в разделе 3.3.3.

Прерывания от последовательного порта UART

Регистры данных и управления, связанные с последовательным портом UART, приведены на рис. 3.11 в разделе 3.2.5. Биты RE и WE в регистре управления (см. рис. 3.11) используются для того, чтобы разрешить прерывания процессора, связанные с заполнением получаемого и передаваемого буферов FIFO. Если прерывания разрешены, они будут формироваться, когда RAVAIL, для получаемого FIFO, или WSPACE, для передаваемого FIFO, превзойдет границу 31. Произошедшие прерывания будут сопровождаться установкой в 1 разрядов RI и WI в регистре управления, которые потом могут быть очищены путем чтения или записи данных из/в UART последовательного порта.