My dream CPU

Интро

Основната задача на CPU е да извършва аритметически и логически операции. Всички аритметически и логически операции имат 2 изходни операнда и един резултат. Представете си процесор който има 2 регистъра в които ще поставяме изходните данни, АЛУ и толкова регистри за резултат колкото са всички възможни операции, които неговото АЛУ може да извършва. След въвеждане на данните в регистрите АЛУ изчислява паралелно всички възможни операции между изходните данни и ги поставя в съответният регистър. Името на регистъра е името на операцията чийто резултат съдържа. Например регистър AplsB съдържа резултатът от сумата на двата изходни регистъра. На такъв тип процесор му е нужна една единствена инструкция. Това е инструкцията премести – move. Преместване на данните в посока памет регистър, за зареждане на изходните регистри. Както и move&start премества данните памет регистър и започва изчисления. Преместване на данните регистър с резултат обратно в паметта. Възможна е разбира се и преместване на данните от някой от изходните регистри обратно в паметта, операция копиране.

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

Процесорите работят с цели числа и с числа с плаваща запетая. Затова са необходими 2 модула с подобна структура. Единият ще работи с цели числа, а другият с числа с плаваща запетая. Модулът с плаваща запетая не извършва логически операции, поради формата на числата. Блок схемата е показана на фиг. 1.

Фиг. 1 Блок схема на целочислен модул и ма модул за работа с числа с плаваща запетая.

За да извършим дадено пресмятане трябва да заредим 2-та изходни регистъра. Да се пресметне резултата от АЛУ и да запишем резултата обратно в паметта. За да извършим всичко това ни трябва нещо с което да ходим върху паметта за да четем и пишем. Трябва ни модул за адресни изчисления, с който да определяме адрес от паметта в който ще четем или пишем.

Имаме 3 потока данни. Два за да заредим изходните регистри и един за да запишем резултата обратно в паметта. Следователно ни трябват 3 индексни регистъра които ще сочат към съответните места в паметта, където ще бъдат четени или записвани данни. Най-често използваната структура данни е масивът, паметта е линейна структура и това е логично. Мястото на елемент от масива се определя чрез началото на масива и отместването в него. Следователно за един поток данни ни е нужно един базов регистър, който ще сочи началото на масива и един индексен, който ще сочи отместването в масива. Това са 3 базови и 3 индексни регистъра. Да възможно е без базов регистър, като индексният се зареди с началото на масива и после се добави отместването, но при този случай губим стойността на началото на масива. Тя би била нужна и в следващо изчисление, а и се лишаваме от някои фокуси, за които ще стане въпрос по-нататък. Трябва ни и още 1 регистър, който ще съдържа краят на масива, с него ще сравняваме индексния регистър и ще проверяваме за край на масив.

Фиг. 2 Програмно достъпни регистри в адресният модул.