Направете проста AVR микроконтролер

Често ме питат: "Какво е различно от FPGA на микроконтролер?" Ами какво мога да кажа? Това е като две различни неща. последователно Микропроцесорният изпълнява командите, описани в програмата си. FPGA работа в крайна сметка се определя от основната електрическа верига, прилагана в чипа. Архитектурата на микроконтролера, т.е. тип процесор, броят на въвеждане изходни портове, интерфейси, определени от производителя. Chip микроконтролер, произведени в завода и не може да бъде променена. Трябва само да се напише програма, която той ще изпълнява. FPGA - е свободата да бъдете креативни. Архитектурата изпълнява от устройството може да бъде почти всеки, само за да се поберат всички логиката в чипа. В FPGA може да бъде, например, за да се опита да приложи дори микроконтролер! Нека се опитаме?

Един от най-често срещаните микроконтролери - 8-битов RISC процесори AVR семейство от Atmel един. В тази статия ще обсъдим как да се реализира "почти" съвместим с AVR микроконтролер вътре в FPGA на борда на нашия Rover.

Преди да започнете да създавате свои изпълнение микроконтролер, разбира се, трябва да се разгледа вътрешността на AVR контролер. Човек трябва да знае поне микропроцесорни команди система AVR. можете да изтеглите описанието му на нашия сайт:

Ние няма за цел да повтори изцяло поведението на чип Atmel, ние искаме да направим нашия микропроцесор е само частично съвместими. Напълно репликира, можете, но се нуждаят от FPGA е много по-голям обем. Имаме Rover борда трябва CPLD EPM240T100C5, тогава имаме само 240 от джапанки и порти.

Следващи контроли и логически FPGAs налични в нашата последователна UFM флаш памет от 512 думи на 16 бита. В тази флаш памет, ние ще продължим програмата микроконтролер. Удобно, думите съхраняват във флаш имат битови 16. Всички отбори AVR процесор като шестнадесетичен. Нещо за Съюза за Средиземноморието, която написахме на нашия уебсайт. Имахме проект за борда марсохода на FPGA. което чете от паметта UFM.

"RAM" в нашата FPGA там. Е, това означава, че няма да има спомен от нашия микроконтролер, съжалявам, но това няма да ни спре.

В AVR микроконтролер има 32 осем битови регистри с общо предназначение. Долната групата на регистрите r0-R15 могат да бъдат използвани само в команди с операнди регистри. Външна групата R16-R31 регистри могат да бъдат използвани в командите и непосредствени операнди. Тъй като пространството вътре в нашата Rover чип карта наистина не е много, ние трябва да се прилагат само в някои регистри. Това е доста значително ограничение и то ще трябва да бъде взето под внимание при писане на програми за нашия микроконтролер.

Ние продаваме само 7 регистри: R16-R22:

  • Първите четири регистри R16. R19 - той просто се регистрира.
  • R20 регистър - това е също един нормален случай, само на бита ни са свързани с дъски марсохода на 8-LED.
  • R21 Регистрирайте - регистрирай това твърде конвенционален, но неговите битове ние свързан с терминал за контрол стъпкови двигатели борда марсохода на.
  • R22 Регистрирайте - само за четене. Към него са свързани входящи от 4 бутона борда марсохода на.

Шофиране нашия микроконтролер установена сред Altera QuartusII и изглежда по следния начин (кликнете върху снимката, за да увеличите):

Направете проста AVR микроконтролер


Нашата микроконтролер работи на прост алгоритъм:

  1. Той чете от флаш памет UFM следващата команда.
  2. Декодира командата и изберете за нея желаните операнди от регистри или директно от кода на команда.
  3. Изпълнява командата в устройството аритметична-логика.
  4. Магазини в резултат на изпълнение на команди в регистър приемник определят команда.
  5. Изпълнението продължава към следващата команда.

Сега нямам цел да се направи микроконтролер с висока производителност, ние не правим един поточен обработка на данни. Това се дължи на факта, че отбора от чип флаш памет, ние можем само да четат по един последователен формат, който е, четенето на един отбор се нуждае от най-малко 16 бара. Тук може да се направи по-бързо (но ние не се нуждаем в момента).

