Buduję prosty 16-bitowy procesor w Logisim i mam ALU gotowe i kody operacyjne, które chcę mieć. Teraz naprawdę trudno mi znaleźć odpowiednie kodowanie dla poleceń, tak aby różne obwody (np. Logika, arytmetyka) nie potrzebowały wszystkich przewodów sterujących (które budują kodowanie) jako danych wejściowych, ale jak najmniej. Czy są jakieś strategie lub metody, które pomagają w wydajnym projektowaniu kodu operacyjnego?
dzięki z góry
cpu
computer-architecture
Benjoyo
źródło
źródło
Odpowiedzi:
Myślę, że dobrym podejściem jest studiowanie innych zestawów instrukcji.
Mały byłby MSP430 od TI, jest to 16-bitowy procesor z około 22 instrukcjami.
http://www.physics.mcmaster.ca/phys3b06/MSP430/MSP430_Instruction_Set_Summary.pdf
Możesz także zajrzeć do AVR-ów Atmela, które mają również dość mały zestaw instrukcji.
W moim małym projekcie próbowałem opracować prosty 32-bitowy procesor w VHDL z małym zestawem instrukcji (14 instrukcji):
http://www.blog-tm.de/?p=80
Ze względu na mój obecny wolny czas nie jest w pełni ukończony. Instrukcje są zaimplementowane, ale dwie nie są testowane i być może brakuje niektórych flag stanu.
źródło
Zbadaj (ale nie powielaj) podejście ARM do kodowania instrukcji. Jest mocno zorientowany na prefiks (jak podejście drzewa Huffmana zalecane przez Dzardę) i bardzo jednolity pod względem tego, gdzie rejestr wybiera część instrukcji.
Niewyobrażalne, ale niezawodne podejście polega na wyliczeniu wszystkich posiadanych sygnałów sterujących , które prawdopodobnie będą miały więcej niż 16 bitów, a następnie próbie zminimalizowania na nich logiki typu Karnaugh.
źródło
Kiedyś próbowałem zrobić 4-bitowy procesor z rdzeniem instrukcji o długości 8 bitów w Logisim. Skończyło się na prostej maszynie stanów, więcej niż procesorze, naprawdę.
Losowe rzeczy do poszukiwania
Doskonałe wideo na Computerphile o drzewach Huffmana:
źródło
ISA, który napisałem dla klasy, miał kiedyś 4-bitowy kod operacyjny:
1XXX ALU instructions 01XX jump, jump register, call etc 001X branch not equal, branch equal zero 000X 0 - load, 1 - store
Zamiast być najbardziej optymalnym, jest to jeden z łatwiejszych stylów do konstruowania / projektowania bramek, ponieważ sygnał wejściowy pojedynczego bitu może całkowicie kontrolować ścieżkę logiczną. Alternatywnie możesz Huffman Code najczęściej używanych symboli i zerować je, aby uzyskać kod operacji o stałej długości.
źródło
Jedną rzeczą, którą musisz wziąć pod uwagę, jest to, czy możesz zezwolić na jakąkolwiek formę instrukcji składającej się z wielu słów lub na coś, co może „działać” jak instrukcja zawierająca wiele słów; jeśli to zrobisz, możesz rozważyć, czy użyć dodatkowych słów instrukcji po głównej instrukcji, czy też poprzedzających ją słów. Zezwalanie na prefiksy i słowa następcze może zwiększyć złożoność obsługi przerwań, ale można uniknąć konieczności umieszczania rzadko używanych instrukcji w tej samej przestrzeni opcode, co często używane.
Jeśli instrukcje są pobierane w cyklu przed ich wykonaniem, można mieć instrukcję „gałęzi warunkowej”, która albo powoduje pominięcie następnego słowa instrukcji, albo przekazanie jej zawartości bezpośrednio do licznika programu; taki projekt może dodać dodatkową złożoność do przerywania sekwencjonowania, ale może złagodzić potrzebę użycia dużej części przestrzeni kodu operacyjnego dla instrukcji „rozgałęzienia”, „skoku” i „wywołania”, jednocześnie umożliwiając znacznie szerszy zakres warunków rozgałęzienia niż byłoby to możliwe. Ponieważ brana gałąź będzie na ogół wymagać martwego cyklu po wykonaniu samej instrukcji bez względu na to, skąd pochodzi adres, posiadanie adresu z następującego słowa, które zostało pobrane, ale nie zostanie wykonane, nie kosztuje dodatkowych kosztów czas.
Mimo że przeniesienie adresu docelowego poza instrukcje oddziału zmniejszy ilość zajętego miejsca w kodzie operacyjnym, 16-bitowy format kodu jest nadal dość napięty. Korzystanie z instrukcji prefiksu może w tym pomóc. Jeśli, na przykład, chcemy mieć 32 rejestry, pozwalając, aby każdy rejestr był niezależnie określony jako source1, source2 i miejsce docelowe wymagałyby 15 bitów w kodzie operacyjnym, pozwalając na uzyskanie łącznie dwóch instrukcji. Niezbyt przydatne. Z drugiej strony byłoby fajnie móc użyć dowolnego z 32 rejestrów dla każdego z trzech operandów. Można zrównoważyć te dwa cele, wykonując dowolną operację ALU, która nie jest poprzedzona przedrostkiem, używając ośmiu bitów, aby dokonać dwóch wyborów jednego z szesnastu rejestrów, ale operacja ALU, która następuje bezpośrednio po przedrostku, wykorzystuje niektóre bity w prefiksie wzdłuż z ośmioma z następującej instrukcji, aby umożliwić niezależny wybór obu źródeł i miejsca docelowego z pełnego zestawu 32. Instrukcje, które używają górnych rejestrów, zajęłyby dwa słowa / cykle zamiast jednego, ale w niektórych przypadkach taki kompromis może być opłacalny. Największą trudnością związaną z używaniem prefiksów jest to, że należy albo zapobiec wystąpieniu przerwania między prefiksem a następną instrukcją, albo też upewnić się, że jeśli wystąpi tam przerwanie, instrukcja po prefiksie będzie nadal korzystać z odpowiednich rejestrów [np. Poprzez uruchomienie programu -counter save logic zapisz adres ostatniej wykonanej instrukcji nieprefiksowej]. ale w niektórych przypadkach taki kompromis może być opłacalny. Największą trudnością związaną z używaniem prefiksów jest to, że należy albo zapobiec wystąpieniu przerwania między prefiksem a następną instrukcją, albo też upewnić się, że jeśli wystąpi tam przerwanie, instrukcja po prefiksie będzie nadal korzystać z odpowiednich rejestrów [np. Poprzez uruchomienie programu -counter save logic zapisz adres ostatniej wykonanej instrukcji nieprefiksowej]. ale w niektórych przypadkach taki kompromis może być opłacalny. Największą trudnością związaną z używaniem prefiksów jest to, że należy albo zapobiec wystąpieniu przerwania między prefiksem a następną instrukcją, albo też upewnić się, że jeśli wystąpi tam przerwanie, instrukcja po prefiksie będzie nadal korzystać z odpowiednich rejestrów [np. Poprzez uruchomienie programu -counter save logic zapisz adres ostatniej wykonanej instrukcji nieprefiksowej].
Korzystanie z instrukcji zawierających wiele słów utrudni niektóre aspekty projektu, ale może zmniejszyć potrzebę podejmowania innych trudnych decyzji.
źródło
Ten facet ma najlepsze szczegóły na temat rozumienia twardego okablowania zakodowanej części dekodera, która wyjaśnia linie sterujące dla zakodowanego procesora: http://minnie.tuhs.org/CompArch/Tutes/week03.html Jak widać, twój wybór w Opcodes naprawdę wpływa na złożoność logiki dekodowania.
źródło