在传统的控制系统中,人们常常采用单片机作为控制核心。但这种方法硬件连线复杂,可靠性差,且单片机的端口数目、内部定时器和中断源的个数都有限,在实际应用中往往需要外加扩展芯片。这无疑对系统的设计带来诸多不便。
现在有很多系统采用可编程逻辑器件CPLD作为控制核心。它与传统设计相比较,不仅简化了接口和控制,提高了系统的整体性能及工作可靠性,也为系统集成创造了条件。但可编程逻辑器件的D触发器资源非常有限,而且可编程逻辑器件在控制时序方面不如单片机那样方便,很多不熟悉的应用者往往感到应用起来非常的困难。利用可编程逻辑器件和单片机构成的双向通信控制器克服了两者的缺点,且把二者的长处最大限度地发挥出来。
单片机到CPLD的串行通信接口电路是利用VHDL语言在CPLD中设计一个串行输入并行输出的八位移位寄存器,其端口与单片机的P1.4~P1.7相连。CS 为单片机选信号,当其为低时使能八位寄存器;当DCLOCK信号的上升沿到达clk端口时,八位移位寄存器就会将单片机输出到cxin的一位数据移入;当单片机A寄存器中的八位数据欲传送给CPLD时,就在P1.6连续产生八次上升沿,单片机便顺次地将A中的数据移到cxin,八次后A中的数据段就会出现在CPLD的cxout中。
可编程逻辑器件到单片机的串行通信与单片机到可编程逻辑器件的串行通信类似,只不过八位寄存器改为并入串出。当单片机的cs=1时,寄存器被选中;当load=1时,待发的数据被加载到bxin上;当clk上升沿到来时,将数据一位一位移出至bxout上,与此同时,单片机一位一位接收到自 bxout上的数据。在clk八个上升沿后,加载到bxin的数据便被传送至单片机的A寄存器中。
由于单片机端口有限,所以大部分外围器件的连线靠CPLD来完成,而对时序控制要求较高的那些外围器件则靠单片机来间接控制。所谓间接控制就是指应用者可以自定义很多个命令字,每个命令字对应着CPLD一项或一系列操作。当单片机想让某外部器件实现某种功能时,可以通过串行通信把命令字传送给可编程逻辑器件 CPLD。CPLD收到该命令字关判断命令字后,便在EN的上升沿到来后执行相应的操作。这里值得一提的是:命令字传送给CPLD后,只有在EN的上升到来后CPLD才能执行相应操作。这是为了防止命令字在字传送期间使CPLD误动作。
当外部器件有中断信号反馈到控制器时,也可将特定的命令字由CPLD传送给AT89C51,使 AT89C51产生中断进行处理。但无论有多少个外围器件需产生中断控制。在AT89CF51中断子程序中,运行由CPLD向单片机的串行通信程序,将特定的命令字读到A寄存器中,从而可知是如个外围器件产生的中断(由应用者自行定义),进而可知需何种外部操作。
本双控制系统在项目设计中应用起来非常灵活方便,这里采用的是八位命令字,最多可自定义256个命令字。由于同时采用了单片机和CPLD,因此编程非常灵活方便,工程人员可根据自身特点而相应选择。例如,有些人的单片机编程能力要比CPLD语言编程略好一些,那他可在VHDL语言编程中把命令字对应的操作定义得简单一些(最简单的莫过于使某个管脚变为高电平或低电平);若是想简化单片机的编程,则可使高电平或低电平);若是想简化单片机的编程,则可使VHDL语言编程中特定命令字对应的操作复杂一些。
单片机的编程过程就是对A寄存器写不同命令字,然后调用串行通信子程序的过程。若是VHDL的命令字,然后调用串行通信子程序的过程。若是VHDL的命令字对应程序简单些,则要完成对某特定外围器件的操作所需要的命令字调用就会多一些。反之亦然,仅此而已。总之,用单片机与CPLD构成的双控制器,此用它们各自独立开发项目要容易得多。