Напредъкът на програмата може да варира в зависимост от резултата от изпълнението. Специални команди ви позволяват да се движите на прехода до желаната операция в подходящи условия.

Ние списък екипа на AVR, че ние ще се прилагат:

ДОБАВИ 0000 11rd DDDD RRRR
SUB 0001 10rd DDDD RRRR

И 0010 00rd DDDD RRRR
EOR 0010 01rd DDDD RRRR
OR 0010 10rd DDDD RRRR
MOV 0010 11rd DDDD RRRR

CP 0001 01rd DDDD RRRR
LSR 1001 010d DDDD 0110

Subi 0101 KKKK DDDD KKKK
АНДИ 0111 KKKK DDDD KKKK
ORI 0110 KKKK DDDD KKKK
CPI 0011 KKKK DDDD KKKK
LDI 1110 KKKK DDDD KKKK

BREQ 1111 00kk kkkk K001
Brně 1111 01kk kkkk K001
BRCS 1111 00kk kkkk k000
БРЦК 1111 01kk kkkk k000

Ляв написани имената на отборите, както и правото им - двоичен представителство (кодиране). Тъй като буквата "R" означава регистъра източник, буквата "г" - приемник регистър, "К" - е пряко операнд.

Разбира се - това е само малка част от "недвижими команда системата", но дори и тези команди ви позволяват да се пишат програми, които се изпълняват добре.
Ние ще имаме опростена ALU (аритметично логическо устройство). Той прилага само за някои от най-често използваните команди, както и само на 2 знамена за условни скокове: "Z" и "C".

"Z" флаг е установен, ако в резултат на ALU е нула. Ако резултатът от ALU не е нула, флагът "Z" е сменена с нова. флаг "C" се задава, когато прехвърлянето на аритметични операции ADD и SUB / Subi или сравнение CP / CPI. Знамена се отрази на изпълнението на инструкция за условно отклонение: "Z" флаг засегне BREQ, Brně, знаме "C" се отразява BRCS, БРЦК.

Като цяло VSE проект, ние вече изпълнени и може да намерите тук:


Източникът на нашата основна AVR написани на Verilog език и може да бъде намерена тук.

Сега нека видим как можем да се напише програма за нашия микроконтролер? За да се напише програма на асемблер употреба среда Atmel AVRStudio4 компания развитие. Специализираното логическо устройство може да се изтегли директно от интернет страницата на компанията Atmel (след регистрация) тук. Или търси в Yandex - със сигурност ще намерите в публичното пространство.

Направете проста AVR микроконтролер


Създаване на проект в AVRStudio4 и напишете проста програма. Програмата ще започне да мига един светодиод на марсохода на борда и да задава въпроси към състоянието на натиснат бутон. Ако натиснете един бутон, мигащия диод "тече" в една посока, а ако натиснете друг бутон, "Run" е довело до другата страна. Ето изходния код на асемблер за нашия пример:

включва "1200def.inc"
.AT90S1200 устройство

; Първоначална един бит в регистър
LDI R16, $ 80

; Read порт (ключов статус)
Mov R17, R22
CPI R17, $ 0f
Иди и мига един светодиод, ако бъде натиснат бутон
breq do_xor

CPI R17, $ 0E
Иди и десния светодиоди смени, ако ключовата [0] притискат
breq do_rshift

CPI R17, $ 0d
Иди и олевяване светодиоди, ако ключовата [1] натиснат
breq do_lshift

; Направо да прочетете ключове
или R16, R16
Brně rd_port

do_rshift:
CPI r16,1
breq set80
LSR R16
Mov R20, R16
Brně пауза
set80:
LDI R16, $ 80
Mov R20, R16
или R16, R16
Brně пауза

do_lshift:
CPI R16, $ 80
breq set1
LSL R16
Mov R20, R16
Brně пауза
set1:
LDI R16, $ 01
Mov R20, R16
или R16, R16
Brně пауза

do_xor:
EOR R20, R16

пауза:
LDI R18, $ 10
cycle2:
LDI R19, $ FF
цикъл1:
или R19, R19
или R19, R19
Subi r19,1
Brně цикъл1
Subi r18,1
Brně cycle2

или R16, R16
Brně rd_port

