設計介紹:
這裡就是在控制單元的輸入口加入一個使能信号en,當這個en為0的時候,基于控制單元的各個子子產品的使能信号為0,而當en為1的時候,其輸出使能信号為1。
其代碼修改部分為:
proc_controlunit.VHD中
當使能en為0的時候,指令狀态在STATE_RESET上,就是系統暫停複位。
系統仿真介紹:
如仿真所示,當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。
其設計代碼如下所示:
當控制器接收到這幾個指令的時候,控制器就會做出每個指令對應的操作。具體見下個部分的仿真效果。
系統仿真介紹:
從上面的仿真可以看到,當輸入的指令為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指令為例子,其仿真代碼如下所示:
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代碼為:
其仿真原理和前面的相同。
本系統主要是将老師提供的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
其餘指令可以用相同的方法進行擴充。
針對每個指令,分别計算其結果和status的值。
這個子產品涉及到status寄存器狀态的變換,status的值根據課題任務書的ALU部分的介紹即可。(注意,這裡Status的運算,請仔細核對任務書上的計算方法)