Разработка системы дополнительной обработки данных

Автор работы: Пользователь скрыл имя, 06 Июня 2013 в 12:40, курсовая работа

Описание работы

В курсовом проекте необходимо разработать систему дополнительной обработки данных (СДОД), которая эмулирует функционирование потоковых SIMD-расширений (SSE – Striming SIMD Extensions) архитектуры IA-32 методами микроконтроллера (МК) семейства PIC18XX2.
СДОД должна включать:
микроконтроллер указанного типа;
внешняю память, дополняющаю внутреннюю память МК до 256 Кб, имея в своем распоряжении предложенные микросхемы памяти, которые сотавляют:

Содержание работы

1. Выбор варианта задания.
2. Схема функциональная.
3. Анализ задания и описание алгоритма функции.
4. Описание работы устройства.
5. Описание программы

Файлы: 1 файл

kurs.doc

— 111.00 Кб (Скачать файл)

Министерство образования Украины 
Днепропетровский национальный университет 
Радиофизический факультет 
Кафедра ЭВМ

 

 

 

 

 

 

 

 

 

 

 

Курсовая работа

 

по дисциплине  
“Цифровые ЭВМ”

 

 

 

 

 

 

 

 

 

Выполнил:

ст. гр. КИ-10у-1в

Похил А.В.

 

Проверил:

доц. каф. ЭВМ

Пащенко В.А.

 

 

 

 

 

 

 

 

 

 

 

 Днепропетровск 
2012 

Содержание.

 

1. Выбор варианта задания.

2. Схема функциональная.

3. Анализ задания и описание  алгоритма функции.

4. Описание работы устройства.

5. Описание программы

6. Приложение 1. Схема электрическая  принципиальная.

7. Приложение 2. Листинг программы.  

1. Выбор варианта  задания.

 

Номер моей зачетной книжки – 012248.

    1. 8

0100 1000

Из таблиц получаем следующие  данные:

Команда – SQRTPD (извлечение квадратного корня числа)

Тип микроконтроллера –  PIC18C442

ППЗУ – 27С128

РПЗУ – 25ХХ640

 

В курсовом проекте необходимо разработать  систему дополнительной обработки  данных (СДОД), которая эмулирует  функционирование потоковых SIMD-расширений (SSE – Striming SIMD Extensions) архитектуры IA-32 методами микроконтроллера (МК) семейства PIC18XX2.

СДОД должна включать:

  • микроконтроллер указанного типа;
  • внешняю память, дополняющаю внутреннюю память МК до 256 Кб, имея в своем распоряжении предложенные микросхемы памяти, которые сотавляют:

а) устройство программируемой постоянной памяти (ППЗУ) с паралельным побайтным доступом;

б) устройство перепрограммируемой  постоянной памяти (РПЗУ) с последовательным побитным доступом.

 

В процессе функционирования СДОД должна:

  1. Ввести в МК с помощью паралельного подчиненного порта (PSP – Parallel Slave Port) первую группу операндов, размещенную в ППЗУ по выбранному адресу.
  2. Через главный синхронный последовательный порт (MSSP – Master Synchronous Serial Port) вторую группу операндов, размещенную в РПЗУ по определенному адресу ввести в МК. (Этот пункт задания не брать во внимание, если эмулируемая команда обрабатывает только одну группу операндов)
  3. Выполнить (сэмулировать) команду SSE2, указанную вариантом задания
  4. С помощью MSSP вывести из МК полученную группу результатов и записать ее в РПЗП вместо другой группы операндов.

 

2. Схема функциональная.

 

 


 

 

 

 

 

 

 

 

 

СДОД состоит из таких функциональных частей:

МК – микроконтроллер серии  PIC18CXX;

ППЗУ – устройство программируемой  постоянной памяти;

РПЗУ – устройство  перепрограммируемой  постоянной памяти.

 

Данные считываются из ППЗУ и поступают в МК через паралельный подчиненный порт (PSP). Затем соответствующим образом обрабатываются и записываются в РПЗУ через главный синхронный последовательный  порт (MSSP).

 

3. Анализ задания  и описание алгоритма функции.

 

Необходимо построить алгоритм вычисления квадратного корня числа.

Одним из популярных и достаточно быстрых методов вычисления квадратного  корня числа является метод  Newton-Raphson’а. Конечно этот метод быстр в терминах математики, т.к. интенсивно использует операцию деления, которая занимает много итераций МК. В PIC18CXX2 проблем с операцией деления нет, т.к. она является одной из основных. Однако с помощью одного цикла аппаратного умножения и используя алгоритм немного отличный от метода Newton-Raphson’а, можно реализовать операцию вычисления квадратного корня числа без приминения операции деления (сохраняя процессорное время). Следующий алгоритм демонстрирует это.

