用CPLD实现单片机读写模块_EDAPLD论文
关键词:复杂可编程逻辑电路 微处理器 在系统编程 现场可编程门阵列
1 概述
cpld(复杂可编程逻辑电路)是一种具有丰富的可编程i/o引脚的可编程逻辑器件,具有在系统可编程、使用方便灵活的特点;不但可实现常规的逻辑器件功能,还可实现复杂的时序逻辑功能。把cpld应用于嵌入式应用系统,同单片机结合起来,更能体现其在系统可编程、使用方便灵活的特点。cpld同单片机接口,可以作为单片机的一个外设,实现单片机所要求的功能。例如,实现常用的地址译码、锁存器、8255等功能;也可实现加密、解密及扩展串行口等单片机所要求的特殊功能。实现嵌入式应用系统的灵活性,也提高了嵌入式应用系统的性能。
cpld(复杂可编程逻辑电路)是一种具有丰富的可编程i/o引脚的可编程逻辑器件,具有在系统可编程、使用方便灵活的特点;不但可实现常规的逻辑器件功能,还可实现复杂的时序逻辑功能。把cpld应用于嵌入式应用系统,同单片机结合起来,更能体现其在系统可编程、使用方便灵活的特点。cpld同单片机接口,可以作为单片机的一个外设,实现单片机所要求的功能。例如,实现常用的地址译码、锁存器、8255等功能;也可实现加密、解密及扩展串行口等单片机所要求的特殊功能。实现了嵌入式应用系统的灵活性,也提高了嵌入式应用系统的性能。
2 xilinx公司的可编程逻辑器件
xilinx公司的xc9500系列可编程逻辑器件是一款高性能、有特点的可编程逻辑器件。它的系统结构如图1所示。从结构上看,它包含三种单元:宏单元、可编程i/o单元和可编程的内部连线。它的主要特点是:
①高性能。在所有可编程引脚之间pin-pin延时5ns;系统的时钟速度可达到100mhz。
②容量范围大。xilinx公司的xc9500系列可编程逻辑器件的容量范围为36~288个宏单元;可用系统门为800~6400个。
③5v在系统可编程。可以编程10000次。
④具有强大的强脚锁定能力。
⑤每个宏单元都有可编程低功耗模式。
⑥没有用的引脚有编程接地能力。
xilinx的xc9500系列可编程逻辑器件的主要性能如表1所列。
3 cpld同单片机接口设计
cpld同单片机接口原理如图2所示。
cpld同单片机接口设计中,单片机采用atmel公司的at89c52,cpld采用xilinx公司的xc95216。该cpld芯片结构及性能见图1和表1。at89c52通过ale、cs、rd、we、p0口(数据地址复用)同xc95216芯片相连接。
表1 xilinx xc9500t系列器件
项 目 | xc9536 | xc9572 | xc95108 | xc95144 | xc95216 | xc95288 |
寄存器/个 | 36 | 72 | 108 | 144 | 216 | 288 |
可用门数/个 | 800 | 1600 | 2400 | 3200 | 4800 | 6400 |
宏单元数/个 | 36 | 72 | 108 | 144 | 216 | 288 |
fpd/ns | 5 | 7.5 | 7.5 | 7.5 | 10 | 10 |
tsu/ns | 3.5 | 4.5 | 4.5 | 4.5 | 6.0 | 6.0 |
tco/ns | 4.0 | 4.5 | 4.5 | 4.5 | 6.0 | 6.0 |
fcnt/mhz | 100 | 125 | 125 | 125 | 111.1 | 111.1 |
fsystem/mhz | 100 | 83.3 | 83.3 | 83.3 | 66.7 | 66.7 |
注:fcnt=16位计数器最高工作频率;fsystem=整个系统的最高工作效率。
ale:地址锁存信号。
cs:片选信号。
rd:读信号。
wr:写信号。
ad0~ad7:数据地址复用信号。
本例的设计思想是,在xc95216设置两个控制寄存器,通过单片机对两个控制寄存器的读写来完成对其它过程的控制。
xc95216设置的两个控制寄存器,可以作内部寄存器,也可以直接是映射为i/o口。
图2 xc9516同单片机接口原理图
4 cpld同单片机接口设置结果
本例中,使用xilinx公司提供的fundation ise 4.2i+modelsim 5.5f软件实现设计。实现设计的源文件模块如下:
/**************************
//mcu和xc95216接口程序
//目的:mcu读写xc95216
/**************************/
module mcurw(mcu_data,ale,cs,rd,we,conreg1,conreg2);
inout[7:0]mcu_data;//单片机的地址数据复用信号
output[7:0]conreg1,conreg2;//内部控制寄存器
input ale; //单片机的地址锁存信号
input cs; //单片机的片选信号
input rd; //单片机的读信号
input we; //单片机的写信号
reg[7:0]lamcu_data; //内部控制寄存器
reg[7:0]addressreg; //内部地址锁存寄存器
reg[7:0]conreg1; //内部控制寄存器
reg[7:0]conreg2; //内部控制寄存器
assign mcu_data=rd?8'bzzzzzzzz:lamcu_data;
initial //寄存器初始化
begin
lamcu_data<=0;
addressreg<=0;
conreg1<=0;
conreg2<=0;
end
always@(negedge ale)
begin
addressreg<=mcu_data; //地址锁存
end
always@(posedge we)
begin
if(!cs &&addressreg[0]= =0)) lamcu_data
<=conreg1; //从地址为0的conreg1寄存器读数据
else if(!cs&&(addressreg[0]= =1))lamcu_data<=conreg2;
//从地址为1的conreg2寄存器读数据
else lamcu_data<=8'bzzzzzzzz;
end
else
lamcu_data<=8'bzzzzzzzz;
end
endmodule
使用modelsim 5.5f仿真结果如图3和图4所示。图中ale、cs、rd、we、mcu_data是测试激励源信号,代表at89c52接口信号;conreg1和conreg2的内部寄存器;addressreg是内部地址锁存寄存器。
图3 conreg1写过程 图4 conreg1读过程
图3是conreg1写过程。首先,在ale信号的下降沿,锁存mcu_data的数据到addressreg内部地址锁存寄存器。然后,在we信号的上升沿,把mcu_data(0xaa)的数据锁存到寄存器conreg1。
图4是conreg1读过程。首先,在ale信号的下降沿,锁存mcu_data(0x00)的数据到addressreg内部地址锁存寄存器。然后,在rd信号的低电平期间,把mcu_data(0xaa)的数据锁存到寄存器conreg1。
从图3和图4可以看出,对conreg1寄存器的读、写过程完全满足进序要求,conreg2的读写过程同conreg1一样,也完全满足时序要求,实现了期望的功能。
结语
本文实现cpld与单片机接口设计是笔者设计的高速采样设备的一部分,经实际验证完全正确。简单地修改该模块,笔者已成功地将其应用于多个cpld或fpga与单片机接口的项目中。