Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 1. Исходный файл программы тестирования процессорной системы TEST_DE2_70_Media_Computer.s






.include " address_map.s"

.equ RIBBON_CABLE_INSTALLED, 0

/* Программа демонстрирует различные возможности процессорной системы.

* Она выполняет следующие действия:

* 1. Тестирует статическую память.

* 2. Прокручивает текст на семисегментном дисплее. Если ошибок при тестировании

* статической памяти не обнаружено, то текст содержит слова " dE2" и " PASSEd". Если

* были обнаружены ошибки, то выводится слово " Error".

* 3. Мигает зелеными светодиодами. Скорость мигания светодиодов и прокрутки текста на

* семисегментных индикаторах регулируется прерываниями таймера.

* 4. Подключает переключатели к красным светодиодам.

* 5. Обрабатывает прерывания от кнопок. Нажатие кнопки KEY1 увеличивает скорость

* прокрутки текста. Нажатие кнопки KEY2 снижает скорость, кнопки KEY3 - останавливает

* прокрутку.

* 6. Тестирует порты расширения JP1, JP2.

* 7.Отсылает обратно данные, полученные по интерфейсу JTAG UART (символы, введенные в терминальном окне программы Altera Monitor Program) и наоборот. */

 

.text

.global _start

_start:

 

/* инициализируем регистры sp и fp */

 

movia sp, 0x03FFFFFC /* Стек начинается с последнего адреса SDRAM памяти

mov fp, sp

 

/* инициализируем буфер семисегментных индикаторов */

 

movia r16, DISPLAY_BUFFER

movi r17, 0xde2

stw r17, 0(r16)

stw zero, 4(r16)

stw zero, 8(r16)

 

/* инициализируем зеленые светодиоды */

 

movia r2, 0x55555555

movia r16, GREEN_LED_PATTERN

stw r2, 0(r16)

 

/* инициализируем счетчик задержки, используемый для определения изменений отображаемого текста */

 

movia r16, EIGHT_SEC

stw zero, 0(r16)

 

/* инициализируем переключатели */

 

movia r16, DISPLAY_TOGGLE

stw zero, 0(r16)

 

/* направление передачи может быть сохранено в SHIFT_DIRECTION,

где 0-влево, 1-вправо */

 

movi r2, 1

movia r16, SHIFT_DIRECTION

stw r2, 0(r16)

 

/* запускаем таймер и разрешаем его прерывания */

 

movia r16, INTERVAL_TIMER_BASE

movi r15, 0b0111 /* START = 1, CONT = 1, ITO = 1

sthio r15, 4(r16)

 

/* разрешаем прерывания от кнопок */

 

movia r16, PUSHBUTTON_BASE

movi r15, 0b01110 /* устанавливаем биты маски прерывания в 1

stwio r15, 8(r16)

 

/* разрешаем прерывания процессора */

 

movi r15, 0b011 /* разрешаем прерывания от таймера и кнопок

.if RIBBON_CABLE_INSTALLED

ori r15, r15, 0b1000000000000 /* также разрешаем прерывания для порта расширения JP2

.endif

wrctl ienable, r15

movi r15, 1

wrctl status, r15

 

/* цикл, в котором тестируется статическая память и обновляются семисегментные индикаторы */

 

movia r15, 0x55555555

movia r17, SRAM_END

DO_DISPLAY:

movia r16, SRAM_BASE

movia r17, SRAM_END

MEM_LOOP:

call UPDATE_HEX_DISPLAY

call UPDATE_RED_LED /* подключаем переключатели к красным светодиодам

call UPDATE_UARTS /* обновление и JTAG порта и последовательного порта

 

/* тестируем порты расширения, если подключен 40-контактный кабель Ribbon */

 

.if RIBBON_CABLE_INSTALLED

call TEST_EXPANSION_PORTS /*возвращает 0, если тест закончился неудачей

beq r2, zero, SHOW_ERROR

.endif

 

stw r15, 0(r16)

ldw r14, 0(r16)

bne r14, r15, SHOW_ERROR

addi r16, r16, 4

ble r16, r17, MEM_LOOP

 

xori r15, r15, 0xFFFF

xorhi r15, r15, 0xFFFF

 

/* обновляем буфер семисегментных индикаторов примерно каждые 8 секунд */

 

movia r16, EIGHT_SEC

ldw r17, 0(r16)

movi r14, 80 /* 80 прерываний таймера равны примерно 10 секундам

ble r17, r14, DO_DISPLAY

 

stw zero, 0(r16)

 

/* выводим на семисегментные индикаторы слова dE2 и PASSEd */

 

movia r16, DISPLAY_TOGGLE

ldw r17, 0(r16)

beq r17, zero, SHOW_PASSED

 

stw zero, 0(r16)

 

/* выводим dE2 */

 