Используя бинарную природу МК квадратный корень может быть найден очень быстро. Каждый разряд двоичного числа представляет собой степень 2-ки. Сдвигая каждый бит вправо (или тоже самое степень 2-ки) и сравнивая результат с предполагаемым значением (т.е. квадратом предполагаемого результата), получаем искомый корень. Если квадрат предполагаемого значения больше чем аргумент, то бит сдвигаем, если меньше – переходим к следующему биту. Т. о. мы все ближе и ближе к настоящему значению.Блок-схема алгоритма представлена на рисунке 1.

 

 

 

Рассмотрим работу алгоритма на примере.

A =

A2 = 0xCF48

 

Шаг A Описание

1 1000 0000 (0x80) этот квадрат меньше чем 0xСF48, след. цикл

              новый бит


2 1100 0000 (0xC0) этот квадрат меньше чем 0xСF48, след. цикл

                новый бит


3 1110 0000 (0xE0) этот квадрат меньше чем 0xСF48, след. цикл

                 новый бит 


4 1111 0000 (0xF0) это больше чем 0xСF48, сдвигаем бит

                    новый бит


5 1110 1000 (0xE8) это больше чем 0xСF48, сдвигаем бит

                      новый бит


6 1110 0100 (0xE4) этот квадрат меньше чем 0xСF48, след. цикл

                        новый бит


7 1110 0110 (0xE6) этот квадрат меньше чем 0xСF48, след. цикл

                           новый бит


8 1110 0111 (0xE7) это больше чем 0xСF48, сдвигаем бит

                            новый бит


9 1110 0110 (0xE6) правый бит выпал и алгоритм останавливается, хотя

можно продолжать и дальше для более  точного вычисления

 

Таким образом мы получаем результат 0xE6. 

4. Описание  работы устройства.

 

Работа PSP.

Чтение из ППЗУ происходит через PSP (Parallel Slave Port).

Порт D используется для передачи младших разрядов адреса, а также после их фиксации в защелке для обмена байтом данных. Порт D образует PSP вместе с портом E, контакты которого 0-2, соответственно содержат сигналы “чтения”, “записи” и ALE (управление защелкой).

Порт B используется для передачи старших разрядов адреса, из которых A15 выбирает одну из 2-х микросхем. В качестве защелки микросхема 74LS373, которая представляет собой 8-разрядный буферный регистр с потенциальным управлением. Назначение защелки – демультиплексирование младших разрядов адреса и шины данных.

Цикл чтения начинается с подачи адреса на 16-разрядную шину, затем младшие разряды защелкиваются  по срезу сигнал ALE.

Контакты порта D стают входами. Потенциал на линии RD становится низким, что включает выходные буферы выбранной микросхемы памяти. С некоторой задержкой на линиях порта D появляются данные. Затем RD становится равным 1 и выходные буферы закрываются.

Выводы порта D снова становятся выходами, на которых присутствуют младшие разряды адреса.

 

Работа MSSP.

Запись в РПЗУ происходит через MSSP (Master Synchronous Serial Port).

В частности используется шина передачи I2C. (Master). Физически интерфейс этой шины состоит из двух линий: одна для синхронизации (SCL) и вторая для данных (SDA). I2C протокол обеспечивает 7-ми или 10-тяи битную адресацию

Для управления портом MSSP применяются регистры: SSPSTAT, SSPCON1, SSPCON2. С помощью этих регистров порт настраивается на протокол передачи I2C.

Порт A используется для передачи данных. В частности назначение его контактов таково:

RA0 – выбор банка;

RA1 – последовательный вход;

RA2 – синхронизация;

 

В первую очередь по сигналу на входе SI выбираем банк памяти, с которым мы хотим работать. Затем на вход SDA передаем данные. При этом нужно соответствующим образом изменять состояние регистра SSPSTAT.

 

5. Описание  программы.

 

При написании программной  части курсового проекта использовался  программный пакет MPLab фирмы Microchip Technology Inc. С помощью этого пакета можно достаточно быстро написать и скомпилировать программу для МК семейства PIC18CXX  и др.

Программа состоит из 2-х  частей, размещенных в файлах PROC.ASM и MAIN.ASM. В 1-м файле содержится код, реализующий выполнение операции извлечения квадратного корня, а также подпрограммы чтения и записи в ППЗУ и РПЗУ. Во 2-м – пример использования этих подпрограмм.

Файл PROC.ASM содержит код таких функций:

Sqrt32 – функция извлечения квадратного корня из 32-разрядного аргумента;

Squar – функция нахождения квадрата 16-разрядного  аргумента;

Init_PSP – подпрограмма инициализации порта PSP;

Init_I2C – подпрограмма инициализации порта I2C;

ReadPSP – функция чтения байта из ППЗУ;

WriteI2C – функция записи байта в РПЗУ.

 

Sqrt32. Алгоритм работы этой функции был рассмотрен выше, поэтому  подробно описывать ее работу не будем. Используемые переменные:

