Съдържание:

Десет битов компютър - VHDL: 4 стъпки
Десет битов компютър - VHDL: 4 стъпки

Видео: Десет битов компютър - VHDL: 4 стъпки

Видео: Десет битов компютър - VHDL: 4 стъпки
Видео: Fun with Music and Programming by Connor Harris and Stephen Krewson 2024, Юли
Anonim
Десет битов компютър - VHDL
Десет битов компютър - VHDL

Произведено от: Tyler Starr и Ezzeedden Gazali

Въведение

Този проект беше завършен като част от окончателния проект за CPE 133 в Cal Poly SLO. Това е чудесен проект за някой, който иска да разбере как функционират компютрите на най -ниското им ниво и как постигат задачите си. Проектът е моделиран по 8-битов SAP компютър, описан в книгата на Алберт Малвино „Дигитална компютърна електроника“. Въпреки това, ние увеличихме компютъра до 10-бита, за да позволим внедряването на повече операционни кодове (операционни кодове). Потребителят може да програмира компютъра да изпълнява набор от операции, като въведе определени инструкции.

Архитектура на системата и веригата:

Компютърът е написан на VHDL и ще се съдържа на дъската Basys 3 от Digilent. Входовете ще бъдат картографирани към превключвателите в долната част на платката. Два тактилни превключвателя ще се използват за функциите за нулиране и запис. Изходът ще бъде показан на 7 -сегментния дисплей на платката.

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

Стъпка 1: Материали

Материали
Материали

Всичко, което е необходимо за този проект, е платката Basys3 FPGA от Digilent и микро USB проводник за свързване на платката към вашия компютър.

Стъпка 2: Блокова схема на модулите на веригата

Блок -схема на модулите на веригата
Блок -схема на модулите на веригата
Блок -схема на модулите на веригата
Блок -схема на модулите на веригата
Блок -схема на модулите на веригата
Блок -схема на модулите на веригата

Блоковите диаграми по-горе показват различните модули на схеми, които съставляват 10-битовия компютър. По -долу са описания за всяка от отделните части/модули, показани на диаграмите по -горе.

Брояч на програми

Описание на входовете: входът е 5 -битов вход за зареждане на число в програмния брояч. Cp когато е високо броячът разчита на падащите ръбове на часовника. Clr нулира брояча на 0. Ep когато високото брояч извежда текущия брой. Sp когато е високо броячът задава броя на числото на входа

  • Описание на изходите:

    изходът е копие на брой за използване на LEDS 0-15. Count извежда текущия брой.

  • Общо място в системата: Този брояч следи местоположението на паметта, в което се намира програмата. Всички програми започват от адрес на паметта 00000 (0) и отиват до 11111 (31), освен ако не се използва спиране. В операторите за прескачане броячът на програмата продължава да брои от адреса, към който програмата скача.

Вход MUX

  • Описание на входовете: Адресът приема входа от превключватели 11 до 15. MAR приема входа от 10 -битовия регистър, използван като MAR. Програмата контролира кой вход да се насочи към изхода.
  • Описание на изходите: изходът насочва избрания вход към RAM.
  • Общо място в системата: Този MUX определя дали да се насочи адреса от превключвателите или шината към RAM. В програмен режим адресът от превключвателите се маршрутизира, а в работен режим се маршрутизира адресът от шината.

ramMUX

  • Описание на входовете: userInput е входът, който потребителят въвежда по време на програмния режим. aRegInput са данните, съдържащи се в регистър А, той се използва по време на операция за преместване. control е изборът за този MUX.
  • Описание на изходите: изходът е 10-битовият вход за данни към RAM.
  • Общо място в системата: Този MUX извежда 10-битовите входни данни, които се използват в RAM модула. Когато управляващият бит е висок, MUX извежда данните, които потребителят е въвел в програмен режим. Когато управляващият бит е нисък, MUX извежда данните на управляващата шина.

ramModule

  • Описание на входовете: inputData са данните, съхранявани в RAM. inputAddress е мястото, където се съхраняват данните. програма показва дали компютърът е в програмен или работен режим. readWrite показва дали се извършва операция за четене или запис. notCE е управляващият бит за RAM модула. ход показва, че се извършва операция за преместване.
  • Описание на изходите: outputDataToBus са данните, които преминават от RAM към шината. outputData и output address са данните и адресът, които отиват в регистъра на инструкциите.
  • Общо място в системата: RAM позволява съхранение на програми и данни в паметта преди стартиране на програма. След като програмата работи, RAM получава адрес от MAR и извежда данните към този адрес към шината.

