(1)運(yùn)算單元ALU
module alu(x,y,op,z,flag,calc,rst,ack,clk);
x、y為輸入操作數(shù),op為操作碼,z為輸出結(jié)果,flag為輸出運(yùn)算結(jié)果標(biāo)志,calc為運(yùn)算使能控制信號(hào),ack為運(yùn)算結(jié)束應(yīng)答。本模塊完成op定義的運(yùn)算,并給出標(biāo)志位和應(yīng)答。
(2)內(nèi)部堆棧STACK
module stack(clk,rst,pop,push,data_i,data_o,sp,ack);
pop、push為堆棧的彈出及壓入操作信號(hào),data_i、data_o為數(shù)據(jù)輸入輸出,sp為堆棧指針,ack為堆棧操作結(jié)束應(yīng)答。本模塊根據(jù)pop、push信號(hào)對堆棧進(jìn)行操作。
(3)微碼ROM
module microcoderom(mcp,mcr);
MCP為微碼ROM的指針,MCR為微碼寄存器。根據(jù)微碼指針MCP,在MCR上輸出MCP處的微碼數(shù)據(jù)。
(4)微碼指令指針調(diào)整模塊MCPC
module mcpc(clk,rst,load,new_mcp,hold,remap,instr,mcp);
微碼指針有保持、重加載、重映射三種操作。重加載是用new_mcp的值作為新的MCP值。重映射是將CPU指令I(lǐng)nstr對應(yīng)的微碼序列首地址作為新的MCP值。
load信號(hào)有效,用new_mcp的值給MCP賦值;
hold信號(hào)有效,保持MCP值不變;
remap信號(hào)有效,則將CPU指令I(lǐng)nstr做為索引,得到Instr指令對應(yīng)的微碼序列首地址,將首地址賦給MCP。
以上三個(gè)信號(hào)均無效時(shí),每時(shí)鐘MCP自動(dòng)加1。
(5)外存讀寫接口MEMRW
module memrw(clk,addr,data_read_in,data_write_out,ack,rst,rd,wr,wb_stb_out,wb_cyc_out,wb_ack_in,wb_addr_out, wb_data_in,wb_data_out,wb_we_out);
對外接口采用開源的wishbone總線標(biāo)準(zhǔn),wb*信號(hào)是wishbone相關(guān)信號(hào)。根據(jù)rd、wr讀寫信號(hào),操作wishbone信號(hào),等待wishbone的應(yīng)答,然后將數(shù)據(jù)和應(yīng)答信號(hào)反饋給主控模塊。
3.4 本JavaCard CPU設(shè)計(jì)的特點(diǎn)
(1)主控模塊與其他從模塊之間用使能信號(hào)和應(yīng)答信號(hào)保持同步,從模塊在完成操作后只需給出應(yīng)答信號(hào),即可匹配不同速度的從模塊。
(2)微碼指令的設(shè)計(jì)。所有的微碼指令為單指令,即不帶任何操作數(shù)。微碼指令本身包含所需操作的信息,如在哪兩個(gè)寄存器之間轉(zhuǎn)移數(shù)據(jù)等。對于跳轉(zhuǎn)操作等必須帶后續(xù)操作數(shù)的指令采取變通方法,先將所需操作數(shù)存入內(nèi)部寄存器,再執(zhí)行跳轉(zhuǎn)等指令。詳細(xì)示例為:
微碼定義為16位。位15指示本微碼是指令還是數(shù)據(jù)。位15==1表示是數(shù)據(jù),此時(shí)微碼的低8位是一個(gè)數(shù)據(jù),處理此微碼時(shí),要將此8位數(shù)據(jù)提取出來,存入內(nèi)部寄存器;位15==0表示是指令。當(dāng)需要執(zhí)行一個(gè)跳轉(zhuǎn)Jmp 0x0809時(shí),微碼序列方法使用三條微碼表示:
0x8008 //位15==1,是數(shù)據(jù)型微碼
0x8009
JMP //指令型微碼助記符
執(zhí)行時(shí),遇到前面兩個(gè)數(shù)據(jù)型微碼,會(huì)將08和09存入內(nèi)部16位數(shù)據(jù)寄存器的高低8位;執(zhí)行JMP指令時(shí),隱含使用此內(nèi)部數(shù)據(jù)寄存器。
(3)所有的微碼指令是單周期指令。由于采用了(2)中所述的單指令微碼,在執(zhí)行當(dāng)前微碼指令的同時(shí)讀取下一條微碼指令,可以做到每個(gè)時(shí)鐘執(zhí)行一條微碼。
(4)簡潔的主控邏輯。所有JavaCard指令均由微碼執(zhí)行,不采用硬件陷入、軟件模擬方式,簡化了主控邏輯設(shè)計(jì)。主控模塊狀態(tài)機(jī)僅有EXEC_MC和HLT兩個(gè)狀態(tài)。CPU復(fù)位后,一直處于執(zhí)行微碼EXEC_MC狀態(tài),直到執(zhí)行HLT微碼指令。
(5)適應(yīng)性好。采用了應(yīng)答機(jī)制,可以匹配不同速度的部件;對外采用wishbone總線,簡化了各部件接口的設(shè)計(jì),方便了外部設(shè)備的擴(kuò)充。
(6)I/O采用內(nèi)存映射方式統(tǒng)一編址,避免了非Java指令的引入,保證了兼容性。
3.5 Verilog表述的微碼處理器核心邏輯
下面是主控邏輯框架代碼的一部分。本段代碼體現(xiàn)了如何處理數(shù)據(jù)型微碼和指令型微碼,可以在YOUR_MICRO_CODE_INSTR處添加需要的微碼指令以及對應(yīng)的操作。
always@(posedge clk or posedge reset)
begin
if(reset)
begin
new_mcp[15:0]<=init_ADDR;//初始化微碼
//序列首地址
{pop,push,alu_calc,memrd,memwr,load_mcp,hold_mcp,remap_mcp}<=8′b00000000;
H_READED<=1′b0;//表示是否讀過了一次
//數(shù)據(jù)型微碼
state[1:0]<=EXEC_MC;
end
else
begin
case(state[1:0])
EXEC_MC:
begin//首先根據(jù)mcr的位15判斷是數(shù)據(jù)型
//微碼還是指令型微碼
if(mcr[15])//mcr中存放微碼,位15==1表示
//此微碼是數(shù)據(jù)型,先保存高8位,再低8位
begin
if(H_READED==1′b0)//首個(gè)數(shù)據(jù)型
//微碼,數(shù)據(jù)保存到高8位
begin
{mcdata[15:8]}<=mcr[7:0];
//mcdata是內(nèi)部數(shù)據(jù)寄存器
H_READED<=1′b1;
end
else
begin
{mcdata[7:0]}<=mcr[7:0];
H_READED<=1′b0;
end
end
else//表示此微碼是指令,根據(jù)后面的15位
//分支操作
begin
case(mcr[15:0])
YOUR_MICRO_CODE_INSTR://
begin
……//定義的微碼操作
end
……//其他微碼指令處理
endcase
end//end for mcr為指令處理
end
HLT://state[1:0]=HLT,宕機(jī)狀態(tài)處理
…
endcase//end for state[1:0]
end//end for reset
end//end for always@(posedge clk or posedge reset)
系統(tǒng)采用微碼實(shí)現(xiàn),用微碼序列控制讀取Java指令、存儲(chǔ)數(shù)據(jù),實(shí)現(xiàn)Java指令。JavaCard指令被解釋執(zhí)行的過程如下:
讀取JavaCard PC處的JavaCard指令至指令寄存器Instr,發(fā)出remap信號(hào)給微碼指針調(diào)整模塊MCPC,微碼指針寄存器MCP得到新的JavaCard指令對應(yīng)的微碼序列首地址,MCP的變化使微碼指令寄存器MCR變?yōu)樵撐⒋a序列的首個(gè)微碼指令,再由微碼處理器執(zhí)行此MCR中的微碼。
評論
查看更多