JavaCard指令處理器的FPGA設計和實(shí)現
1 JavaCard簡(jiǎn)介
智能卡是指集成了CPU、ROM、RAM、COS(芯片操作系統)和EEPROM,能儲存信息和圖像,具備讀/寫(xiě)能力,信息能被加密保護的便攜卡。智能卡的最基本標準是ISO/IEC7816。智能卡在銀行、電信等行業(yè)得到廣泛應用,但在發(fā)展過(guò)程中也遇到很多問(wèn)題,主要有:各廠(chǎng)商指令集不統一;編程接口A(yíng)PIs太復雜;開(kāi)發(fā)環(huán)境不通用,新卡開(kāi)發(fā)都要熟悉開(kāi)發(fā)環(huán)境;系統不兼容,專(zhuān)卡專(zhuān)用。由于開(kāi)發(fā)門(mén)檻過(guò)高,影響了智能卡的發(fā)展。市場(chǎng)對智能卡的發(fā)展提出了新的要求,Sun公司提出了Java Card開(kāi)放標準。JavaCard技術(shù)將智能卡與Java技術(shù)相結合,克服了智能卡開(kāi)發(fā)技術(shù)太專(zhuān)業(yè)、開(kāi)發(fā)周期長(cháng)等阻礙智能卡普及的缺點(diǎn),允許智能卡運行Java編寫(xiě)的應用程序。JavaCard技術(shù)繼承了Java語(yǔ)言的優(yōu)點(diǎn),制定了一個(gè)安全、便捷且多功能的智能卡平臺。
JavaCard基本的硬件配置(來(lái)自Sun文檔)為:512B RAM、24KB ROM、8KB EEPROM、8位處理器。典型的JavaCard設備有8位或16位的CPU,3.7MHz時(shí)鐘頻率,1KB的RAM和大于16KB的非易失存儲(EEPROM或Flash)。高性能的智能卡帶有獨立的處理器、加密芯片及密碼信息。
JavaCard系統的實(shí)現有基于軟件虛擬機和基于硬件兩種方法?;谲浖摂M機方法是在非Java處理器上用軟件方法模擬實(shí)現JavaCard平臺,在此平臺上實(shí)現JavaCard應用?;谟布椒ㄊ怯布壿媽?shí)現JavaCard處理器,在此硬件基礎上實(shí)現JavaCard平臺,再在此平臺上實(shí)現JavaCard應用。
2 Java處理器的實(shí)現方式比較
Java處理器有以下幾種實(shí)現方式:
(1)通用CPU+OS+Java軟件解釋器,軟件解釋執行Java指令。
(2)通用CPU+OS+Java JIT(Just-In-Time)編譯器,按塊編譯執行Java指令。
(3)Java加強CPU+OS+特殊的Java編譯器,充分使用Java加強硬件的優(yōu)勢。
(4)Java 硬件CPU,本地支持Java指令,執行效率最高。
目前的Java系統是基于軟件虛擬機實(shí)現的,軟件解析執行Java指令,如(1)、(2)。用軟件實(shí)現JavaCard虛擬機,需要軟件JavaCard指令解釋器,將Java指令轉換到本地CPU的指令集。這樣,不但速度慢,而且虛擬機本身占用內存資源,不適合在智能卡這種資源有限的硬件中應用。方式(3)要求CPU硬件實(shí)現部分Java指令,它需要特殊的編譯器來(lái)充分發(fā)揮Java加強CPU的功能。方式(4)是最有效的解決方法,Java指令的執行不再需要先轉換到宿主CPU的本地指令集,同時(shí),它也不占用RAM等軟件資源,可以給應用程序提供更多的資源。
本文介紹JavaCard CPU。系統采用Verilog描述,設計成一個(gè)配置靈活、修改方便、資源占用少、兼容性好、可以在普通FPGA中實(shí)現的軟核。
3 JavaCard CPU的設計
3.1 Java CPU的硬件實(shí)現技術(shù)
在CPU的設計中,當從內存中取出下一條指令時(shí),執行這條指令有兩種方法,即硬件邏輯方法和微碼序列方法。硬件邏輯方法使用譯碼器、鎖存器、計數器和其他一些邏輯部件轉移和操作數據,完成指令功能。微碼序列方法是在內部實(shí)現一個(gè)非常簡(jiǎn)潔、快速的微碼處理器。此微碼處理器的每條指令對應很簡(jiǎn)單的硬件動(dòng)作(一般都是單周期指令),將要執行的CUP指令作為索引,索引到微碼ROM中的某個(gè)地址,通過(guò)執行此地址處的一組微碼完成指令功能。
硬件邏輯方法的優(yōu)點(diǎn)是能設計出更快的CPU,缺點(diǎn)是難以實(shí)現復雜的指令集,同時(shí)會(huì )導致芯片面積增大。微碼序列方法的優(yōu)點(diǎn)是可以減小芯片的面積,實(shí)現復雜指令集,缺點(diǎn)是速度有時(shí)較慢。兩種方法的速度快慢并非絕對,微碼指令是簡(jiǎn)單指令,一般每個(gè)時(shí)鐘就能執行一條指令。硬件邏輯方法在執行CPU指令時(shí),通常也是劃分為幾個(gè)階段執行,同樣需要幾個(gè)時(shí)鐘。實(shí)際設計中采用哪種方法要權衡利弊,在速度不是關(guān)鍵時(shí),微碼序列方法是個(gè)很好的選擇。
3.2 JavaCard CPU結構
JavaCard CPU采用微碼實(shí)現,核心部分是微碼處理器,用微碼指令序列實(shí)現JavaCard指令。微碼處理器主要組成為:主控邏輯CORE,運算單元ALU,內部堆棧單元STACK,微碼ROM,微碼指令指針調整模塊MCPC,外存讀寫(xiě)接口MEMRW,通過(guò)wishbone總線(xiàn)連接外部RAM、ROM、I/O。各模塊之間連接關(guān)系、數據通路、控制通路以及應答信號連接見(jiàn)圖1。
3.3 微碼處理器各模塊接口及功能
(1)運算單元ALU
module alu(x,y,op,z,flag,calc,rst,ack,clk);
x、y為輸入操作數,op為操作碼,z為輸出結果,flag為輸出運算結果標志,calc為運算使能控制信號,ack為運算結束應答。本模塊完成op定義的運算,并給出標志位和應答。
(2)內部堆棧STACK
module stack(clk,rst,pop,push,data_i,data_o,sp,ack);
pop、push為堆棧的彈出及壓入操作信號,data_i、data_o為數據輸入輸出,sp為堆棧指針,ack為堆棧操作結束應答。本模塊根據pop、push信號對堆棧進(jìn)行操作。
(3)微碼ROM
module microcoderom(mcp,mcr);
MCP為微碼ROM的指針,MCR為微碼寄存器。根據微碼指針MCP,在MCR上輸出MCP處的微碼數據。
(4)微碼指令指針調整模塊MCPC
module mcpc(clk,rst,load,new_mcp,hold,remap,instr,mcp);
微碼指針有保持、重加載、重映射三種操作。重加載是用new_mcp的值作為新的MCP值。重映射是將CPU指令I(lǐng)nstr對應的微碼序列首地址作為新的MCP值。
load信號有效,用new_mcp的值給MCP賦值;
hold信號有效,保持MCP值不變;
remap信號有效,則將CPU指令I(lǐng)nstr做為索引,得到Instr指令對應的微碼序列首地址,將首地址賦給MCP。
以上三個(gè)信號均無(wú)效時(shí),每時(shí)鐘MCP自動(dòng)加1。
(5)外存讀寫(xiě)接口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);
對外接口采用開(kāi)源的wishbone總線(xiàn)標準,wb*信號是wishbone相關(guān)信號。根據rd、wr讀寫(xiě)信號,操作wishbone信號,等待wishbone的應答,然后將數據和應答信號反饋給主控模塊。
3.4 本JavaCard CPU設計的特點(diǎn)
(1)主控模塊與其他從模塊之間用使能信號和應答信號保持同步,從模塊在完成操作后只需給出應答信號,即可匹配不同速度的從模塊。
(2)微碼指令的設計。所有的微碼指令為單指令,即不帶任何操作數。微碼指令本身包含所需操作的信息,如在哪兩個(gè)寄存器之間轉移數據等。對于跳轉操作等必須帶后續操作數的指令采取變通方法,先將所需操作數存入內部寄存器,再執行跳轉等指令。詳細示例為:
微碼定義為16位。位15指示本微碼是指令還是數據。位15==1表示是數據,此時(shí)微碼的低8位是一個(gè)數據,處理此微碼時(shí),要將此8位數據提取出來(lái),存入內部寄存器;位15==0表示是指令。當需要執行一個(gè)跳轉Jmp 0x0809時(shí),微碼序列方法使用三條微碼表示:
0x8008 //位15==1,是數據型微碼
0x8009
JMP //指令型微碼助記符
執行時(shí),遇到前面兩個(gè)數據型微碼,會(huì )將08和09存入內部16位數據寄存器的高低8位;執行JMP指令時(shí),隱含使用此內部數據寄存器。
(3)所有的微碼指令是單周期指令。由于采用了(2)中所述的單指令微碼,在執行當前微碼指令的同時(shí)讀取下一條微碼指令,可以做到每個(gè)時(shí)鐘執行一條微碼。
(4)簡(jiǎn)潔的主控邏輯。所有JavaCard指令均由微碼執行,不采用硬件陷入、軟件模擬方式,簡(jiǎn)化了主控邏輯設計。主控模塊狀態(tài)機僅有EXEC_MC和HLT兩個(gè)狀態(tài)。CPU復位后,一直處于執行微碼EXEC_MC狀態(tài),直到執行HLT微碼指令。
(5)適應性好。采用了應答機制,可以匹配不同速度的部件;對外采用wishbone總線(xiàn),簡(jiǎn)化了各部件接口的設計,方便了外部設備的擴充。
(6)I/O采用內存映射方式統一編址,避免了非Java指令的引入,保證了兼容性。
3.5 Verilog表述的微碼處理器核心邏輯
下面是主控邏輯框架代碼的一部分。本段代碼體現了如何處理數據型微碼和指令型微碼,可以在YOUR_MICRO_CODE_INSTR處添加需要的微碼指令以及對應的操作。
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;//表示是否讀過(guò)了一次
//數據型微碼
state[1:0]=EXEC_MC;
end
else
begin
case(state[1:0])
EXEC_MC:
begin//首先根據mcr的位15判斷是數據型
//微碼還是指令型微碼
if(mcr[15])//mcr中存放微碼,位15==1表示
//此微碼是數據型,先保存高8位,再低8位
begin
if(H_READED==1′b0)//首個(gè)數據型
//微碼,數據保存到高8位
begin
{mcdata[15:8]}=mcr[7:0];
//mcdata是內部數據寄存器
H_READED=1′b1;
end
else
begin
{mcdata[7:0]}=mcr[7:0];
H_READED=1′b0;
end
end
else//表示此微碼是指令,根據后面的15位
//分支操作
begin
case(mcr[15:0])
YOUR_MICRO_CODE_INSTR://
begin
……//定義的微碼操作
end
……//其他微碼指令處理
endcase
end//end for mcr為指令處理
end
HLT://state[1:0]=HLT,宕機狀態(tài)處理
…
endcase//end for state[1:0]
end//end for reset
end//end for always@(posedge clk or posedge reset)
系統采用微碼實(shí)現,用微碼序列控制讀取Java指令、存儲數據,實(shí)現Java指令。JavaCard指令被解釋執行的過(guò)程如下:
讀取JavaCard PC處的JavaCard指令至指令寄存器Instr,發(fā)出remap信號給微碼指針調整模塊MCPC,微碼指針寄存器MCP得到新的JavaCard指令對應的微碼序列首地址,MCP的變化使微碼指令寄存器MCR變?yōu)樵撐⒋a序列的首個(gè)微碼指令,再由微碼處理器執行此MCR中的微碼。
4 JavaCard CPU測試平臺的FPGA實(shí)現
4.1 外圍接口和模塊
測試平臺是以一塊xc2s200芯片為核心的簡(jiǎn)單開(kāi)發(fā)板,全部設計都在此芯片內實(shí)現,包括CPU邏輯、存儲單元等,板上的8位led指示燈用作I/O輸出端口。
4.2 測試平臺框架
測試平臺框架結構如圖2所示。
4.3 結果說(shuō)明
設計是用Verilog語(yǔ)言實(shí)現的,內部使用16位數據總線(xiàn),對外是8位的wishbone總線(xiàn),微碼ROM為4KB,外接512B的ROM和512B的RAM。
JavaCard 定義了187條指令,其中47條指令涉及32位整型數。對32位整型數的支持是可選的,本次沒(méi)有實(shí)現對32位整型數操作的指令,遇到未定義指令的操作為宕機。共定義了109條微碼指令。用了3273條微碼指令序列完成系統初始化操作和解釋JavaCard指令,每條JavaCard指令約用17條微碼指令執行(主要是有些面向對象的復雜指令需要更多的微碼解釋?zhuān)?br />
整個(gè)系統占用資源很少:4個(gè)Block RAM,2 052個(gè)Slice,可以在普通FPGA上實(shí)現。
測試代碼下載到板上的ROM中,以24MHz時(shí)鐘運行通過(guò),驗證了JavaCard指令處理的正確性,性能完全滿(mǎn)足JavaCard虛擬機標準要求。
實(shí)現JavaCard硬件CPU是JavaCard的發(fā)展方向。因用途原因,它不需要很高的性能,而更需要成本低、資源占用少、功耗低等特性。JavaCard指令集是面向對象的復雜指令集,很難直接用硬件實(shí)現。采用微碼方式實(shí)現是很好的選擇,每一條微碼對應一個(gè)很簡(jiǎn)單的硬件動(dòng)作,硬件實(shí)現容易,且使用的資源少。用微碼序列完成JavaCard指令,使硬件設計保持簡(jiǎn)潔、靈活、修改方便,有些改動(dòng)只需重寫(xiě)微碼序列而不需要更改硬件設計;添加新功能支持的也只需要修改微碼,如硬件實(shí)現加密方法調用接口。JavaCard硬件CPU的實(shí)現必將促進(jìn)JavaCard的應用。
評論