адресROM

  • Описание на входовете: opCode е входът, съдържащ адреса на опкода, който се изпълнява от компютъра
  • Описание на изходите: opCodeStart е адресът на паметта, който показва първото местоположение на микроинструкции на съответния opCode.
  • Общо място в системата: Този модул приема затворената микроинструкция и извежда местоположението на паметта, което съответства на началото на тази последователност от микроинструкции.

ringCounter

  • Описание на входовете: нулиране връща брояча обратно на 100000 (първото "T състояние"). Clk увеличава брояча по един на падащ ръб на часовника. NOP показва, че текущото състояние/цикъл е цикъл "без работа".
  • Описание на изходите: count е изходът на брояча.
  • Общо място в системата: Броячът на пръстени контролира предварително зададения брояч и очертава шестте микро стъпки във всеки цикъл на инструкции (T1-T6).

preCounter

  • Описание на входовете: opCodeStart е местоположението на паметта на микроинструкциите за изпълнявания opCode. T1 връща брояча на 0, когато е висок. Когато T3 е висок, opCodeStart се зарежда и броенето продължава от това място за оставащите 3 цикъла (T4-T6). Clr задава брояча на 0. Clk увеличава брояча по един на падащ ръб.
  • Описание на изходите: controlWordLocation извежда местоположението на паметта на контролната дума, която трябва да бъде изпълнена.
  • Общо място в системата: Всеки операционен код има 3 микроинструкции. Броячът се увеличава с 1, започвайки от 0 за първите 3 цикъла (цикъл на извличане). Броячът след това се задейства от брояча на звънене, за да зареди адреса на opCodeStart и се увеличава с 1 за останалите 3 цикъла. По този начин preCounter контролира последователността от микро инструкции, които трябва да бъдат изпълнени.

controlROM

  • Описание на входовете: controlWordLocation е адресът на controlWord, който controlROM ще изведе. NOP показва, че местоположението е местоположение „без операция“.
  • Описание на изходите: controlWord е контролната дума, която позволява/деактивира различните компютърни модули да извършват желаната операция.
  • Общо място в системата: Този модул декодира местоположението на паметта от предварителния брояч и извежда контролния Word за желаната операция.

ALU

  • Описание на входовете: A и B са входовете от регистър A и регистър B, върху които ALU изпълнява аритметичните и логическите операции. Когато изваждането е активно, това показва, че B се изважда от A.
  • Описание на изходите: резултатът е резултат от добавяне на A и B, или изваждане на B от A. Изходите по -големи от, по -малки от, и равни, за да покажат дали (AB, или A = B) и се използват в модула за условен скок. грешка показва преливане или недостиг, когато е активна.
  • Общо място в системата: ALU съдържа логиката за аритметичните и логическите операции, извършвани от компютъра. Този модул може да добавя и изважда две 10-битови двоични числа. ALU може също да определи дали A> B, A

conditionalJmp

  • Описание на входовете: inputCount се използва за фиксиране на текущия брой. inputAddress се използва за блокиране на адреса, към който ще бъде прехвърлен. loadFromRegister при ниски ключалки inputAddress. loadCount при ниски ключалки inputCount. когато outputEnable е нисък, изходът е настроен на адреса, за да премине към. gT, iT и eQ определя кое условие се проверява. По -голямо от по -малко, по -малко от по -голямо и равно на, са входовете от ALU, показващи резултата от сравнението между A и B. На нарастващия часовник на Clk inputCount и inputAddress се четат в регистрите.
  • Описание на изходите: outputJmp е адресът, в който програмният брояч ще прочете.
  • Общо място в системата: този модул обработва условни и безусловни скокове за компютъра. Въз основа на входовете gT, iT и eQ, модулът определя кое условие да провери и дали това условие е вярно или невярно. Ако условието е вярно, то ще изведе адреса на инструкцията, към която да преминете, в противен случай извежда броя на следващата инструкция.

binToBCD

  • Описание на входовете: номерирайте 10 -битовото число за преобразуване в двоично кодиран десетичен знак.
  • Описание на изходите: стотици цифрата на мястото на стотиците на двоичното число. десетки цифрата на мястото на десетките на двоичното число. единици цифрата на мястото на единиците на двоичното число.
  • Общо място в системата: Този модул преобразува 10 -битовото число от изходния регистър в BCD, за да може нашият четирицифрен драйвер на дисплея да покаже номера в десетичен знак на 7 -сегментния дисплей.

