2 上位机VB程序 上位机软件利用VB6编写。微软的VISUAL BASIC语言有极其友好的界面,深受广大编程人员的好评。其可视化特点得到了很好的发挥,其中的MSCOMM控件非常方便编写软件,将层的部分隐蔽,只要了解自己需要的参数即可顺序编写上位机软件。现在简介该控件的各项参数: CommPort——指定串行口; PortOpen——串口是否打开; InPut——输入寄存器; Output——输出寄存器; InBufferSize——输入缓冲区大小; OutBufferSize——输出缓冲区大小; InputLen——由串行端口读入字符串长度或字节个数; Settings——设备波特率、传输数据位、校验位、停止位; InputMode——输入的是数据类型(文字形式或是二进制形式)。 上位机程序要和下位机配合起来。主要须考虑的问题是波特率、输入输出数据类型。对于从下位机到上位机输出数据的情况,可作以下处理(反之类似): Settings 115200,n,8,1(波特率115 200bps,校验位默认,8位数据位,1个停止位) 对于上位机,将输入的数据以二进制数形式获取要通过以下的转换: Dim data() As Byte Private Sub Timer1_Timer() data()=MSComm1.Input For i=LBound(data)To UBound(data) Text2.Text=data(i) Next End Sub 在串口打开的情况下,利用定时器定时从下位机获取数据,显示在窗口中。通过设置VB定时器控件的interval参数来控制读取时间。可见,上位机利用VB编写程序,十分方便,这是一种成熟的模块化语言,只要把参数给定,很快可以实现编程。 3 下位机通信程序编写 MAXPLUSII里有许多常用的宏单元,如计数器、四则运算、各类逻辑门乃至ROM、RAM等;而在这些宏单元里具体的参数都可以由用户来自行设定,这就是上面提到的IP核形式。由于CPLD数字设计中结构化设计的趋势,不同层次的IP(intellectual Property)核将出现。各个IP核可重复利用,大大提高了设计能力和效率,避免了重复劳动。以下设计的是下位机的IP核,它是一个波特率、起始位、停止位均可设定的宏单元。 MAXPLUSII的AHDL(Altera Hard ware Description Language)是Altera公司开发的完全集成于MAXPLUSII中的一种模块化语言,特别适合于描述复杂的组合逻辑、组运算、状态机和真值表。本文利用AHDL,直接生成IP核。 设计的终目标是生成如图1所示的Symbol。其参数可以由用户设定(如图1的右上角),选择先送(收)串行数据位或位、数据宽度、停止位等。
设计思想是利用状态机的3种状态send(receive)、wait、idle,系统时钟为输入的CLK,在这3种状态间变换。而BAUD为CLK分频后的波特率时间。发送时,当BAUD上升沿时,输出1位串行数据。输出全部结束时,BUSY端出现低电平信号,这时利用LOAD信号可以从D端读取并入的数据。由于使用的是AHDL,这种状态机实现起来非常方便,程序简洁明了。图2所示为状态机图。 程序清单如下: CASE Ss IS --状态机 WHEN idle => IF Load THEN Ss=wait; ELSE Ss=idle; END IF; WHEN wait => IF Baud THEN Ss=send; ELSE Ss=wait; END IF; WHEN send => IF count[]!=0 THEN Ss=wait; ELSE Ss=idle; END IF; WHEN OTHERS => Ss=idle; END CASE; TxD=InShift[WIDTH+1]; --TXD串出 IF Ss!=idle THEN --控制BUSY Busy=VCC; END IF; CASE Ss IS WHEN idle => count[]=WIDTH+STOP_BITS; --等传送的位数 WHEN send => count[ ]=count[ ]-1; WHEN OTHERS => Count[]=count[]; END CASE; CASE Ss IS --控制输入寄存器 WHEN idle => IF MSB_FIRST= =“YES”GENERATE DTMP[]=D[]; ELSE GENERATE FOR each_bit IN 0 TO WIDTH-1 GENERATE DTMP[WINDTH-1-each_bit]=D[each_bit]; END GENERATE; END GENERATE; InShift[]=(1,0,DTMP[]); WHEN send => InSift[WIDTH+1..1]=InShift[WIDTH..0]; InShift[0]=VCC; WHEN OTHERS=> InShift[]=InShift[]; END CASE; 图3为仿真波形,系统时钟CLK为6MHz,50分频后得到周期为868ns的时钟BAUD,即波特率为115 200 bps。设定为从高位到低位依次传送:起始位1位,低电平;8位数据位,1个停止位,为高电平。图3中显示分别传送十进制数20、21、22、23(即二进制数00010100 00010101 00010110 00010111)的情况,LOAD信号一直有效。可见,传送1个数据总共有10位,1个起始位、8个数据位、1个停止位。按照波特率115 200 bps,传送1个数据需要的时间为86.8μs。这个数度充分体现了CPLD的优势,比单片机MCU串行传输要快上10倍以上。如果上位机UART允许,这个速度还可以增大到接近MCU串行传输的100倍,即波特率为921 600 bps。 设计完成通过仿真以后,通过编程电磁将生成的pof文件用ISP(在线编程)方式到CPLD板EPM7128LC84-6,外接RS-232电平转换芯片HIN232CP。经过电平转换,CPLD和PC机接口通信,上位机用VB编写程序。试验证明,在高速情况下,通信正常。