因為我通常與學生合作,我總是在Goldilocks區域的簡單CPU上尋找簡單的CPU,最好是在Verilog中。也就是說,不太簡單,也不難。我對由[FPGA4Student]呈現的16位RISC處理器非常希望,但是沒有一些額外的工作,它很可能無法用於其預期目的。
CPU本身非常簡單,並且在相對較長的網頁上適合。但是,關於它的細節有點稀疏。這並不總是一個糟糕的事情。您可以提供大量幫助。然後,你也可以不清楚。但是,更糟糕的是將其工作所需的模塊之一失踪!您可能會建議這是一個練習委派讀者,但最有可能應該解釋的方式。
起初,我準備刪除書籤以及繼續前進。然後,我決定修復這種風格的過程以及對其進行比特分析可能比僅研究完全工作的設計更具效力。所以我決定與你分享我的維修,並更多地看著設計更多。最重要的是,我將究竟可以在互聯網模擬器上展示如何在互聯網模擬器中運行的事情,以便您可以在沒有軟件應用程序安裝中進行實驗。當然,如果您對Verilog Toolchain感到滿意(如Xilinx或Altera,甚至像Icarus或Cver這樣的免費版),您也不應該發出這項工作。這次我將恰好專注於CPU如何以及下次將如何用一些免費工具展示如何模擬它。
該設計
讓我們從CPU的框圖開始。與其他RISC架構不大,特別是任何類型的不符合管道。程序計數器(PC)驅動方向存儲器。由於每個方向為四個字節,有一個專用的加法器向每個方向添加四個到PC。 Mux讓您為下一個方向或跳轉目標(實際上,絕對跳轉,計算的分支或返回地址)縮短PC。對於計算的分支,還有一個更專用的加法器。
處理髮生在執行不同操作的算術邏輯系統(ALU)中。目的地可以是主存儲器或其中一個寄存器。寄存器數據使用舊技術來防止典型的問題。假設您可以檢查每個週期的一個註冊。如果您只能在指令中啟用一個註冊,則這很好。但是,如果您啟用指示要做類似的添加兩個寄存器,除非您伸出方向時間,否則您將難以加載它們。這就是寄存器文件有兩個輸出端口的原因。
現實是,寄存器數據是至少一個區域,除此之外,風格不會合成真正的硬件。對於一件事,初步塊中有一個用於旋轉寄存器的循環。大多數合成工具都會拋棄。使用重置信號會更好地關閉。其他可能的問題取決於您將要定位的精確FPGA以及您使用的工具。
設計人員為寄存器提供了兩個已被檢查的端口,但底層存儲是相同的。這將使難以使用專門的RAM單元格。一種更典型的方法是僅利用兩個單獨的寄存器塊,每個寄存器塊為每個被檢查的端口。撰寫將數據發送到兩個塊中所以從外部無法講述差異。但經常,這將導致更快的設計和更緊湊的設計。
重寫寄存器數據將是令人著迷的(並且是非常困難的)。但是,如果您不會展望硬件,您很可能不會注意到任何類型的差異。
與大多數相似的CPU一樣,整個控制器向MUXES選擇了選擇已發送的數據的位置。特別是,處理器的數據路徑中有四個muxes:
PCSRC – 將“下一個”PC值路由到程序計數器
RegDST – 選擇從兩個字段朝方向撰寫的寄存器(圖顯示了三個輸入,但這似乎是錯誤)
BSRC – 選擇對ALU的第二個分歧(即時值或寄存器值)
WBSRC – “回寫”MUX選擇將數據設置為寫入的寄存器
設計表
其餘的樣式顯示了十三個指令,五個方向格式,以及每個格式所需的控制信號。每個分類中指令的細微差別取決於ALU所設置的內容。換句話說,添加方向和減法方向正是完全相同,除了ALU的作用。您可以想像,ALU將兩個輸入以及操作代碼以及創建輸出。
原始發布並沒有真正說明哪個指令在哪個類別中,但拼圖非常簡單出去。噸以及商店指令在內存中獲取格式。平等的分支以及不等於指令的分支在分支類別中。跳轉方向有自己的格式。所有其他指示都是“數據處理”。一張表顯示了一個“漢明距離”op代碼,但是,這不會出現在否則的任何地方 – 包括在代碼中 – 所以我懷疑它是一個剪切和粘貼錯誤。
這兩個表做了總結運營要求,以使CPU工作總結一下。有九個獨特的控制信號:
regstst – 這對應於在完全相同名稱的圖表中的mux以及選擇目標是寄存器(在代碼中顯示為REG_DST)
alusrc – 選擇ALU分歧的源(圖中的BSRC MUX與圖中的BSRC MUX相同,並在代碼中顯示為ALU_SRC)
memtoreg – 當內存進行註冊傳輸時,激活(代碼中的mem_to_reg)
撰寫 – 撰寫時,撰寫應該轉到寄存器(代碼中的REG_WRITE)
MEMREAD – 當被選中的內存是方向的源數據(代碼中的MEM_READ)設置
MEMWRITE – 當內存是撰寫目標時設置(代碼中的MEM_WRITE)
分支 – 當分支正在開發時(BEQ以及代碼中的BNE信號組合)
aluop – 結合部分指令,選擇在ALU中執行的操作(代碼中的ALU_OP)
跳躍正在進行時跳躍
除名稱更改之外,該表將直接對應於控制系統中的Verilog,這是令人遺憾的,因為它使表格更難遵循。例如,此處是數據處理方向與操作碼0010的代碼:
4’B0010:// data_processing
開始
REG_DST = 1’B1;
ALU_SRC = 1’B0;
mem_to_reg = 1’b0;
REG_WRITE = 1’B1;
mem_read = 1’b0;
mem_write = 1’b0;
BEQ = 1’B0;
BNE = 1’B0;
ALU_OP = 2’B00;
跳= 1’b0;
結尾
將其與原始發布的表格進行比較,以及您將直接看到它映射。在英語中,方向是從兩個寄存器檢查的,該寄存器與alu操作代碼為0,也不是跳轉或分支。
莫名其妙地,即使不應該是必要的,也可以復制該塊。幸運的是,對於仿真,它不會真正重要以及大多數合成工具將弄清楚,並為您合併相同的代碼。
下次
在下一期間,我會究竟可以展示如何將風格縮小為我首選的快速風格工具,EDA遊樂場。有一個缺失的數據以及一些按摩需要在互聯網工具中使用它。但是,一旦你弄清楚一些特點,CPU就可以工作。如果您想要在模擬中偷偷窺視,您可以檢查下面的視頻。