fourDigitDriver

  • Описание на входовете: числото е 16 -битовият двоичен вход, който се задвижва към декодера. inClk е вътрешният часовник на Basys и се използва за часовник. RST нулира часовника, използван за задвижване на цифрите.
  • Описание на изходите: анодът определя кое място с цифри ще бъде осветено. цифрата е входният номер на декодера.
  • Общо място в системата: Този модул задвижва декодера да изведе BCD номера на дисплея.

декодер

  • Описание на входовете: inputNumber е цифрата, която идва от драйвера и която ще бъде декодирана.
  • Описание на изходите: катодите определят кои катоди ще бъдат включени за показване на желаната цифра.
  • Общо място в системата: Този модул декодира цифрата, която трябва да се покаже на 7 -сегментния дисплей.

fourDigitDisplay

  • Описание на входовете: числото е числото, което се показва на 7 -сегментния дисплей. грешка показва кога на дисплея трябва да пише "Err". Clk е часовникът, на който дисплеят работи. Този сигнал трябва да бъде около 60 Hz, така че дисплеят да може да показва всички 4 цифрени места едновременно.
  • Описание на изходите: анодът определя кое място с цифри е разрешено. катодът определя кои катоди се активират за показване на желаната цифра.
  • Общо място в системата: Този модул показва номер на 7 -сегментния дисплей. Вижте ръководството с инструкции за платката Basys 3 за информация кои катоди и аноди се активират, за да използвате дисплея. Когато битът за грешка е висок, дисплеят показва "Err".

изходMUX

  • Описание на входовете: progModeInput определя кои светодиоди са включени по време на режима на програмиране. runModeInput определя кои светодиоди са включени по време на режим на изпълнение. modeSelect е битът за избор или контрол за MUX.
  • Описание на изходите: LEDOutput показва кои светодиоди ще бъдат включени.
  • Общо място в системата: В зависимост от режима, в който е компютърът (програма или ром), MUX ще включи различни светодиоди. В програмен режим (modeSelect е '0'), MUX включва светодиодите, за да наподобява местоположението на паметта, в което е компютърът, и какво съдържа. В режим на изпълнение (modeSelect е '1'), MUX се използва за отстраняване на грешки, но може да бъде настроен да показва каквото и да е друго.

clockDivider

  • Описание на входовете: stop чете петте MSB бита от шината, за да открие команда за спиране ('11111') и спира часовника. inputClk е вътрешният тактов сигнал на платката Basys 3.
  • Описание на изходите: ouputClk е новият часовник, който е забавен.
  • Общо място в системата: Този часовник се използва за забавяне на компютъра, за да може потребителят да определи какво се случва. Часовникът може да работи много по -бързо, но в момента е настроен на 2 Hz.

triStateBuffer

  • Описание на входовете: Din е 5 -битовият вход, влизащ в буфера. Ep е контролния бит.
  • Описание на изходите: Dout е 5 -битовият изход на буфера
  • Общо място в системата: Когато контролният бит Ep е активен, буферът извежда входа. Когато управляващият бит не е активен, буферът не извежда нищо.

tenBitDRegister

  • Описание на входовете: Dbus е входът, към който е регистърът. Clk позволява на регистъра да чете данни при нарастващ ръб на часовника. ARST задава регистъра на 0 асинхронно. Когато outputEnable е ниско, съдържанието на регистъра е изход. Когато readIn е нисък, регистърът блокира Dbus на издигащия се ръб на часовника.
  • Описание на изходите: Qbus е изходът на регистъра
  • Общо място в системата: Регистърът се използва многократно в компютъра и се използва за съхраняване на информация при извършване на операции.

FiveBitDRegister

  • Описание на входовете: Dbus е входът, към който е регистърът. Clk позволява на регистъра да чете данни при нарастващ ръб на часовника. ARST задава регистъра на 0 асинхронно. Когато outputEnable е ниско, съдържанието на регистъра е изход. Когато readIn е нисък, регистърът блокира Dbus на изгряващия ръб на часовника.
  • Описание на изходите: Qbus е изходът на регистъра.
  • Общо място в системата: Регистърът се използва многократно в компютъра и се използва за съхраняване на информация при извършване на операции.

Стъпка 3: Код

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

Стъпка 4: Демонстрационен и примерен код

Видеото по-горе демонстрира как да програмирате 10-битовия компютър на платката Basys 3 FPGA. PDF файл, съдържащ оп-кодовете и примерна програма, също е приложен по-долу.

Препоръчано: