В этой записи я попытаюсь рассказать о реализации части процессорного ядра, использующего подмножество команд, используемых микроконтроллерами с архитектурой AVR. Проект далёк от завершения, но помигать светодиодом уже можно ;-) Например так:
Здесь правые 8 светодиодов показывают значение регистра R20, а левые 8 — значение IP(PC). Немного описания далее.
Были найдены готовые реализации AVR на FPGA: pAVR, AVR Core, Navré AVR clone. Но они явно очень сложные для начинающих и некоторые из них написаны не на Verilog, а мне пока хотелось бы более подробно познакомится с ним. Больше всего данный проект похож на reducedAVR. Только тут не приходится так извращаться с последовательной памятью, а можно сразу использовать встроенный блок m4k как ROM память.
Реализованы минимально необходимые инструкции: некоторые арифметические и условного перехода. Например вот код, который выполняется на камне в видео:
1 2 3 4 5 6 7 8 9 10 11 |
.include "1200def.inc" .device AT90S1200 .cseg .org 0 start: ldi r20,$FF ;1110 1111 0100 1111 / 0xEF4F loop: subi r20, 1 ;0101 0000 0100 0001 / 0x5041 brne loop ;1111 0111 1111 0001 / 0xF7F1 |
Код ядра SomeAVR можно взять на гитхабе. Извиняюсь, что залил туда весь проект целиком с мусором, но пока не разобрался в структуре проектов квартуса, чтобы понять что точно не нужно.
При загрузке конфигурации FPGA все регистры устанавливаются в значение по умолчанию, это можно увидеть на следующем видео
К сожалению пока всё, надеюсь будет продолжение :-)