Оригиналът е на Jiri Stepanovsky, който демонстрира висш пилотаж в

...
Оригиналът е на Jiri Stepanovsky, който демонстрира висш пилотаж в
Коментари Харесай

Да си направим самостоятелно свой собствен 16-битов CPU през 2023 година

Оригиналът е на Jiri Stepanovsky, който показва върховен пилотаж в хардуера и софтуера и който очевидно даже в домашни условия може да проектира и построява най-различни процесори

Даниел Десподов преди 1 минута 7 Сподели

Най-четени

ТелефониСветослав Димитров - 13:15 | 08.09.2023

Ето коя функционалност разрежда смарт телефона 5 пъти по-бързо, съгласно специалистите

ТелефониСветослав Димитров - 16:58 | 02.09.2023

Рестартирането на телефона: какъв брой постоянно да го вършим и за какво?

АвтомобилиДаниел Десподов - 9:41 | 08.09.2023

Нов пробив: в Германия сътвориха ултракомпактен електродвигател без непрекъснати магнити съвършен за електрическите автомобили (видео)

Даниел Десподовhttps://www.kaldata.com/Новинар. Увличам се от модерни технологии, осведомителна сигурност, спорт, просвета и изкуствен интелект.

За основаването на домакински процесор са нужни огромен брой логичен схеми. Наистина има логичност в това, че за реализирането на регистрите, брояча на инструкциите, ALU (Аритметично-Логическо Устройство) и другите съставни елементи на процесора въз основата на TTL или CMOS логичност са нужни забележителен брой чипове. Но какъв брой тъкмо?

Опитах се да усъвършенствам моя самоделен процесор, като сведох до най-малко броя на логическите чипове, с цел да отговоря на въпроса: какъв е минималният брой интегрални схеми, нужни за пълностоен процесор на Тюринг без потреблението на различен CPU?

Отговорът ми е, че за основаването на 16-битов пореден централен процесор са нужни единствено 8 интегрални схеми, в това число памет и тактов генератор. Той разполага със 128KB SRAM, 768KB FLASH и може да бъде клокван до 10 MHz. Той съдържа единствено 1-битово ALU, само че множеството от неговите 52 указания работят с 16-битови стойности (последователно). При оптималната скорост той извършва почти 12 хиляди указания в секунда (0,012 MIPS) и, наред с другите неща, е в положение да трансферира поточно видео на LCD екран, основан на PCD8544 (Nokia 5110), с почти 10 FPS.

Ако се избере подобаващата подредба за делене на крайните автомати и процесорите, моята 16-битова система може да се смята за процесор с минимален брой интегрални схеми. Други кандидати за тази купа биха могли да бъдат 1-битовият компютър на Джеф Лофтън с 1 директива и 1 обичай памет и опростеният процесор на Даниел Торнбург с 1 директива byte-byte-jump (копира 1 байт от едно място в паметта на друго и по-късно прави категоричен преход) и памет, симулирана на Raspberry PI.

 

Хардуерът

Вдъхновението за основаването на тази архитектура идва от други планове на процесори, като JAM-1 на Джеймс Шърман, SAP-1 на Бен Етер, 4-битовия Crazy Small CPU на Уорън, неговата 8-битова версия и други. Всички те и доста други сходни архитектури употребяват „ ръководещи “ EEPROM, EPROM или ROM за генериране на ръководещите сигнали на съставените елементи на процесора, тъй като това е доста по-лесно, в сравнение с генерирането им единствено посредством логичен схеми, а също и тъй като обезпечава доста по-голяма еластичност за в бъдеще. Аз също взех решение да употребявам такава „ ръководеща “ памет, а точно EPROM. Само че, за разлика от гореспоменатите планове, аз се стремях към допустимо минимален брой чипове, тъй че се пробвах да „ натъпча “ допустимо най-голяма част от обработката на данните в паметта, с цел да понижа условията към другите съставни елементи на процесора или, още по-добре, изцяло да се отърва от тях. Основните стъпки, които започнах, бяха следните:

