Очень простая конструкция процессора в LogiSim


8

В настоящее время я учусь в старших классах средней школы, и меня интересует компьютерная / электротехника, в частности, разработка микропроцессоров. Я прочитал Code Чарльза Петцольда и начал читать Wikibook Design Microprocessor Design (который кажется неполным). Благодаря чтению Code я понимаю основную логику ЦП и начал строить ее в LogiSim. Глава 17 в Кодексе подробно описывает процессор, который я хочу построить, но в схемах отсутствуют ключевые компоненты - тактовые сигналы и декодирование команд. Некоторые из тактовых сигналов кажутся довольно очевидными (кажется, что ПК нужен устойчивый тактовый сигнал), но другие (например, как зафиксировать значения оперативной памяти) мне пришлось продумать и попытаться начать работать.

Я могу построить работающий аккумулятор (он не может быть точно назван ALU, я думаю, потому что в нем отсутствует L-часть), который переключается между сложением и вычитанием с помощью одного входа, и я понимаю, что это все, что мне нужно для арифметической части - как только я получу коды операций перехода, я могу реализовать умножение и деление в коде. Часть, с которой я борюсь - это декодирование команд. Посредством некоторых поисков в Google я вижу, что каждый код операции должен интерпретироваться как множественные микроинструкции, но я теряюсь в том, как мне нужно, чтобы это работало. В настоящее время мой декодер команд представляет собой просто схему комбинационного анализа с одним двоичным выходом для каждого кода операции - всего 13.

Код работает так: он имеет одно 8-битное кодовое значение (я использую только младший байт), а затем два отдельных 8-битных значения адреса, которые я затем объединяю, чтобы получить 16-битный адрес, вводимый в ОЗУ. Чтобы зафиксировать значения, у меня есть отдельный счетчик, который считает до 10b, а затем сбрасывает до 00b. Это вход тактового сигнала для каждой защелки по очереди (для трех защелок есть a, b и c. Вторые часы имеют a 1, в то время как b & c равны 0, тогда b равно 1, а 1 & c равны 0, затем c равен единице, а 1 & b равны 0, затем он сбрасывается). Но по таким инструкциям, как ADD 000Ah, компьютер переходит на 000AH ... который должен быть добавлен в аккумулятор, но фактически защелкивается в кодовом фиксаторе, а затем интерпретируется как следующий код операции, который заставляет все это работать сумасшедший.

Я чувствую, что мне не хватает большой информации о декодировании команд и о том, как мне нужно делать тактовые сигналы ...

Вот .circ файлы Logisim: https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitAdder.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitAdderSubtractor.circ https: // dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitInverter.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitLatch.circ https://dl.dropboxusercontent.com/u/6t6438 ID.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/PetzoldMk5.circ

PetzoldMk5 является основным процессором, который полагается на другие файлы, которые будут импортированы как библиотеки.

Вот список кодов операций (все двоичные):

Load                 0001
Add                  0010
Add w/ Carry         0011
Sub                  0100
Sub w/ Borrow        0101
Jump                 0110
Jump w/ Carry        0111
Jump W/ 0            1000
Jump w/o C           1001
Jump W/o 0           1010
Store                1011
Halt                 1100
Reset                1101

1
Готовы ли вы поделиться имеющимся файлом Logisim CPU .circ? И просто, чтобы сделать жизнь немного сложнее, вы должны внимательно прочитать и понять справку Logisim под заголовком «Распространение ценностей». Если нет, то уже. (Возможно, с учетом всей работы, которую вы уже применили. Очень рад слышать, что вы взяли это на себя!)
jonk

@jonk спасибо за красивые слова. Редактирование поста с соответствующими файлами .circ.
Уилл Ходжес

Это 6 файлов? (Я предполагаю, что это для LogiSim 2.7.1, 2011?)
jonk

@jonk да, это так, по обоим вопросам
Уилл Ходжес

Как вы справляетесь с вычитанием? Используете ли вы / Q от защелки входа на одном из входов A / B вашего ALU и модифицируете перенос? Или какой-то другой метод?
Джон

Ответы:


3

Ненавижу публиковать ответ типа «только ссылка», но я думаю, что вам следует знать о работе Уоррена Туми с процессорами в Logisim, поскольку это, вероятно, именно то, что вы ищете.

У него есть пара учебных пособий по созданию достаточно простого процессора здесь ...

http://minnie.tuhs.org/CompArch/Tutes/

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

http://minnie.tuhs.org/Programs/UcodeCPU/

... Все это хорошо объяснено и загружено в файлы .circ.


