2011-06-09 43 views
1

我最近開始使用邏輯級設計作爲業餘愛好者,但現在已經發現自己運行在軟件上,在那裏我更不能勝任。我已經基於Etienne Sicard的論文「一個非常簡單的微處理器」,完全鬆散地設計了Logisim中的自定義4位CPU。現在它已經構建了非常有限的函數(加法,邏輯AND,OR和XOR),沒有任何可檢測到的錯誤(交叉手指),我遇到了爲它編寫程序的問題。 Logisim具有將十六進制數字腳本導入RAM或ROM模塊的功能,因此我可以使用自己的微指令代碼爲其編寫程序,但我從哪裏開始?我確實在軟件設計的最基本的可能級別上,並不知道從哪裏開始。對於學習這種低水平的編程或建議我應該嘗試從這裏學習的資源有什麼好建議?非常感謝,我知道這可能不是這個論壇上有史以來最直接適用的問題。建立一個自定義的機器代碼從頭開始

+0

投票關閉,因爲太廣泛。您可能會對http://www.nand2tetris.org/course.php – 2015-05-23 13:11:14

回答

0

我不知道你提到的論文。但是如果你設計了你自己的定製CPU,那麼如果你想爲它編寫軟件,你有兩種選擇:a)把它寫在機器代碼中,或者b)編寫你自己的彙編器。

很明顯,我會去與b。這將需要你換檔一些,​​並做一些高級編程。你打算寫的是一個在PC上運行的彙編程序,它將一些簡單的彙編語言轉換成你的定製機器代碼。彙編程序本身將是一個高級程序,因此,我建議用高級編程語言編寫它,該語言既適用於字符串操作又適用於二進制操作。我會推薦Python。

你基本上要你的彙編能在一個文本文件中像這樣來讀:

mov a, 7 
foo: 
    mov b, 20 
    add a, b 
    cmp a, b 
    jg foo 

(我剛纔提出這個方案的過程,它的廢話。)

,並轉換的每一行代碼進入該指令的二進制模式,輸出一個二進制文件(或者一個十六進制文件,因爲你說你的微控制器可以讀取十六進制值)。從那裏,你將能夠將程序加載到CPU上。

所以,我建議你:

  1. 拿出(在紙上)是爲每個機器支持的(你可能已經做到了這一點)操作碼,
  2. 的簡單書面陳述彙編語言
  3. 學習簡單的Python,
  4. 編寫一次只讀取一行的Python腳本(sys.stdin.readline()),找出它是哪個操作碼以及它需要的值,並將相應的機器碼輸出到stdout。
  5. 用您的彙編語言編寫一些可以在CPU上運行的彙編代碼。

聽起來像一個有趣的項目。

+0

感興趣,非常有幫助,但它實際上是在我所在的地方前一兩步。我相信這將在未來有用,但現在我真的只關心*做什麼而不是如何做。也許有一些如何在現有的ISA中進行邏輯或數學運算的例子,我可以用它來找出在我的機器代碼中可以做什麼。從那裏我可以進一步改進,如構建彙編程序或添加更多操作。正如你所提到的,我已經制定了我的語言(目前爲止只有6個操作碼,其中一個是NOOP),但我正在爲如何處理它而捕魚。再次感謝! – 2011-06-09 07:31:40

+0

對不起,我剛看到這個。也許我對你在哪裏感到困惑。我試圖建議*做什麼而不是如何做。從這個問題來看,你似乎有機器工作,並且你可以導入機器代碼,但是你被卡住了,因爲你不能編寫更大的程序,因爲輸入所有操作碼都很難。這就是爲什麼我建議編寫一個彙編程序作爲下一個邏輯步驟。或者你的意思是你正在尋找關於在你的機器代碼中寫什麼程序的建議?在這種情況下,我認爲這個問題不適合SO。 – mgiuca 2011-06-14 05:48:18

0

因爲你的指令集非常小,並且基於mguica答案的線程,我會說下一步是繼續和/或完全測試你的指令集。你有旗幟嗎?你有分支指令嗎?現在只需手工生成機器碼。標誌是棘手的,特別是溢出(V)位。你必須檢查進位並執行msbit加法器才能正確執行。由於指令集足夠小,您可以嘗試各種組合的背靠背說明,然後按或,然後按xor,然後按加,或按其後按xor等。然後在分支中混合。返回標誌,如果xor和/或例如不觸摸進位和溢出,則確保您看到進位和溢出爲零且未被邏輯指令觸及並且進位和溢出爲一而未被觸及,並且還獨立顯示進位和溢出是分開的,一對一關閉的,沒有被邏輯觸及等等,確保所有的條件分支只在這一個條件下工作,導致帶有在兩種狀態中被忽略的標誌位的各種條件分支,以確保條件分支忽略他們。另外驗證是否條件分支不應該修改它不是。同樣,如果條件不會導致條件標誌未被觸及的分支...

我喜歡使用隨機化,但它可能比以後更多的工作。我喜歡獨立開發指令集的軟件模擬器,我發現使用起來更容易,這種邏輯在批量測試中有時也更容易使用。然後你可以隨機化一些簡短的指令列表,改變指令和寄存器,自然地測試測試人員手動計算一些結果,測試完成後的寄存器狀態和標誌位狀態。然後讓這個隨機列表更長一些,在某些時候你可以拿一個長指令列表並在邏輯模擬器上運行它,看看邏輯是否與指令集模擬器產生相同的寄存器結果和標誌位,如果它們發生變化爲什麼。如果不嘗試另一個隨機序列,而另一個。在開始測試之前用質數填充寄存器是一個非常好的主意。

回到單獨的指令測試和標誌遍歷所有的角落情況0xFFFF + 0x0000 0xFFFF + 1,類似的東西只放在操作數的右邊和右邊,結果是一個數字遠離標誌變化在旗幟發生變化的地方,就在那一邊。例如,如果它們使用零標誌,則具有各種數據模式,測試結果位於0x0000和0xFFFF 0xFFFE 0x0001 0x0002等等。可能是步行結果0x0001結果0x0002,ox0004等

希望我理解你的問題,並沒有指出明顯的或你已經做到目前爲止。