您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 单片机与CPLD通信
单片机与CPLD通信钟桃2012.06.08主要内容1)对CPLD的理解2)单片机时序分析3)单片机的通信对CPLD的理解1)CPLD的概念CPLD(ComplexProgrammableLogicDevice)复杂可编程逻辑器件,是从PAL和GAL器件发展出来的器件,相对而言规模大,结构复杂,属于大规模集成电路范围。是一种用户根据各自需要而自行构造逻辑功能的数字集成电路。其基本设计方法是借助集成开发软件平台,用原理图、硬件描述语言等方法,生成相应的目标文件,通过下载电缆(“在系统”编程)将代码传送到目标芯片中,实现设计的数字系统。CPLD是由一些门电路组成,我们可以通过软件编写出我们需要的逻辑电路来代替硬件。比如说373锁存器:对CPLD的理解51单片机P0口分时复用,配合ALE信号,在总线模式下分时作为低8位地址线和数据线复用。对CPLD的理解AD0AD1AD2AD3AD4AD5AD6AD7A8A9A10A11A12A13A14A15AD0AD1AD2AD3AD4AD5AD6AD7S0S1S2S3S4S5S6S7ALEALE234567891RP?RESPACK-8XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U?AT89C51D03Q02D14Q15D27Q26D38Q39D413Q412D514Q515D617Q616D718Q719OE1LE11U474HC373对CPLD的理解在Max+plusII中,可以直接调用集成器件库74373,在CPLD内部完成地址锁存。或者用硬件描述语言编写出一个373锁存器的逻辑来assignaddr=(ale)?data:addr;//低八位地址锁存单片机的时序分析一个电路总是由元器件通过电线连接而成的,在模拟电路中,连线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各器件之间的工作必须相互协调,所以需要的连线就很多了,如果仍如同模拟电路一样,在各微处理器和各器件间单独连线,则线的数量将多得惊人,所以在微处理机中引入了总线的概念数据总线——DB控制总线——CB地址总线——AB平时写程序的时候很少关注时序的变化,对读和写的时序很少关注,而在单片机与CPLD通信中,很多操作都在上升沿或者下降沿的这个时刻进行处理的。因此对时序的分析就显得比较重要。单片机总线时序图如图2所示,从图中可以看出,完成一次总线(读写)操作周期为T,P0口分时复用,在T0时间内,P0口送出低8位地址数据,在ALE的下降沿完成数据锁存,产生低8位地址信号,在T1时间段,P0口作为数据总线使用,可以送出数据或读入数据,数据的读写操作在读写控制信号低电期间完成,需要注意的是,在控制信号(读写信号)有效期间,P2口送出高8位地址,配合数据锁存器输出的低8位地址,实现16位地址总线既64k的寻址范围。单片机的时序分析读写指令:MOVXA,@DPTR;CPU从外部对象读数据MOVX@DPTR,A;CPU给外部对象写数据实际中它们时序没有理想中的那么好单片机的时序分析ALE的时序波形读或写时的时序CPLD与单片机通信CPLD与单片机通信方式有很多种:1)直接对IO口进行操作;(assignP0=IO)2)中断方式;(刘兵丹)3)总线模式;4)SPI模式;CPLD与单片机通信总线驱动数码管总线驱动数码管例1:对数码管的驱动数码管电路总线驱动数码管数码管动态扫描是常用的电路接口方式,它优点是占用IO口少。硬件电路简单,缺点是需要较高频率循环刷新数据,如果用CPU直接驱动,CPU资源占用较多,编程复杂。使用CPLD完全驱动方案,CPLD直接完成扫描过程,对单片机而言却是静态显示,不需要反复刷新数据,编程简单总线驱动数码管数码管CPLD驱动电路图总线驱动数码管1、对应的Verilog语言(关键句):assignaddr=(ale)?data:addr;//低八位地址锁存always@(posedgewr)//地址控制,数据写入对应缓冲器beginif(addr==3'b000)buff0=data;elseif(addr==3'b001)buff1=data;elseif(addr==3'b010)buff2=data;elseif(addr==3'b011)buff3=data;elseif(addr==3'b100)buff4=data;elseif(addr==3'b101)buff5=data;elseif(addr==3'b110)buff6=data;elsebuff7=data;end}总线驱动数码管#includereg52.h#includeabsacc.h#defineDA0XBYTE[0xff00]//定义总线读写地址#defineDA1XBYTE[0xff01]#defineDA2XBYTE[0xff02]#defineDA3XBYTE[0xff03]#defineDA4XBYTE[0xff04]#defineDA5XBYTE[0xff05]#defineDA6XBYTE[0xff06]#defineDA7XBYTE[0xff07]voidmain(){while(1){DA7=0xE0;//7DA6=0xBE;//6DA5=0xB6;//5DA4=0xFE;//8DA3=0x66;//4DA2=0xf2;//3DA1=0xDA;//2DA0=0x60;//1}}SPI驱动数码管SPI的定义:SPI是英文SerialPeripheralInterface的缩写,中文意思是串行外围设备接口,SPI是Motorola公司推出的一种同步串行通讯方式,是一种四线同步总线,因其硬件功能很强,与SPI有关的软件就相当简单,使CPU有更多的时间处理其他事务。1)Verilog语言:always@(posedgeCLK)beginbegincounter=counter+4'b1;read_buffer={DI,read_buffer[7:1]};if(counter==4'H7)beginaddr={DI,read_buffer[7:1]};endif(counter==4'HF)daRAM[addr]={DI,read_buffer[7:1]};endendvoidwr_byte(unsignedchard){unsignedchari;for(i=0;i8;i++){SPI_DI=d&0x01;//发送最低位SPI_CK=0;_nop_();SPI_CK=1;//移位寄存器移位_nop_();d=d1;//数据移位}}voidwrite_data(unsignedcharaddr,unsignedchard){SPI_RS=0;_nop_();_nop_();_nop_();SPI_RS=1;wr_byte(addr);wr_byte(d);_nop_();_nop_();_nop_();SPI_RS=0;}voidmain(){write_data(0,1);write_data(1,2);write_data(2,3);write_data(3,4);write_data(4,5);write_data(5,6);write_data(6,7);write_data(7,8);while(1);}总结使用不同的方式驱动数码管,能够从中理解总线发方式和SPI驱动数码管的流程几时序的了解。当你熟悉单片机时序和精通CPLD设计后,还可以根据实际需要,对CPLD电路进行裁剪,比如使用LCD后代替数码管后,那么CPLD数码管驱动部分电路就可以删除,节约CPLD的内部资源用作其它接口设计。对于初学者来说,精通单片机总线时序是关键,然后根据外部接口电路的需要,灵活应用CPLD扩展单片机接口,才能体会到单片机与CPLD结合的强大功能,可以利用C语和Verilog语言写出例如数字钟、12864显示、DDS等硬件上各个模块功能。谢谢观赏WPSOfficeMakePresentationmuchmorefun
本文标题:单片机与CPLD通信
链接地址:https://www.777doc.com/doc-3184013 .html