分类: LINUX
2009-06-17 21:38:13
与USB接口一样,PCMCIA接口几乎是所有笔记本电脑必备的接口之一,其接口标准由PCMCIA协会定义,称为PC Card Standard Realese x。PCMCIA现在用的最广的标准为PC Card Std-1995,因此我们的设计也依此标准。由于缺少足够的资料,尤其是PCMCIA标准需要高价购买,一般个人独立设计PCMCIA接口IP很难。
下图是PCMCIA的应用系统结构,支持PCMCIA卡的笔记本电脑主机提供了PCMACIA HBA(Host Bus Adapter)和Socket,带阴影的PC Card是需要PC Card的开发者设计的。目前市场上有专用的PCMCIA接口芯片,但对于片上系统设计,一般要求PCMCIA接口IP嵌入到整个芯片中而不是独立的采用专用的芯片。
图 1 PCMCIA的应用系统结构
本设计所完成的PCMCIA接口IP支持以下功能:
l 支持PC Card standard Release 1995 16-bit I/O–only PC卡。
l 设计工作时钟10MHz以上即可。
l 支持3.3V低电压插槽II类卡。
l 支持硬复位和软件复位。
l 属性存储器读周期任意,写周期任意。
l 设计支持256*8bit卡信息结构。它既可以由FPGA在配置阶段自动初始化,也可以在系统reset之后由外部逻辑写入。
l 7个字节的功能配置寄存器。
l 可配置I/O 基地址和I/O窗口。
l 支持电平中断和脉冲两种中断方式,但建议配置CIS时将Card配置为只支持电平中断。设置为脉冲中断方式时,卡将中断信号置1,则产生单个长度为约0.5ms[1]脉冲的长度的脉冲。脉冲产生完毕后如果卡中断信号如果仍然存在,将会产生新的中断脉冲。
l 提供专门的Debug管脚,便于测试。
另外需要设计完整的testbench,完成模块的逻辑验证工作。
我们支持的PC Card的物理规格为TypeII,外观尺寸8.56cm×5.4cm,厚0.5cm。采用I/O& Memory 模式,此时的68芯接口信号定义如下:
管脚 |
名称 |
描述 |
管脚 |
名称 |
描述 |
1 |
GND |
地 |
35 |
GND |
|
2 |
Data 3 |
|
36 |
CD1# |
|
3 |
Data 4 |
|
37 |
Data 11 |
|
4 |
Data 5 |
|
38 |
Data 12 |
|
5 |
Data 6 |
|
39 |
Data 13 |
|
6 |
Data 7 |
|
40 |
Data 14 |
|
7 |
CE1# |
|
41 |
Data 15 |
|
8 |
Address 10 |
|
42 |
CE2# |
|
9 |
OE# |
|
43 |
VS1#/Refresh |
|
10 |
Address 11 |
|
44 |
IORD# |
在存储器模式下为Reserved |
11 |
Address 9 |
|
45 |
IOWR# |
在存储器模式下为Reserved |
12 |
Address 8 |
|
46 |
Address 17 |
|
13 |
Address 13 |
|
47 |
Address 18 |
|
14 |
Address 14 |
|
48 |
Address 19 |
|
15 |
WE# |
|
49 |
Address 20 |
|
16 |
IREQ# |
在存储器模式下为Ready |
50 |
Address 21 |
|
17 |
Vcc |
|
51 |
Vcc |
|
18 |
Vpp1 |
|
52 |
Vpp2 |
|
19 |
Address 16 |
|
53 |
Address 22 |
|
20 |
Address 15 |
|
54 |
Address 23 |
|
21 |
Address 12 |
|
55 |
Address 24 |
|
22 |
Address 7 |
|
56 |
Address 25 |
|
23 |
Address 6 |
|
57 |
VS2#/Rsrvd |
|
24 |
Address 5 |
|
58 |
RESET |
|
25 |
Address 4 |
|
59 |
WAIT# |
|
26 |
Address 3 |
|
60 |
INPACK# |
在存储器模式下为Reserved |
27 |
Address 2 |
|
61 |
REG# |
|
28 |
Address 1 |
|
62 |
SPKR# |
在存储器模式下为BVD2 |
29 |
Address 0 |
|
63 |
STSCHG# |
在存储器模式下为BVD1 |
30 |
Data 0 |
|
64 |
Data 8 |
|
31 |
Data 1 |
|
65 |
Data 9 |
|
32 |
Data 2 |
|
66 |
Data 10 |
|
33 |
IOIS16# |
在存储器模式下为WP |
67 |
CD2# |
|
34 |
GND |
|
68 |
GND |
|
注:#代表低电平有效
信号功能的详细解释如下:
1. Vcc&Ground:3.3V~5V,与卡的版本和CIS配置有关。在PCMCIA 2.x中,卡初始化时一定是5V;如果CIS配置成支持3.3v,则工作后Vcc变为3.3V,这种卡称为双电压卡。我们设计为3.3V单电压工作方式,属于低电压卡,只能插入低电压插槽(socket)或通用插槽,这是PC-Card 1995(R5.0)定义的。
2. Vpp1&Vpp2:可编程存储器如EEPROM的编程电压。对于我们的设计Vpp1&Vpp2我们不需要,可以由CIS设定为3.3V。
3. VS1#&VS2#:电压探测 Valtage sense。对于我们的设计,VS1#=0,VS2#=1’bZ,即3.3V的低电压工作方式
4. A25:A0:64MB地址空间。对于x86机,只有64KB I/O地址,地址线只有第16位有用。
我们要使用的I/O窗口有3*256B(由Windows系统决定的)。
5. CE1#:card enable 控制D7-:D0上的数据。对于16bits的host,它控制偶数地址
6. CE2#:card enable对于16bits的host,它控制奇数地址。我们要设计16bit的host,可以支持CE1#和CE2#同时有效。Attribute存储器(CIS)必须是偶数地址的。
7. OE#:output enable
8. WE#:write enable
9. REG#:register
交易类型 |
OE# |
WE# |
REG# |
通用存储器读 |
0 |
1 |
1 |
通用存储器写 |
1 |
0 |
1 |
属性存储器读 |
0 |
1 |
0 |
属性存储器写 |
1 |
0 |
0 |
10. CD1#:Card detect
11. CD2#:Card detect。两个CD必须同时有效才行。这两条线不要接到芯片上,直接接到地线,同时要卡的地线与插槽的地线相连。
12. READY:Card Ready。表示卡初始化完毕或者执行动作完毕。在I/O卡里被IREQ#代替。只在初始化阶段IO设备被认为是存储设备,此时代表ready,初始化完毕主机识别到这是一个I/O设备,此后该信号代表中断信号。所以在PCMCIA接口IP中将不会出现Ready信号,只有IREQ#信号。但是此信号在卡的初始化阶段代表Ready。我们在使用FPGA实现的时候,CIS是在FPGA配置阶段初始化的。另外此IP还支持外部逻辑对其CIS进行配置,后面会有更详细的解释。
13. WP:写保护,在设计时下拉到GND。在I/O卡里没有使用,被IOIS16#代替。所以在PCMCIA接口IP中将不会出现WP信号,只有IOIS16#信号。
14. WAIT#:卡可以通过置位WAIT#插入等待周期,WAIT信号译码OE#信号。Tuple 1Bh定义插入WAIT后的最大cycle timing.WAIT#的最大时间值为12us。
15. INPACK#:input port Acknowledge。当本设备的IO地址与其它设备有交叠时有用。当卡被选中且当前读写卡的I/O时,该信号有效。在卡被配置之前该信号都应该无效。
16. IORD#:I/O读。
17. IOWR#:I/O写。
18. IREQ#:中断请求。
19. IOIS16#:I/O数据支持16bit时,如果地址线是卡所支持的I/O地址时,IOIS16#有效。
20. SPKR#:Digital Audio Wavform 可以不理,直接接到高电平。我们在设计中用它来指示卡已经被配置为I/O卡。
21. STSCHG#:I/O状态变化通知。
22. RESET:卡复位,进入未配置状态,需要在卡上用大于100K欧姆的电阻上拉,以保证卡在插入插槽的时候已经处于复位状态。
交易类型 |
IORD# |
IOWR# |
OE# |
WE# |
REG# |
I/O read |
0 |
1 |
1 |
1 |
0 |
I/O Write |
1 |
0 |
1 |
1 |
0 |
Attribute Memory Read |
1 |
1 |
0 |
1 |
0 |
Attribute Memory |
1 |
1 |
1 |
0 |
0 |
Common Memory Read |
1 |
1 |
0 |
1 |
1 |
Common Memory Write |
1 |
1 |
1 |
0 |
1 |
属性存储器的读周期是300ns,写周期缺省是250ns,可以通过设置CIS改变。
卡信息结构(Card Information Structure or Metaformat)是实现PCMCIA接口的一个组成部分,它为主机提供卡的配置信息。
在本设计中,我们在PCMCIA接口IP中使用了256x8的ROM作为属性存储器来存放卡信息结构。所有这些地址都被存放在偶地址中,从0开始。ROM地址x中的数据对应的PCMCIA接口地址为2x,即忽略PCMCIA的最低地址位。
Metaformat共分为4个层(Layer),每一层由若干Tuple构成。第一层(Layer 1)为基本兼容层,它提供最基本的卡数据组织。包括所支持的配置、设备制造商和设备专有特性,如尺寸、速度和编程信息。普通的卡设计一般只需完成这一层的CIS设计就可以了。
多个Tuple构成链状结构。Tuple的基本结构如下图
TPL_CODE是Tuple标识,TPL_LINK代表本Tuple的Tuple体部分的字节数。Tuple里的数据格式采用小端模式(Little Endian)——如果是多字节数据,数据的低字节先出现。
与有线网卡基本一样。不同的是它必须包括2个LAN功能扩展Tuple:一是LAN_TECH_CODE,值为7;二是LAN_MEDIA_CODE,应该设置为合适的值。
寄存器地址:0200H
SRESET:当软件将该位置为1时,系统进入复位状态,它的功能与reset管脚有效一样,只要该位为1,系统进入未配置的复位状态。
LevlREQ:如果卡支持中断,则:1=电平触发中断,0=脉冲触发,此时脉冲宽度必须大于0.5ms。
Function Configuration Index/Common memory address extension:对于I/O卡,该域为Function Configuration Index,它表示主机选中了的配置表的索引。
寄存器地址:0202H
changed: 卡状态变化显示
sigchg:stschg的屏蔽信号
iois8:主机将它设为1,如果主机只支持8位I/O读写
RFU:保留字,应为0。
Audio:I/O enable
Intr:卡将它置为1表示当前需要中断服务,否则它为0. 只读。中断分为脉冲和电平中断两种方式。
IntrACK:对于支持单个中断的I/O设备,该位为0,只读。Single function PC Cards ignore this field on writes and always return zero (0).
寄存器地址:0204H
CBVD1: 0
CBVD2:0
CREADY:
CWProt: 0
RBVD1:1
RBVD2:1
RREADY:
RWProt:写保护状态,0
作为IO卡,我们只实现CREADY和 RREADY
寄存器地址:0206
Reserved:为0
Copy number:当前卡的拷贝号。
SocketNumber:卡所在插槽号码
该寄存器实际上对于同一个HBA上同时存在多个完全相同的卡时才有用。
寄存器地址:0210,0212H
界定I/O的地址范围,对于本设计,使用了8个I/O地址。I/O限制寄存器的值为8’h0f。
验证主要包括以下部分:
首先基本的读写时序要正确。包括CIS,功能配置寄存器和I/O的读写。验证时应选择最坏情况。其次验证各种控制信号的工作,如中断信号的产生和清楚。
目前本IP已经在Xilinx FPGA xc2v3000上通过验证。验证过程如下:
(1) 使用的是Dell笔记本电脑。
(2) Socket Controller的芯片是TI的PCI-1225,支持CardBus PC Card Release 6。
(3) 能够从CIS中解析到数据。当将文献[1]中Modem的CIS放到FPGA上时,计算机能够解析到CIS并认为该卡为标准的Modem,自动安装了驱动程序。
(4) 将CIS中的设备类型设置为User Specific时,安装上作者本人写的驱动程序后发现卡进入IO状态,中断号为7,IO范围D200~D2FF。通过应用程序向IO端口写数据发现能够控制IO端口上的寄存器。
(5) 由于IO状态下寄存器COR是必须的,其它寄存器是可选的。验证结果只能证明COR的设计是正确的。
(6) 应用程序能够连续的向不同IO端口写数据,然后读回正确的结果。