Избавих се изцяло от ALU и го осъществих във тип на таблица. Тъй като множеството EPROM имат единствено 8-битов излаз, а системата се нуждае и от други ръководещи сигнали, размерът на данните на ALU трябваше да бъде доста стеснен. Но няма потребност да се тормозим, той може да бъде понижен до единствено един обичай: в реалност 1-битовите калкулации са задоволителни. За да може да се извърши каквото и да е свястно пресмятане, резултатите от 1-битовото ALU би трябвало да бъдат серийни – т.е. поредни. Това е идеално за потреблението на SRAM памет с пореден достъп, която дава и други преимущества. Първо, отпада нуждата от регистри, защото всички ALU интервенции могат да се правят непосредствено с данните в SRAM. Второ, SRAM паметите с пореден достъп също по този начин имат поредно адресиране, тъй че не е належащо да записваме адресите на източника и местоназначението. Трето, случайната разреденост на обработката на данните може да се получи, като просто се избере по подобаващ метод интервалът на повтаряне на тактовите импулси на SRAM паметта. Избрах 16 бита (16 импулса на тактовия генератор на SRAM за 1 интервенция на ALU) като допустим компромис сред улеснение и скорост.
Необходими са най-малко два SRAM чипа, като единият от тях би трябвало да обезпечава пореден вход за нашето 1-битово ALU, като в това време другият би трябвало да съхранява резултата. Необходими са два поредни входа за ALU интервенции с два операнда (например ADD/AND/XOR…). Разбира се, можете да добавите трета SRAM памет (2 за входовете на ALU, 1 за резултата), само че има и по-добро решение. Ако вместо SRAM се употребява FLASH памет с пореден достъп, преимуществата се резервират (вече имаме поредни данни и пореден адрес), като FLASH паметта може да се употребява и за запазване на команди/програми, както и за обезпечаване на ALU входове. Не е належащо да се прибавя хардуер за брояча на инструкциите, защото в SRAM има задоволително място за запазване на неговата стойност.

Но даже при тези основни опростявания към момента е нужен спомагателен хардуер. Въпреки това всичко може да се събере единствено на 8 чипа, както е показано по-долу:

 

Схемата се базира на 128-килобайтовата EPROM памет M27C1001-15, работеща напрегнато 5 V, която съчетава краен автомат за ръководство и 1-битов ALU. Нейните изходни линии се фиксират от чипа 74HC574 на всеки интервал на повтаряне на тактовите импулси и ръководят двете 64KB поредни SRAM 23LCV512 и една 1MB серийна FLASH W25Q80. Няма задоволително изходи за ръководство на всяка памет поотделно, по тази причина те споделят една обща шина за данни и също по този начин отчасти линия за избор на чипа. Само линиите за синхронизиращите импулси остават обособени. Не можах да намеря серийна FLASH памет на 5 V, по тази причина резисторите R3, R4 и R5 лимитират тока и образуват мост за понижаване на напрежението от 5 V на 3,3 V. Не смятам стабилизатора на напрежение MCP1703 3,3 V за част от процесора (считах го, само че единствено като част от захранването), само че в случай че го броите, процесорът ще се състои от 9 чипа.

Текущата директива се съхранява в буферирания преместващ указател 74HC595, чиито контролни линии също са отчасти споделени с чиповете памет. Изпълнението на всяка директива лишава няколко такта, тъй че напредъкът на инструкцията се следи от брояча на „ микрокода “ със 74HC393. Когато командата бъде изпълнена, линията Counter_reset нулира брояча на „ микрокода “ и стартира осъществяването на идната команда, записана в буфера 74HC595.

74HC574 и броячът на „ микрокода “ 74HC393 употребяват противоположните фронтове на синхронизиращите импулси и по тази причина тактовият генератор с 74HC14 подава инвертиран тактов сигнал към 74HC393, с цел да реализира синхронизацията.

Входове и изходи

Това, което не можах да осъществявам в моя процесор по по-разумен метод, е самопрограмирането на FLASH паметта. Следователно bootloader не е вероятен и зареждането на нова стратегия във FLASH паметта с пореден достъп би трябвало да се прави външно. За тази цел използвах микроконтролера Attiny13, който прослушва посредством UART поредицата от команди, тъй че за зареждането на нов код е подобаващ всевъзможен USB-UART адаптер. При програмиране той изключва изхода на 74HC574 посредством линията „ prog_en “ и стартира непосредствено да програмира FLASH паметта. Микроконтролерът се употребява единствено за зареждане на новата стратегия и по-нататък процесорът работи добре и без него.

Единствените налични изходи са горните два бита на регистъра за промяна на инструкциите 74HC595. Използвах една от тези инвертирани линии за избор на чипа, което дава опция на процесора да се свързва с устройства, сходни на SPI. Така да вземем за пример към него може да се свърже непосредствено SPI-базиран LCD екран напрегнато 3,3 V PCD8544 (например Nokia 5110), като вторият старши команден обичай се употребява като селектор за данни/команди на LCD екрана. Възможно е също по този начин вместо LCD да се свърже спомагателен преместващ указател от вида на 74HC595, с цел да се получат типичен цифрови изходни линии.

