В настоящее время я учусь в старших классах средней школы, и меня интересует компьютерная / электротехника, в частности, разработка микропроцессоров. Я прочитал 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