摘 要:尝试在FPGA上实现对IC卡的控制,运用EDK中的IP开发工具生成一个智能卡控制器的IP核,用以实现对IC卡的硬件控制。
关键词:IC卡;IP;FPGA
智能卡(Smart Card)又称集成电路卡(Integrated Circuit Card),即IC卡,目前大量使用的交通卡、门禁卡、银行支付卡等都是智能卡。智能卡接口控制器是连接智能卡和主控设备的桥梁,是智能卡处理设备中的最重要组成部分之一。面对巨大的市场需求,越来越多的公司、科研机构都在研究此类控制器。
FPGA具有可重构性、开发周期短以及开发流程简单等优点,越来越多的工程师选择将FPGA作为工程设计的首选。由于其内嵌微处理器,FPGA在嵌入式方面也获得了大量的运用。此外,为缩短产品面市时间,FPGA厂商还会提供多种知识产权(IP)核。这类IP核可以作为功能模块运用在不同的设计中,方便了各种开发的推进。本文尝试在EDK中开发一个新的IP核,其功能就是实现对IC卡的接口控制。
1 用卡过程
正常的用卡过程可划分为几个阶段:(1)将IC卡插入到接口设备IFD(Interface Device),并接通各触点;(2)对IC卡进行复位,在终端和IC卡间建立通信;(3)执行交易;(4)释放触点并取出IC卡。
2 字符的物理传送
交易过程中,数据以异步半双工方式经I/O线在终端和IC卡之间双向传送。由终端向IC卡提供时钟信号,并以此来控制交易的时序。
数据在I/O线上以字符帧传送,一个字符帧包含着10个相连的数位:1 bit状态为低(L)的起始位、8 bit组成的数据字节和1 bit偶校验位,如图1所示。
Input AFIFO接收来自总线的命令、地址和数据等,依次存储在FIFO中(深度为16 bit),Device Controller则读取该FIFO中数据,并进行相应的操作。
Output AFIFO用于接收Device(智能卡)返回的数据,并将其传输给总线。
Output Latch的作用是进行状态缓存与命令缓存,主要是为了满足相关时序的要求。
Device Controller是设计的核心环节,它主要有以下功能特征:
(1)参数的传递以及协议的设定;
(2)时钟频率的转换;
(3)功能的激活;
(4)时钟的停止;
(5)功能的释放;
(6)复位;
(7)应用协议数据单元APDU(Application Protocol Data Unit)传送;
(8)PPS交换。
该模块通过PLB接收来自CPU(即Microblaze)的数据,并将它们转换成串行信号。智能卡(Device)接收这些串行信号,并作出相应的响应。CPU通过PLB总线读取这些响应。其中,协议的选定是通过软件来实现的,而且Device Controller的参数传输也是通过软件来实现的。
根据该模块的主要功能特征,将该模块细化成以下几个小的模块。
(1)状态机模块:用于对通信状态过程的转换;
(2)计数器模块:用于发送或接收数据的位数计算;
(3)时钟分频模块:产生合适的时钟频率,用于与智能卡的通信;
(4)信号接口模块:接收并解码总线数据(命令、地址和数据);
(5)数据接收模块:用于接收Device发送的数据,并封装成32 bit格式。
3.2 IP核的顶层模块
控制器的顶层模块的结构图如图3所示。
在这个控制模块中,有6个输入信号是本控制器接收来自主控制器(Microblaze)的信号,分别为总线时钟信号Bus2IP_Clk、总线复位信号Bus2IP_Reset、数据信号Bus2IP_Data、总线选择信号Bus2IP_BE、总线读使能信号Bus2IP_RdCE以及总线写使能信号Bus2IP_WrCE。5个信号用于本控制器发送响应给主控制器(Microblaze),分别为IP发送数据信号IP2Bus_Data、IP读响应信号IP2Bus_RdAck、IP写响应信号IP2Bus_WrAck、IP报错信号IP2Bus_Error以及IP中断信号IP2Bus_IntrEvent。还有6个信号用于本控制器与智能卡之间的通信,分别为输出给智能卡的时钟信号SCID2SC_CLK、复位信号SCID2SC_RST、电压信号SCID2SC_VPP、接收智能卡返回值SCID2SC_IO_I、输出信号给智能卡SCID2SC_IO_O、输入输出选择信号SCID2SC_IO_T。在时钟频率的选择上,由于Spartan-3A的工作频率是62.5 MHz,因此Bus2IP_Clk采用的是62.5 MHz,而智能卡在这样的高频下则无法有效工作,因此通过DCM来实现分频,最终选取IP_CLK的频率为33.25 MHz。
3.3 控制器的工作流程
当此控制器IP核接收到来自总线的命令后,就将开始工作,实现对智能卡的接口控制,其工作的状态转换如图4所示。
上电后,该控制器开始处于起始状态(INITIAL),当接收到来自总线的信号后,信号接收模块便会识别信号中的命令。当命令为CMD_ACT、CMD_RST、CMD_ATR时,则开始工作;否则,继续处于起始状态。
开始工作后,首先进入到SIGNAL_ST_CLK状态,在这个状态里,时钟生成模块开始工作,它将产生一个需要的时钟频率,作为控制器与智能卡进行通信的工作频率。接着就要对智能卡进行第一次复位(冷复位),即进入到SIGNAL_ST_RST状态,复位后进入SIGNAL_ST_ATR状态(ATR为复位应答),等待来自智能卡的返回信息。当智能卡发送信号有效时,进入到SIGNAL_ST_GET状态,接收来自智能卡的响应。如果返回值正确,则将进入空闲状态(IDLE),等待下一命令。如果返回值不正确,则需要智能卡重新发送,并重新进入到SIGNAL_ST_GET状态。
在IDLE状态下,控制器会根据总线后续的命令来进行操作,在本设计中主要是发送CMD_ATR、CMD_APDU和CMD_PPS命令,其过程是对智能卡进行数据的发送。首先进入到SIGNAL_ST_SEND状态,每发完一组数据(10 bit)后,都会对这组数据进行检查,即进入SIGNAL_ST_CHECK状态。
当所有操作命令都完成,就需要对此状态机进行释放,进入SIGNAL_ST_DACT状态。释放过程分为3步:首先对智能卡进行复位操作,然后要停止向智能卡输出时钟信号,最后将控制器对智能卡的输出信号拉低。至此,本次状态转换就结束了,对智能卡的一次控制也就完成了。
4 FPGA的实现
在ISE 12.4开发环境中新建一个SmartCard控制器的工程,并添加EDK开发模块,运用其IP生成功能来生成一个智能卡的控制IP核iso7816_intf_dev,输入相应的Verilog HDL代码,并将生成的IP添加到EDK系统中。整个EDK系统的工作平台如图5所示。
只需在将此工程生成相应的比特流,并下载到FPGA开发板上,就可以对智能卡进行控制操作了。
为了在硬件上实现该控制器的功能,选用Xilinx公司的Spartan-3A系列XC3S700A-4FG484开发板来实现该控制器。其内部消耗资源概况如图6所示。
最后,借助于Xilinx的SDK对该控制器进行测试。在SDK中,可以运用函数Xil_Out32或者Xil_In32来进行数据的发送与接收。
Xil_Out32(Base_Address+Offset,command/data),Xil_In32(Base_Address+Offset)。
验证此IP核能否正常工作,主要需要验证ATR、APDU和PPS这3个命令是否能够正确地发送并接收正确的响应。由于这3个命令的发送与接收都是运用同样的函数,只是命令符与地址不同,因此只列出ATR的测试情况。
运用下面的函数向对应的地址发送命令:
Xil_Out32(0xcce00004,0x03000003);
Xil_Out32(0xcce00000,0x00000101)。
运用下面的函数接收来自智能卡的响应:
fpireg0=Xil_In32(0xcce0001c);
xil_printf("data0:%x\r\n",fpireg0)。
智能卡对此命令的响应如下,它返回12个字符:3B,19,96,00,21,02,00,00,00,FF,90,00。
这些响应是符合此类智能卡的响应规定,因此,该IP核对于ATR功能是正确的。
利用同样的验证方法可以看出,该IP核对于APDU以及PPS等命令的响应都是完全正确的。
经验证,本方案所设计的智能卡控制器是可行的。在进行嵌入式设计时,可以将该IP核直接添加到相关的EDK工程中去,从而减少了设计的复杂度。但是本设计还只是局限于将IP核运用在FPGA上,以后需要继续研究,能够将该IP核通用化,这样就可以添加到任何目标系统中去,方便SoC的设计,这将是今后研究的重点所在。
参考文献
[1] International Standard ISO/IEC 7816-3[S].
[2] Xilinx公司. Spartan-3 FPGA Family Data Sheet[Z].
[3] Xilinx公司. Spartan-3 Starter Kit Board User Guide[Z].
[4] 夏宇闻,甘伟.Verilog HDL入门[M].北京:北京航空航天大学出版社,2008.