Виждате ли? Четене на статута на бутони - тя се чете от R22 на регистър. Промяна на светодиодите за състоянието - рекорд в R20 регистъра.
Регулирайте AVRStudio така че изходен формат е "Generic". Този проект ще свойства ", Assembler Опции", настройката "Hex Изходен формат".
След съставянето на програмата се получава тук е текстов файл с кода на програмата:

Това ние файл почти за QuartusII. В нашия проект за FPGA има avr_prog.mif файл (Memory Инициализация на файла), където вмъкнем получен от AVRStudio код (само трябва да добавите точка и запетая в края на всеки ред). По този начин, след съставянето QuartusII тези кодове се делят на светкавицата UFM нашите FPGAs.

Всичко работи по предназначение!
Моля, имайте предвид, че след съставянето, на целия проект се само 205 от 240 логически елементи, налични в нашите FPGAs. Това означава, че нашата микроконтролер може да усложни допълнително или да добавите някаква нова логика. Така, че проектът може да бъде полезна за създаване на вашите устройства.

Добър ден.
Или пък може да ви помогне да променят модул за работа с "нормална" памет като пристанища на вр [8..0] данни [15..0]. Опитах независимо но все още не се е случило, заплете в сигналите и opcode_ready fix_result, аз приравни opcode_ready = 1 и fix_result = need_jump; но вероятно трябва някъде да се сложи закъснението.


И къде отиваш, за да го пробвам? Какао чип памет избера? Или ще бъде използван в FPGA с вътрешната памет?

Добър ден.
Или пък може да ви помогне да променят модул за работа с "нормална" памет като пристанища на вр [8..0] данни [15..0]. Опитах независимо но все още не се е случило, заплете в сигналите и opcode_ready fix_result, аз приравни opcode_ready = 1 и fix_result = need_jump; но вероятно трябва някъде да се сложи закъснението.

светна такса 1 LED светлини), които точно да прожектирате работи?))

днес разгледа проекта - нещо странно. при съставянето му 10m Кварт II работа по проекти, ако 11-ти - не. Mystic някои. Опитвам се да разбера.

Защо се използва UFM интерфейс: няма? ако решите Паралелно, тогава би било глупаво да се опрости входа на инструкции и не харчат само шестнадесет цикъла, за да се наложи да изтегли екипа на паметта.


Хм. наистина може да използва Parallel, само че не се подобри ситуацията. Всички едно и също вътрешно представителство UFM - сериен светкавицата и използване паралел само "маскиран" на този факт, все пак е по-бърз достъп до 16 бара правят


Е, поне не е този изключително странен процес на четене на данни от паметта, а след това хляба.


От тази гледна точка, може би си прав

Защо се използва UFM интерфейс: няма? ако решите Паралелно, тогава би било глупаво да се опрости входа на инструкции и не харчат само шестнадесет цикъла, за да се наложи да изтегли екипа на паметта.


Хм. наистина може да използва Parallel, само че не се подобри ситуацията. Всички едно и също вътрешно представителство UFM - сериен светкавицата и използване паралел само "маскиран" на този факт, все пак е по-бърз достъп до 16 бара правят


Е, поне не е този изключително странен процес на четене на данни от паметта, а след това хляба.

Защо се използва UFM интерфейс: няма? ако решите Паралелно, тогава би било глупаво да се опрости входа на инструкции и не харчат само шестнадесет цикъла, за да се наложи да изтегли екипа на паметта.


Хм. наистина може да използва Parallel, само че не се подобри ситуацията. Всички едно и също вътрешно представителство UFM - сериен светкавицата и използване паралел само "маскиран" на този факт, все пак е по-бърз достъп до 16 бара правят

Защо се използва UFM интерфейс: няма? ако решите Паралелно, тогава би било глупаво да се опрости входа на инструкции и не харчат само шестнадесет цикъла, за да се наложи да изтегли екипа на паметта.

Нещо странно е, което сте написали. LSL командния процесор не се изпълнява и се използва в програмата.
Как така?


О, това. Е, добре: екип от LSL е същата ADD инструкцията ако регистри, така и на източника и приемника е един и същ. Компилаторът генерира ADD, който се реализира.

Нещо странно е, което сте написали. LSL командния процесор не се изпълнява и се използва в програмата.
Как така?