天天看點

【微處理器】基于FPGA的微處理器verilog設計

設計介紹:

這裡就是在控制單元的輸入口加入一個使能信号en,當這個en為0的時候,基于控制單元的各個子子產品的使能信号為0,而當en為1的時候,其輸出使能信号為1。

其代碼修改部分為:

proc_controlunit.VHD中

【微處理器】基于FPGA的微處理器verilog設計

當使能en為0的時候,指令狀态在STATE_RESET上,就是系統暫停複位。

系統仿真介紹:

【微處理器】基于FPGA的微處理器verilog設計

如仿真所示,當en為1的時候,系統各個子產品的使能變高,系統開始工作,當en為低電平的時候,那麼各個子產品的使能信号為0,那麼這個時候整個系統就沒有工作。

為了設計控制單元,本任務需要設計一個基本的寄存器操作,本課題需要對控制系統設計的幾個指令操作。

設計介紹:

指令說明,

LDI(Rd<-K):0100_KKKK_KKKK_dddd(注意,這裡K為常數,d為目标寄存器位址)

MOV(Rd<-Rr):0000_0100_rrrr_dddd(注意,這裡r為源位址,d為目标寄存器位址)

SSR(SEG[b] <-1): 0000_0000_0010_1bbb,

NOP:0000_0000_0000_0000

當執行LDI指令的時候,常數K要指派給immediate_value,dddd指派給

register_p_1_addr_direct。

當執行MOV指令的時候,rrrr指派給register_p_0_addr_direct,dddd指派給

register_p_1_addr_direct。

當執行SSR指令的時候,bbb指派給sreg_bit_index。

當執行NOP的時候,就是16個0。

其設計代碼如下所示:

【微處理器】基于FPGA的微處理器verilog設計
【微處理器】基于FPGA的微處理器verilog設計
【微處理器】基于FPGA的微處理器verilog設計

當控制器接收到這幾個指令的時候,控制器就會做出每個指令對應的操作。具體見下個部分的仿真效果。

系統仿真介紹:

【微處理器】基于FPGA的微處理器verilog設計

從上面的仿真可以看到,當輸入的指令為LDI,MOV,SSR,NOP時,控制器分别輸出不同的控制信号。

為了設計控制單元,本任務需要設計一個基本的算術指令操作,本課題需要對控制系統設計幾個指令操作。具體見下面的部分。

ANDI(Rd<-Rd+K):1010_KKKK_KKKK_dddd,K指派給immediate_value,dddd指派

給register_p_1_addr_direct。

AND(Rd←Rd and Rr):0000_0101_rrrr_dddd,rrrr指派給register_p_0_addr_direct,dddd指派給register_p_1_addr_direct。

ORI(Rd←Rd or K):1000_KKKK_KKKK_dddd,K指派給immediate_value,dddd指派

給register_p_1_addr_direct。

OR(Rd←Rd or Rr): 0000_0110_rrrr_dddd,rrrr指派給register_p_0_addr_direct,dddd指派給register_p_1_addr_direct。

EORI(Rd←Rd xor K):1001_KKKK_KKKK_dddd,K指派給immediate_value,dddd指派

給register_p_1_addr_direct。

EOR(Rd←Rd xor Rr): 0000_0111_rrrr_dddd,rrrr指派給register_p_0_addr_direct,dddd指派給register_p_1_addr_direct。

ADDI(Rd←Rd + K):1010_KKKK_KKKK_dddd,K指派給immediate_value,dddd指派

給register_p_1_addr_direct。

ADD(Rd←Rd + Rr):0000_1000_rrrr_dddd,rrrr指派給register_p_0_addr_direct,dddd指派給register_p_1_addr_direct。

ADC(Rd←Rd + Rr + C):0000_1001_rrrr_dddd,rrrr指派給register_p_0_addr_direct,dddd指派給register_p_1_addr_direct。

SUBI(Rd←Rd - K - C):1011_KKKK_KKKK_dddd,K指派給immediate_value,dddd指派

給register_p_1_addr_direct。

SUB(Rd←Rd - Rr):0000_1010_rrrr_dddd,rrrr指派給register_p_0_addr_direct,dddd指派給register_p_1_addr_direct。

SUBC(Rd←Rd - Rr - C): 0000_1011_rrrr_dddd,rrrr指派給register_p_0_addr_direct,dddd指派給register_p_1_addr_direct。

NEG(Rd ← not(Rd) + 1): 0000_0000_0001_dddd。dddd指派給register_p_1_addr_direct。

COM(Rd ← not Rd): 0000_0000_0011_dddd。dddd指派給register_p_1_addr_direct。

LSL(Rd ← Rd[6:0] & '0'):0000_0000_0100_dddd。dddd指派給register_p_1_addr_direct。

LSR(Rd ← '0' & Rd[7:1]):0000_0000_0101_dddd。dddd指派給register_p_1_addr_direct。

ROL(Rd ← Rd[6:0] & C):0000_0000_0110_dddd。dddd指派給register_p_1_addr_direct。

ROR(Rd ← C & Rd[7:1]):0000_0000_0111_dddd。dddd指派給register_p_1_addr_direct。

ASL(Rd ← Rd[6:0] & '0'):0000_0000_1000_dddd。dddd指派給register_p_1_addr_direct。

ASR(Rd ← Rd[7] & Rd[7:1]):0000_0000_1001_dddd。dddd指派給register_p_1_addr_direct。

CPI(Rd - K):0010_KKKK_KKKK_Dddd。

CP(Rd - Rr):0000_0001_rrrr_dddd。

    這裡涉及到的指令比較多,這裡就不做進一步的介紹了。

這個是AND和ANDI運算,每個指令的設計VHDL代碼均類似。我們以控制器輸出AND指令為例子,其仿真代碼如下所示:

【微處理器】基于FPGA的微處理器verilog設計

JMP(PC←K):0001_KKKK_KKKK_0000;

RJMP(PC←PC + K + 1):0001_KKKK_KKKK_0001;

IJMP(PC←Rr):0001_0000_rrrr_0010

BRSS(PC←PC + K + 1):0011_KKKK_KKKK_1bbb。

BRSC(PC←PC + K + 1):0011_KKKK_KKKK_0bbb。

這裡這些指令是針對事programmer counter的。

其對應的VHDL代碼為:

【微處理器】基于FPGA的微處理器verilog設計

其仿真原理和前面的相同。

        本系統主要是将老師提供的netlist形式的ALU代碼重新設計,設計為VHDL的ALU子產品。主要通過指令輸入,通過case語句進行設計。

本子產品主要涉及如下幾個指令:

ALU_ONESCOMP         

ALU_TWOSCOMP       

ALU_ADD_MODE       

ALU_ADD_WC_MODE    

ALU_SUB_MODE       

ALU_SUB_WC_MODE    

ALU_OR_MODE        

ALU_AND_MODE       

ALU_XOR_MODE      

ALU_LOGICAL_LEFT   

ALU_LOGICAL_RIGHT 

ALU_ROTATE_LEFT    

ALU_ROTATE_RIGHT  

ALU_ARTHMETIC_LEFT 

ALU_ARTHMETIC_RIGHT

其餘指令可以用相同的方法進行擴充。

【微處理器】基于FPGA的微處理器verilog設計

 針對每個指令,分别計算其結果和status的值。

這個子產品涉及到status寄存器狀态的變換,status的值根據課題任務書的ALU部分的介紹即可。(注意,這裡Status的運算,請仔細核對任務書上的計算方法)

繼續閱讀