ARGA3-ARGA0 – аргумент функции;

RES1, RES0 – результат;

 

Squar. Функция находит квадрат числа с помощью т. н. метода “умножения в столбик”, суть которого заключается в следующем.

Пусть имеется два числа  A1A2 и B1B2 которые необходимо перемножить, где A1 , A2 , B1 , B2 – соответствующие цифры этих чисел. Тогда имеем:

AA2


BB2


  A1B2 A2B2


 A1B1 A2B1


A1BA1B2+ A2BA2B - соответствующие разряды результата

При возведении в квадрат нужно  принять A=B.

 

Init_PSP. Используется стандартная процедура инициализации порта.

Переменныая ADLOW_IMAGE – хранит младший адрес. Используются порты МК – порт B и порт D. Эти порты конфигурируются регистром TRIS.

 

Init_I2C. Используется тоже стандартная процедура инициализации порта. Сначала выбираем нужный банк памяти, затем частоту передачи сигналов (20 или 40 МГц), и затем инициализируем порт для работы в режиме I2C.

 

 


 

Листинг программы.

 

Файл MAIN.ASM

; *******************************************************************   

list p=18C442

#include P18C442.INC

; *******************************************************************

 

; *******************************************************************

EXTERN ARGA0, ARGA1, ARGA2, ARGA3

EXTERN RES0, RES1

EXTERN Sqrt

; *******************************************************************

 

; *******************************************************************

W equ 0 ; стандартные константы

F equ 1

a equ 0

; *******************************************************************

 

; *******************************************************************

R_Vctr CODE 0x0000

goto Main

; *******************************************************************

 

; *******************************************************************

; Calling Routine

SRoot CODE

 

Main

movlw  0xCF ; аргумент равен 0xCF48

movwf ARGA1, a ;

movlw 0x48 ;

movwf ARGA0, a ;

 

call Init_PSP ; инициализация PSP

 

call ReadPSP ; чтение из ППЗУ

 

call Sqrt ; Sqrt(0xCF48)

; RES0 теперь содержит 0xE6

call Init_I2C ; инициализация MSSP

 

call WriteI2C ; запись в РПЗУ

 

bra Main

; *******************************************************************

END

 

 

 

Файл PROC.ASM

#include P18C442.INC

; *******************************************************************

 

; ******************** Квадратный корень **********************************

;  Sqrt32(ARGA3:ARGA2:ARGA1:ARGA0) = RES1:RES0

 

Sqrt32 clrf TEMP0, a ; обнулить временное решение

clrf TEMP1, a

clrf BITLOC0, a ; установить 1-й бит

clrf RES0, a

movlw 0x80   

movwf BITLOC1, a ; BitLoc = 0x8000

movwf RES1, a ; RES = 0x8000

 

Squar16 movff RES0, ARG1L ; квадрат гипотезы

movff RES1, ARG1H

call Sq16

 

movf SQRES0, W, a ; ARGA - PROD  сравнение

subwf ARGA0, W, a

movf SQRES1, W, a

subwfb ARGA1, W, a

movf SQRES2, W, a

subwfb ARGA2, W, a

movf SQRES3, W, a

subwfb ARGA3, W, a

 

btfsc STATUS, C, a

bra NxtBt16 ; если больше, то след. бит

; если меньше, то сдвинуть  вправо

 

addlw 0x00 ; clear carry

movff  TEMP0, RES0 ; переместить последнее правильное

movff TEMP1, RES1 ; решение вRES0

 

rrcf BITLOC1, F, a ; затем сдвинуть бит и его установить

rrcf BITLOC0, F, a 

movf BITLOC1, W, a ; назад в RES1:RES0

iorwf RES1, F, a

movf BITLOC0, W, a

iorwf RES0, F, a

 

btfsc STATUS, C, a ; если последнее значение было      ; протестировано, то

bra Done32 ; выход

 

bra Squar16 ; вернуться к другому тестированию

 

NxtBt16 addlw 0x00 ; clear carry

movff  RES0, TEMP0 ; скопировать последнее правильное значение

movff RES1, TEMP1

 

rrcf BITLOC1, F, a ; сдвинуть бит

rrcf BITLOC0, F, a

movf BITLOC1, W, a ; и записать снова в RES1:RES0

iorwf RES1, F, a

movf BITLOC0, W, a

iorwf RES0, F, a

 

btfsc STATUS, C, a ; если это последнее значение

bra Done32 ; выход

 

bra  Squar16

 

Done32 movff TEMP0,RES0 ; поместиь окончательный результат в     ; RES1:RES0

movff TEMP1,RES1

return

 

GLOBAL  Sqrt32

; *******************************************************************

 

; ******************* Квадрат числа  *****************************

Информация о работе Разработка системы дополнительной обработки данных