【前言】
最近手上寫了一個練手的小項目,項目的大致要求是實現一個取指,執行電路。取指的指令預存在,從ROM中讀取指令后,根據預定的解碼規則,對指令進行解碼,并執行相對應的操作。發出來和大家共同分享。
該工程的設計要求如下:
在ram模塊中,儲存有初始化的指令數據。我們要設計一個取指電路,并能根據不同的指令執行不同的操作。指令數據為16bit.
指令編碼定義如下:
如果指令代碼為0,則下一個狀態為空閑。如果指令的低位8位為0,高位8位非0,則讀取指定高位8位的存儲器,并將其寫入obuf0。如果指令的低8位非0,且高8位也不是0,則將下8位作為數據,寫入地址為上8位的存儲器中。
List4顯示了指令獲取電路。它實例化了五個模塊:PC0(程序計數器、8位計數器)、Ir0(指令寄存器、16位計數器)、OBUF0(輸出緩沖器、16位計數器)、STATE0(狀態機)和RAM0(存儲器,8位256字塊RAM)。模塊pc0用于指定要讀取的地址,以便從ram0獲?。ㄌ崛。┲噶畲a。指令代碼存儲在IR0中。
此指令獲取操作在兩種狀態下執行:fetcha和fetchb。fetcha用于取地址操作,該地址作為讀取ram中指令的地址,fetchb用于指令寄存操作,將指令寄存到指令寄存器中。
在execa和execb狀態下,執行表1中的操作。如果存儲在IR0中的指令代碼為0,則下一個狀態為空閑。如果指令的低位8位為0,高位8位非0,則讀取指定高位8位的存儲器,并將其寫入obuf0。如果指令的下8位非0,則將下8位寫入地址為上8位的存儲器。
指令解碼列在table1中
頂層代碼如圖所示:
下面是該工程的測試模塊:
下面的ram模塊的代碼:
狀態控制模塊的代碼:
計數器模塊的代碼:
設計說明
該工程有以下模塊組成:
PC0(程序計數器、8位計數器)、
Ir0(指令寄存器、16位計數器)、
OBUF0(輸出緩沖器、16位計數器)、
STATE0(狀態機)、
RAM0(存儲器,8位256字塊RAM)。
其中,PC0,IR0,OBUF0是例化計數器模塊得到的,該計數器模塊擁有計數和寄存數據兩個功能,分別由端口 inc 和 端口 load 控制。
當 inc有效時,在下一個時鐘,會將計數器內部的計數器自增1,并在q端輸出。
當load信號有效時,在下一個時鐘會將D端 的數據寄存到該計數器的寄存器中,并在Q端輸出。
PC0利用的是計數器的計數功能,用于產生取指令的地址信息。
IR0利用的是計數器的寄存功能,用于將ram中取出的指令暫時寄存。
OBUF0利用的是計數器的寄存功能,用于將輸出中暫時寄存。
在狀態機控制模塊中,設置了以下五個狀態:
IDLE:空閑態。
FETCHA:取地址狀態。同時將程序計數器的內部計數值加一。
FETCHB:取指令,指令寄存狀態。將從ram中讀出的指令寫入到指令寄存器模塊中。
EXECA:指令解碼模塊,判斷指令的停止,讀,寫控制信號。如果為寫信號,將指令的低8位作為數據寫到高8位對應的地址中。如果為讀指令,跳轉到EXECB狀態,將指令的低8位輸出。如果停止信號為真3,跳轉到空閑狀態。
EXECB:執行狀態。用于將指令的低8位輸出。
在ram模塊中,儲存有初始化的指令數據。
編輯:jq
-
cpu
+關注
關注
68文章
10882瀏覽量
212221
原文標題:簡單的CPU取指執行電路設計
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論