Единствените налични входове са двата сигнала данни/вход на паметта, свързани с адресните шини на EPROM (A9, A11). Чиповете памет с пореден достъп поддържат висок импеданс на тези сигнали, когато те не се употребяват, тъй че да могат да се дискретизират като общи цифрови входове, когато чиповете памет са неактивни. Важно е да се означи, че входният сигнал не би трябвало да основава разстройства на данните в паметта, по тази причина е належащо високо противодействие сред входния сигнал и входната шина на паметта (R6, R7). Забележка: четенето на входния сигнал по шините за данни на паметта работи единствено за тактови честоти до към 8 MHz. При по-високи честоти дискретизираните данни стартират да стават неправилни и работата на процесора може да спре.

 

По-горе беше показано видеото на моя процесор, който възпроизвежда музикалния клип „ Bad Apple!!! “ на LCD екрана PCD8544. В долния видеоклип демонстрирам опцията за ръководство на общите цифрови изходи след прибавянето на още един 74HC595. Същата скица би могла да се употребява за основаване на 8-битова музика със скорост до 4300 семпли/сек, в случай че вместо светодиоди се употребява матрица от резистори R-2R, като нагоре е дадена схемата, която използвах за основаване на саундтрака към видеоклипа „ Bad Apple!!! “.

Таблицата за систематизиране на паметта

Процесорът няма обособени регистри, само че има две SRAM, откъдето може да прави четене и запис. Недостатъкът е, че всякога, когато процесорът желае да получи достъп до данните, той би трябвало да запише цялостния 16-битов адрес на SRAM паметта. А плюсът е, че защото към момента би трябвало да се записва цялостния 16-битов адрес, процесорът (и командите като цяло) може да получи достъп до всичките 64KB SRAM с непрекъснато еднообразно време на достъп.

Избрах едната SRAM памет (U8/RAM1) за предпазване на програмните данни и всички аритметични и логичен интервенции би трябвало да се правят със стойности в тази памет. Втората памет SRAM (U7/RAM2) се употребява за организация на стека, тъй че единствено някои команди могат да четат и трансформират нейното наличие. Първите няколко байта от двата чипа памет са непокътнати за запазване на вътрешното положение на процесора (брояч на инструкциите, бита на флага, указателя на стека, междинния резултат, източника и крайния адрес, както и други вътрешно употребявани значения). Ето по какъв начин наподобява приблизителната таблица за систематизиране на паметта:

 

Заслужава да се спомене и методът за потребление на FLASH паметта като втори вход на ALU. Тъй като FLASH е много огромна (1 MB), в нея може да се сложи цялата 16-битова индексна таблица, съдържаща идентични по формат 16-битови стойности. С тази 128 KB таблица за търсене на процесорните указания по подадения код може да се запише 16-битова стойност във FLASH паметта като адрес и да се прочетат сходните 16-битови стойности като данни, които да се употребяват като вход за ALU.

Малко стеснение при потреблението на памети с пореден достъп е, че тяхното адресиране е по MSB-first, до момента в който 1-битовото ALU прави калкулации във формат LSB-first. За да работи адресирането на паметта, би трябвало да преобразуваме битовете от формата LSB-first, с който работи централният процесор, във формата MSB-first, с който работят чиповете памет. Обръщането на битовете благодарение на 1-битов ALU не е толкоз лесна задача, по тази причина резервирах още 128KB от FLASH паметта за таблицата за намиране на „ обърнатите стойности “, с цел да ускоря интервенцията. Всичко работи по същия метод, както при предходната таблица – цената се записва във FLASH паметта като адрес и след това се чете като данни.

Именно поради тези таблици моят процесор има единствено 768 KB FLASH памет, а броячът на инструкциите (PC) стартира от адрес 0x040000, а не от нулата.

Край на първа част. Във втората част ще разгледаме набора процесорни команди и ще представим няколко обикновени образеца на асемблер за   изчертаване на триизмерни фигури и тяхното завъртане в пространството, възпроизвеждане на клипове с ниска резолюция и други.

Източник: kaldata.com

СПОДЕЛИ СТАТИЯТА


Промоции

КОМЕНТАРИ
НАПИШИ КОМЕНТАР