movia r16, DISPLAY_BUFFER

movi r17, 0xdE2

stw r17, 0(r16)

stw zero, 4(r16)

stw zero, 8(r16)

br DO_DISPLAY

SHOW_PASSED:

movi r17, 1

stw r17, 0(r16)

movia r16, DISPLAY_BUFFER

movia r17, 0xbA55Ed /* слово Passed

stw r17, 0(r16)

stw zero, 4(r16)

stw zero, 8(r16)

br DO_DISPLAY

 

SHOW_ERROR:

movia r16, DISPLAY_BUFFER

movia r17, 0xe7787 /* слово Error

stw r17, 0(r16)

stw zero, 4(r16)

stw zero, 8(r16)

DO_ERROR:

call UPDATE_HEX_DISPLAY

br DO_ERROR

 

/*******************************************************************************Обновляем значения, выводимые на семисегментный дисплей. Значения считываются из буфера

*******************************************************************************/

 

.global UPDATE_HEX_DISPLAy

UPDATE_HEX_DISPLAY:

subi sp, sp, 36 /* резервируем память в стеке

 

/* сохраняем регистры */

 

stw ra, 0(sp)

stw fp, 4(sp)

stw r15, 8(sp)

stw r16, 12(sp)

stw r17, 16(sp)

stw r18, 20(sp)

stw r19, 24(sp)

stw r20, 28(sp)

stw r21, 32(sp)

addi fp, sp, 36

 

/* выводим значения на индикаторы */

 

movia r15, DISPLAY_BUFFER

ldw r16, 4(r15)

 

/* Цикл, который заполняет буфер из 2 слов, который подключен к параллельному порту «DE2-70 Media Computer», подключенного к семисегментным индикаторам. Для каждого сегмента отводится 8 бит буфера*/

 

movia r17, 7

movia r15, HEX3_HEX0

movia r19, SEVEN_SEG_DECODE_TABLE

SEVEN_SEG_DECODER:

mov r18, r16

andi r18, r18, 0x000F

add r20, r19, r18

add r21, zero, zero

ldb r21, 0(r20) /* в r21 загружаем код символа

stb r21, 0(r15) /* сохраняем код в буфере

 

srli r16, r16, 4

addi r15, r15, 1

subi r17, r17, 1

bge r17, zero, SEVEN_SEG_DECODER

 

/* выводим на семисегментные индикаторы содержимое буфера */

 

movia r15, HEX3_HEX0

ldw r16, 0(r15)

movia r17, HEX3_HEX0_BASE

stwio r16, 0(r17)

ldw r16, 4(r15)

movia r17, HEX7_HEX4_BASE

stwio r16, 0(r17)

 

/* извлекаем из стека регистры */

 

ldw ra, 0(sp)

ldw fp, 4(sp)

ldw r15, 8(sp)

ldw r16, 12(sp)

ldw r17, 16(sp)

ldw r18, 20(sp)

ldw r19, 24(sp)

ldw r20, 28(sp)

ldw r21, 32(sp)

addi sp, sp, 36 /* освобождаем зарезервированную память стека

 

ret

 

/*****************Подключаем переключатели к красным светодиодам****************/

 

.global UPDATE_RED_LED

UPDATE_RED_LED:

 

/* сохраняем регистры в стеке */

 

subi sp, sp, 16 /* резервируем область памяти в стеке

stw ra, 0(sp)

stw fp, 4(sp)

stw r15, 8(sp)

stw r16, 12(sp)

addi fp, sp, 16

 

/* считываем значение с переключателей */

 

movia r15, SLIDER_SWITCH_BASE

ldwio r16, 0(r15)

 

/* выводим его на красные светодиоды */

 

movia r15, RED_LED_BASE

stwio r16, 0(r15)

 

/* извлекаем из стека регистры */

 

ldw ra, 0(sp)

ldw fp, 4(sp)

ldw r15, 8(sp)

ldw r16, 12(sp)

addi sp, sp, 16

 

ret

 

/******************************************************************************* Считываем символы из JTAG порта и последовательного

порта UART и отправляем их обратно в оба порта *******************************************************************************/

 

.global UPDATE_UARTS

UPDATE_UARTS:

 

/* сохраняем регистры в стеке */

 

