用 VHDL 语言在 CPLD 上实现串行通信引言 随着 EDA 技术得发展,CPLD 已经在许多方面得到了广泛应用,而串行通信是实现远程测控的重要手段
本文利用 VHDL 语言在 CPLD 上实现了串行通信,完全可以脱离单片机使用,克服了单片机的许多缺点
串口结构及内容 本设计所采用的是异步通信方式,可以规定传输的一个数据是 10 位,其中最低位为启动位(逻辑 0 低电平),最高位为停止位(逻辑 1 高电平),中间 8 位是数据位
为了方便对数据进行正确控制,选取发送(接受)每位数据用 4 个时钟周期
为了能够达到串行通信的波特率,例如 4800B/s,则需把时钟频率设为 19
系统结构如图 1 所示: 图 1系统原理 首先介绍串行通信发送器的工作原理
6 位计数器用于判断发送的数据是否发送完毕及在发送完毕后装入新的数据,其 VHDL 语言程序如下: 由于本设计中选取一位数据 4 个时钟周期,因此当计数到“100111”时,表示 10 位数据发送完毕;此时将加载信号“load”置 1,则向移位寄存器加载 10 位数据
此计数器的时钟信号由 3 位计数器的进位信号提供,3 位计数器程序为如下: 当计数脉冲为 3 时,计数器清零并发出进位信号“carry”,“carry”既是 6 位计数器的时钟信号,又是移位寄存器的移位脉冲,移位寄存器实际上在发送器中是一个并串转换器,其程序为如下: 当加载信号高有效时,10 位数据从外部寄存器中并行载入 REG10,载入后在“carry”有效时,即每4 个 CLK 周期右移一位进入锁存器,进而从 TXD 发出
发送器的仿真波形如图 2 所示
图 2 接收器的结构与模块的功能与发送器相似
通过判断接收锁存器中的起始位是否为零,来确定接收与否
若有效时,3 位计数器开始计数,将锁存器中的数据逐位右移到移位寄存器中, 6 位计数器同样