由可编程逻辑器件与单片机构成的双控制器
2009-05-15
作者:王振红 李 洋 郝承祥
摘 要: 介绍一种利用可编程逻辑器件CPLD与单片机AT89C51串行双向通信而构成的双控制器。
关键词: CPLD AT89C51 串行通信
在传统的控制系统中,人们常常采用单片机作为控制核心。但这种方法硬件连线复杂,可靠性差,且单片机的端口数目、内部定时器和中断源的个数都有限,在实际应用中往往需要外加扩展芯片。这无疑对系统的设计带来诸多不便。
现在有很多系统采用可编程逻辑器件CPLD作为控制核心。它与传统设计相比较,不仅简化了接口和控制,提高了系统的整体性能及工作可靠性,也为系统集成创造了条件。但可编程逻辑器件的D触发器资源非常有限,而且可编程逻辑器件在控制时序方面不如单片机那样方便,很多不熟悉的应用者往往感到应用起来非常的困难。利用可编程逻辑器件和单片机构成的双向通信控制器克服了两者的缺点,且把二者的长处最大限度地发挥出来。
1 CPLD与单片机AT89C51双向串行通信原理
1.1 单片机到可编程逻辑器件的串行通信
单片机到CPLD的串行通信接口电路是利用VHDL语言在CPLD中设计一个串行输入并行输出的八位移位寄存器,其端口与单片机的P1.4~P1.7相连,如图1所示。CS为单片机片选信号,当其为低时使能八位寄存器;当DCLOCK信号的上升沿到达clk端口时,八位移位寄存器就会将单片机输出到cxin的一位数据移入;当单片机A寄存器中的八位数据欲传送给CPLD时,就在P1.6连续产生八次上升沿,单片机便顺次地将A中的数据移到cxin,八次后A中的数据段就会出现在CPLD的cxout中。其VHDL源程序如下:
entity cuanxing is
port (clk,cxin,cs: in std_logic;
cxout: out std_logic_vector(7 downto 0));
end;
architecture rtl of cuanxing is
signal shift: std_logic_vector(7 downto 0) ;八位暂存变量并行输出
begin
process(clk)
begin
if(cs='0')then
shift<=(others=>'0');若未被选中,输出全零
elsif(clk'event and clk='1')then ;若上升沿到达clk时,被选中。
shift(7 downto 1)<=shift(6 downto 0);八位数据前移一位
shift(0)<=cxin;最低位由cxin输入
end if;
end process;
cxout<=shift;将八位变量送至端口
end rtl;
与之相对应的单片机控制子程序如下(待发数据存放在A中):
CS EQU P1.4
EN EQU P1.5
DCLOCK EQU P1.6
DOUT EQU P1.7
CONV: PUSH 07H
MOV R7,#8 ;将移位个数8存入R7
CLR DCLOCK
SETB CS ;选中移位寄存器
CLR EN
CLR C
JXL: RLC A ;左移一位,将待发数据送至CY
MOV DOUT,C ;送至端口
ACALL YS1MS
SETB DCLOCK ;给一个上升沿,将数据移入移位寄存器
ACALL YS1MS
CLR DCLOCK
DJNZ R7,JXL ;若未到8次则传送下一位
SETB EN ;八位命令字全部移入,给EN一个上升沿,使CPLD执行相应操作
ACALL YS1MS
POP 07H
RET
1.2 可编程逻辑器件到单片机的串行通信
可编程逻辑器件到单片机的串行通信与单片机到可编程逻辑器件的串行通信类似,只不过八位寄存器改为并入串出,其端口如图2所示。当单片机的cs=1时,寄存器被选中;当load=1时,待发的数据被加载到bxin上;当clk上升沿到来时,将数据一位一位移出至bxout上,与此同时,单片机一位一位接收来自bxout上的数据。在clk八个上升沿后,加载到bxin的数据便被传送至单片机的A寄存器中(其VHDL和单片机源程序由于篇幅所限,不予给出)。
2 双控制系统的实现原理
由于单片机端口有限,所以大部分外围器件的连线靠CPLD来完成,而对时序控制要求较高的那些外围器件则靠单片机来间接控制。所谓间接控制就是指应用者可以自定义很多个命令字,每个命令字对应着CPLD一项或一系列操作。当单片机想让某外部器件实现某种功能时,可以通过串行通信把命令字传送给可编程逻辑器件CPLD。CPLD收到该命令字并判断该命令字后,便在EN的上升沿到来后执行相应的操作。这里值得一提的是:命令字传送给CPLD后,只有在EN的上升沿到来后CPLD才能执行相应操作。这是为了防止命令字在字传送期间使CPLD误动作。
当外部器件有中断信息反馈到控制器时,也可将特定的命令字由CPLD传送给AT89C51,使AT89C51产生中断进行处理。但无论有多少个外围器件需产生中断控制,都应由CPLD在AT89C51的INT0处产生一个中断。在AT89C51中断子程序中,运行由CPLD向单片机的串行通信程序,将特定的命令字读到A寄存器中,从而可知是哪个外围器件产生的中断(由应用者自行定义),进而可知需何种外部操作。
本双控制系统在项目设计中应用起来非常灵活方便,这里采用的是八位命令字,最多可自定义256个命令字。由于同时采用了单片机和CPLD,因此编程非常灵活方便,工程人员可根据自身特点而相应选择。例如,有些人的单片机编程能力要比CPLD语言编程略好一些,那他可在VHDL语言编程中把命令字对应的操作定义得简单一些(最简单的莫过于使某个管脚变为高电平或低电平);若是想简化单片机的编程,则可使VHDL语言编程中特定命令字对应的操作复杂一些。
单片机的编程过程就是对A寄存器写不同命令字,然后调用串行通信子程序的过程。若是VHDL的命令字对应程序简单些,则要完成对某特定外围器件的操作所需要的命令字调用就会多一些。反之亦然,仅此而已。
总之,用单片机与CPLD构成的双控制器,比用它们各自独立开发项目要容易得多。
参考文献
1 Stefan Sjoholm,Lennart Lindh著.边计年,薛宏熙译.用VHDL设计电子线路.北京:清华大学出版社,2000年8月第1版
2 徐爱钧,彭秀华.单片机高级语言C51应用程序设计.北京:电子工业出版社,1998年6月第1版