subi sp, sp, 28 /* резервируем область памяти в стеке

stw ra, 0(sp)

stw fp, 4(sp)

stw r15, 8(sp)

stw r16, 12(sp)

stw r17, 16(sp)

stw r18, 20(sp)

stw r19, 24(sp)

addi fp, sp, 28

 

movia r15, JTAG_UART_BASE

movia r19, UART_BASE

 

GET_CHAR:

ldwio r17, 0(r15) /* проверяем, имеют ли JTAG или UART порты новые данные

andi r18, r17, 0x8000 /* считываем символ

beq r18, r0, GET_CHAR_UART

andi r16, r17, 0x00ff

 

PUT_CHAR:

ldwio r17, 4(r15) /* проверяем, готовы ли порты JTAG UART к приему данных

andhi r17, r17, 0xffff

beq r17, r0, PUT_CHAR_UART

stwio r16, 0(r15) /* отправляем символ обратно

 

PUT_CHAR_UART:

ldwio r17, 4(r19)

andhi r17, r17, 0xffff

beq r17, r0, GET_CHAR_UART

stwio r16, 0(r19)

 

GET_CHAR_UART:

ldwio r17, 0(r19)

andhi r18, r17, 0xFFFF

beq r18, r0, NO_CHAR

andi r16, r17, 0x00ff

 

 

ldwio r17, 4(r19)

andhi r17, r17, 0xffff

beq r17, r0, PUT_CHAR_JTAG

stwio r16, 0(r19)

 

PUT_CHAR_JTAG:

ldwio r17, 4(r15)

andhi r17, r17, 0xffff

beq r17, r0, NO_CHAR

stwio r16, 0(r15)

 

NO_CHAR:

 

/* восстанавливаем из стека регистры */

 

ldw ra, 0(sp)

ldw fp, 4(sp)

ldw r15, 8(sp)

ldw r16, 12(sp)

ldw r17, 16(sp)

ldw r18, 20(sp)

ldw r19, 24(sp)

addi sp, sp, 28

 

ret

 

/*******************************************************************************

Данный код тестирует порты расширения JP1 и JP2. Для этого должен использоваться кабель Ribbon

*******************************************************************************/

 

.global TEST_EXPANSION_PORTS

TEST_EXPANSION_PORTS:

 

/* сохраняем регистры в стеке */

 

subi sp, sp, 24

stw ra, 0(sp)

stw fp, 4(sp)

stw r15, 8(sp)

stw r16, 12(sp)

stw r17, 16(sp)

stw r18, 20(sp)

addi fp, sp, 24

 

movia r15, JP1_EXPANSION_BASE

movia r16, JP2_EXPANSION_BASE

movia r17, 0xFFFFFFFF

stwio r17, 4(r15)

add r17, zero, zero

stwio r17, 4(r16)

movia r17, 0x55555555

stwio r17, 0(r15)

add zero, zero, zero

ldwio r18, 0(r16)

bne r17, r18, RET_ERROR

movia r17, 0xAAAAAAAA

stwio r17, 0(r15)

add zero, zero, zero

ldwio r18, 0(r16)

bne r17, r18, RET_ERROR

movia r17, 0x01234567

stwio r17, 0(r15)

add zero, zero, zero

ldwio r18, 0(r16)

bne r17, r18, RET_ERROR

 

add r17, zero, zero

stwio r17, 4(r15)

movia r17, 0xFFFFFFFF

stwio r17, 4(r16)

movia r17, 0x55555555

stwio r17, 0(r16)

add zero, zero, zero

ldwio r18, 0(r15)

bne r17, r18, RET_ERROR

movia r17, 0xAAAAAAAA

stwio r17, 0(r16)

add zero, zero, zero

ldwio r18, 0(r15)

bne r17, r18, RET_ERROR

movia r17, 0x01234567

stwio r17, 0(r16)

add zero, zero, zero

ldwio r18, 0(r15)

bne r17, r18, RET_ERROR

 

movi r2, 1

br RETURN

 

RET_ERROR:

movi r2, 0

RETURN:

ldw ra, 0(sp)

ldw fp, 4(sp)

ldw r15, 8(sp)

ldw r16, 12(sp)

ldw r17, 16(sp)

ldw r18, 20(sp)

addi sp, sp, 24

 

ret

 

/****************************** DATA SECTION *********************************/

 

.data

 

.global DISPLAY_BUFFER

DISPLAY_BUFFER:

.fill 3, 4, 0

 

.global SHIFT_DIRECTION

SHIFT_DIRECTION:

.word 0

 

/* Таблица декодирования семисегментных индикаторов содержит значения включен(1)/выключен(0) для каждого сегмента индикаторов*/

 

SEVEN_SEG_DECODE_TABLE:

.byte 0b00000000, 0b00000110, 0b01011011, 0b01001111

.byte 0b01100110, 0b01101101, 0b01111100, 0b01010000

.byte 0b01011100, 0b01100111, 0b01110111, 0b01110011

.byte 0b00111001, 0b01011110, 0b01111001, 0b01110001

 

HEX3_HEX0:

.word 0

HEX7_HEX4:

.word 0

 

.global GREEN_LED_PATTERN

GREEN_LED_PATTERN:

.word 0

 

.global EIGHT_SEC

EIGHT_SEC:

.word 0

 

DISPLAY_TOGGLE:

.word 0

 

.end

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.