用CPLD实现单片机与ISA总线接口的并行通信
ALTERA公司的硬件设计开发语言AHDL(AlteraHardwareDescriptionLanguage)实现。AHDL是一种模块化的高级语言,完全集成于MAX+plusII系统中,特别适合于描述复杂的组合逻辑、状态机和真值表,地址译码部分采用文本输入方式充分体现了文本输入方式的优点。文本输入内容如下:
SUBDESIGNAddress
(
PCA[9..0]:INPUT;
AEN,IOR,IOW:INPUT;
RSETDR,DELAY:INPUT;
A[15..14]:INPUT;
RD,WR:INPUT;
DLY_D:OUTPUT;
DLY_CK:OUTPUT;
DLY_CLR:OUTPUT;
STATE:OUTPUT;
PCRD:OUTPUT;
PCWR:OUTPUT;
MCURD:OUTPUT;
MCUWR:OUTPUT;
)
BEGIN
!DLY_CLR=RESETDR#DELAY;
DLY_D=!AEN&(PCA[9..1]==H"110");
DLY_CK=!AEN&(PCA[9..1]==H"110")&(!IOR#!IOW);
!PCWR=!AEN&(PCA[9..0]==H"220")&!IOW;
!PCRD=!AEN&(PCA[9..0]==H"220")&IOR;
!STATE=!AEN&(PCA[9..0]==H"221")&!IOR;
!MCSWR=(A[15..14]==H"2")&!WR;
END;
说明:PCA[9..0]是PC104的地址信号,A[15..14]是单片机的地址信号,PC104用到端口地址220H和221H。
3通信软件设计
PC104是基于ISA总线的,在系统软件设计中要防止地址冲突。PC104中使用A0~A9地址位来表示I/O端口地址,即可有1024个口地址,前512个供系统板使用,后512个供扩充插槽使用,当A9=0时表示为系统板上的口地址;当A9=1时表示扩充插槽接口卡上的口地址[2]。因为本系统中采用保留的口地址220H和221H,保证不会发生地址冲突。
在本程序中,PC104采用查询方式接收数据,单片机采用中断方式接收数据。
#definepcreadwrite0x220;PC104读写数据口地址
#definepcrdstate0x221;PC104查询状态口地址
PC104写数据函数:
Voidpcwrite(intport,unsignedcharch)
{outportb(pcreadwrite,ch);
while((inportb(pcrdstate)&0x02)!=0x02)
;等待单片机读走数据
{}
}
单片机读子程序:
MCUR:MOVDPTR,#400H
MOVXA,@DPTR
RETI
PC104读数据函数:
Unsignedcharpcread(intport)
{while((inportb(pcrdstate)&0x0!=0x01)
;等待单片机写数据
{}
returninportb(pcreadwirte);
}
单片机写子程序:
MCUWR:MOVDPTR,#8000H
MOVX@DPTR,A
;等待PC104读写数据
RET
《用CPLD实现单片机与ISA总线接口的并行通信(第2页)》
本文链接地址:http://www.oyaya.net/fanwen/view/143734.html
SUBDESIGNAddress
(
PCA[9..0]:INPUT;
AEN,IOR,IOW:INPUT;
RSETDR,DELAY:INPUT;
A[15..14]:INPUT;
RD,WR:INPUT;
DLY_D:OUTPUT;
DLY_CK:OUTPUT;
DLY_CLR:OUTPUT;
STATE:OUTPUT;
PCRD:OUTPUT;
PCWR:OUTPUT;
MCURD:OUTPUT;
MCUWR:OUTPUT;
)
BEGIN
!DLY_CLR=RESETDR#DELAY;
DLY_D=!AEN&(PCA[9..1]==H"110");
DLY_CK=!AEN&(PCA[9..1]==H"110")&(!IOR#!IOW);
!PCWR=!AEN&(PCA[9..0]==H"220")&!IOW;
!PCRD=!AEN&(PCA[9..0]==H"220")&IOR;
!STATE=!AEN&(PCA[9..0]==H"221")&!IOR;
!MCSWR=(A[15..14]==H"2")&!WR;
END;
说明:PCA[9..0]是PC104的地址信号,A[15..14]是单片机的地址信号,PC104用到端口地址220H和221H。
3通信软件设计
PC104是基于ISA总线的,在系统软件设计中要防止地址冲突。PC104中使用A0~A9地址位来表示I/O端口地址,即可有1024个口地址,前512个供系统板使用,后512个供扩充插槽使用,当A9=0时表示为系统板上的口地址;当A9=1时表示扩充插槽接口卡上的口地址[2]。因为本系统中采用保留的口地址220H和221H,保证不会发生地址冲突。
在本程序中,PC104采用查询方式接收数据,单片机采用中断方式接收数据。
#definepcreadwrite0x220;PC104读写数据口地址
#definepcrdstate0x221;PC104查询状态口地址
PC104写数据函数:
Voidpcwrite(intport,unsignedcharch)
{outportb(pcreadwrite,ch);
while((inportb(pcrdstate)&0x02)!=0x02)
;等待单片机读走数据
{}
}
单片机读子程序:
MCUR:MOVDPTR,#400H
MOVXA,@DPTR
RETI
PC104读数据函数:
Unsignedcharpcread(intport)
{while((inportb(pcrdstate)&0x0!=0x01)
;等待单片机写数据
{}
returninportb(pcreadwirte);
}
单片机写子程序:
MCUWR:MOVDPTR,#8000H
MOVX@DPTR,A
;等待PC104读写数据
RET
《用CPLD实现单片机与ISA总线接口的并行通信(第2页)》