Другой замечательный, и, возможно, более функциональный, самодельный процессор / компьютер - это Magic-1, который можно найти по адресу http://www.homebrewcpu.com/ . Хотя это не сделано в Logisim, оно довольно хорошо задокументировано, включая рисунки, схемы, описания. Это также больше, чем просто процессор в симуляторе. Он имеет компилятор ANSI C, ОС и некоторое программное обеспечение. У этого также есть явное преимущество на самом деле быть встроенным в аппаратное обеспечение. Фактически, в настоящее время он запущен и обслуживает веб-страницы!


Наконец, «Элементы вычислительных систем» и связанный с ними сайт nand2tetris.org становятся рекомендуемым информационным ресурсом № 1 для создания собственного компьютера с нуля каждый раз, когда я в него заглядываю. Я считаю, что большая часть контента (все?) Бесплатна. YouTube согласится; многие люди сделали проекты, начиная с одного источника.


1
Посмотрите видео Yutbue Бена Итера о создании 8-битного настольного компьютера!
Фрэнсис Куглер

1

Я думаю, что вы упускаете ключевой аспект работы ALU. Обычно каждый бит аккумулятора соединяется с каждым из различных функциональных блоков через демультиплексор. Используя командный байт, функция выбирается, и каждый бит аккумулятора соединяется с соответствующим входом функционального блока. Размер демультиплексора определяет, сколько функций может обрабатывать ALU. В моем очень грубом примере, показанном ниже, ALU с 4-битным входом может ссылаться на 16 различных функций, используя демультиплексор:

Подключение аккумулятора к различным функциональным блокам в ALU

Обратите внимание, что в большинстве процессоров этот дизайн оптимизирован в кучу затворов, чтобы уменьшить количество транзисторов.

Можно использовать больше функций, имея больший регистр команд, но это также потребует большего количества тактов для загрузки команды.

Я настоятельно рекомендую прочитать следующую книгу, если вы хотите узнать больше о цифровом дизайне: Основы логического дизайна 7-е изд.


Этот ответ путает инструкции с операциями ALU. В частности, этот демультиплексор будет использоваться только для выбора арифметической операции для арифметической инструкции. Вы должны передать демультиплексору, скажем, 3 бита из 8-битной инструкции, чтобы выбрать, какую арифметическую операцию. Вам нужен совершенно отдельный механизм для декодирования и последовательности команд в целом. Кроме того, большинство процессоров, на которые я смотрел, не используют демультиплексор, подобный этому, в ALU, но используют оптимизированный беспорядок в воротах для выполнения правильной операции.
Кен

1
@KenShirriff Я внес некоторые изменения для ясности. Не стесняйтесь вносить изменения по своему усмотрению.
Так

1

Кажется, ты на правильном пути.

Когда вы планируете свои микроинструкции, вам необходимо четко определить в своем уме схему «трафика» для ваших данных, проходящих через различные блоки. Выполнение ADD потребует нескольких шагов. Если у вас есть регистры для двух ваших операндов ALU, их нужно будет загрузить из ОЗУ или из какого-либо регистра или шины. Если у вас есть общая внутренняя шина, вам может понадобиться загружать один операнд за раз. Как только вы узнаете, какие байты (адрес, непосредственный литерал, данные ОЗУ, указатель) должны куда перемещаться, спланируйте порядок перемещения байтов через шину (и) в различные регистры и из них. Вы можете застрять, и вам потребуется добавить внутренний регистр хранения, потому что некоторое промежуточное значение должно быть сохранено до следующего шага микроинструкции.

Я думаю, что то, что вы подозреваете, отсутствует, так это сложность, необходимая для логики, чтобы взять инструкцию или код операции и перевести ее в несколько состояний внутри вашего процессора. Он может быть сложным, но можно создать несколько простой конечный автомат, а затем расширить его базовыми логическими понятиями.

Например, предположим, что вы создаете шаги микроинструкций для операции MOVE. Это можно в общих чертах описать 3 шагами: 1) установить содержимое регистра источника на внутреннюю шину, 2) стробировать тактовую частоту записи целевого регистра, 3) отменить утверждение содержимого регистра источника с внутренней шины. Шаги с 1) по 3) описывают синхронизацию для разрешения вывода регистра (OE) и разрешения записи регистра (WE), которые могут быть выборочно распределены в любой регистр источника и любой целевой регистр, подключенный к общей внутренней шине с демультиплексорами.

Если у вас нет особой практики создания конечных автоматов, может быть полезно взглянуть на различные подходы, чтобы дать вам еще один строительный блок для генерации сигналов управления от вашего микропоследователя.

Придерживаться. Количество приобретенных вами знаний будет феноменальным. И, надеюсь, вам будет очень весело.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.