UART(精选7篇)
UART 篇1
通用异步收发器 (Universal Asynchronous Receiver Transmitter, UART) 是数字通信领域流行和广泛使用的一种接口设备, 它可以和各种标准串行接口, 如RS232、RS485等进行异步通信, 具有传输距离远、成本低、可靠性高等优点。
一般来说UART通信需要使用专门的接口协议芯片, 但是这种协议芯片存在体积较大、接口复杂且成本较高的缺点。此外, 这种芯片的结构与功能相对固定, 在设计中缺乏灵活性。本文介绍了利用FPGA实现UART通讯的方法, 将原来UART专用协议芯片的功能集成到了FPGA中, 提高了设计的灵活性与可靠性。
1 UART通讯原理
支持UART的串行接口目前比较常用的有RS232、RS422、RS485等, 它们之间的区别主要表现在电气特性上, 但最基本的通讯原理是一样的。UART模块接收/发送的都是符合TTL (或CMOS) 标准的逻辑电平, 与外设之间还需要经过专门的转换芯片将通讯数据转化为符合RS232、RS422或RS485标准的电平。
UART作为一种异步串行通讯方式, 数据在通讯过程中是字节为单位按位传输, 一般从最低有效位 (LSB) 开始。典型的UART通讯数据格式如图1所示。
2 UART的FPGA实现
UART通讯模块内部逻辑结构如图2, 可分为控制模块、接收模块和发送模块, 各个模块的主要功能如下:
控制模块:根据CPU写入的数据配制UART通讯参数, 并根据接收、发送模块回送的指令产生相应中断上报给CPU, 对接收、发送模块状态进行监控、管理;
接收模块:该模块主要用于将接收到的串行数据转化为并行数据, 再以本地总线形式发送给CPU。此外, 该模块还将接收过程中的参数上报给控制模块, 用于监控管理以及接收中断、错误中断的产生。
发送模块:该模块主要用于将CPU要发送的数据在控制逻辑的调度下转化为串行数据后发送出去, 此外该模块还将发送过程中的参数上报给控制模块, 用于监控管理以及发送中断、错误中断的产生。
2.1接收模块的设计
该模块的数据接收过程通过一个状态机来实现, 其状态转移图如图3所示, 状态转移所用的时钟是波特率时钟16倍频clk16x。整个工作流程如下:
2.1.1系统复位后
状态机进入idle状态等待起始位, 当接收端电平由高变为低 (RXD值由1变为0) 时即为检测到了一个起始位, 状态机进入start状态;
2.1.2 start状态下
等待8个clk16x周期后再判断一次RXD的值, 若不为0, 则说明之前接收到的是由于线上干扰而引起的虚假起始位, 状态机返回idle状态;若仍为0则再等待8个clk16x周期后状态机进入shift状态;
2.1.3 shift状态下
模块每隔16个clk16x周期从RXD上读取1bit的数据进行移位操作, 直到读完全部8bit数据后, 若奇偶校验被使能, 则状态机进入parity状态, 否则直接进入stop状态;
2.1.4 parity状态下
模块等待16个clk16x周期从RXD上读取1bit的奇偶校验位的值, 之后状态机进入stop状态;
2.1.5 stop状态下
模块等待16个clk16x周期从RXD上读取1bit的停止位的值, 之后状态机进入done状态, 停止位值经取反操作后用做帧错误校验位;
2.1.6 done状态下
若奇偶校验被使能, 且奇偶检验与帧校验均正确, 或奇偶校验未被使能, 但帧校验正确时, 移位寄存器中的8bit数据被存入接收FIFO中, 否则该数据被丢弃。状态机将在1个clk16x周期后返回idle, 等待新数据。
2.2发送模块的设计
该模块的数据发送过程通过一个状态机来实现, 其状态转移图如图4所示, 状态转移所用的时钟是波特率时钟16倍频clk16x。整个工作流程如下:
2.2.1系统复位后
状态机进入idle状态等待发送FIFO中写入数据, 当FIFO的非空标志被置位时状态机进入start状态;
2.2.2 start状态下
模块先发送一个数据起始位, 同时从FIFO中读取一个字节的数据放入发送移位寄存器, 然后状态机进入shift状态;
2.2.3 shift状态下
模块按照LSB在前, MSB在后的顺序, 每间隔16个clk16x周期从移位寄存器中移出1bit的数据, 直到移完全部8bit数据后, 若奇偶校验被使能, 则状态机进入parity状态, 否则直接进入stop状态;
2.2.4 parity状态下
模块等待16个clk16x周期从TXD上发出1bit的奇偶校验位, 之后状态机进入stop状态;
2.2.5 stop状态下
模块等待16个clk16x周期从TXD上发出1bit的停止位 (TXD上为1) , 之后状态机进入done状态;
2.2.6 done状态下
表示一个字节数据发送完成, 状态机在1个clk16x周期后直接回到idle状态, 等待发送新的数据。
2.3控制模块的设计
控制模块的主要作用是根据CPU写入的参数对UART进行配制, 此外还能根据接收/发送模块的工作状态产生中断, 并上报给CPU。该模块内部结构由一个波特率时钟发生器、三个寄存器以及中断仲裁逻辑组成。
波特率时钟发生器能对输入的系统时钟进行分频操作, 从而产生相应的波特率16倍频后的时钟clk16x。
三个寄存器分别是控制寄存器 (conreg) 、中断使能寄存器 (int_en_reg) 以及状态寄存器 (statusreg) 。其中conreg和int_en_reg是只写存储器, 它们分别用于存储CPU写入的UART配制参数以及中断使能条件, UART即按照这两个寄存器中被写入的参数进行工作;statusreg是只读存储器, 存储了UART工作时的状态数据, CPU通过读取这些状态信息来做出相应的操作。
控制模块在中断被使能的前提下, 根据中断仲裁逻辑, 向CPU发送三种中断:错误中断、接收中断、发送中断。这三种中断的产生条件如下:
(1) 错误中断。当接收数据时, 若奇偶校验或帧校验错误, 则在接收端RXD上的串行数据全部移入移位寄存器后, 该中断即被置位;
(2) 接收中断。在接收到新数据, 并且接收到的数据被保存至接收FIFO后, 该中断即被置位;
(3) 发送中断。在发送数据时, 当发送FIFO中的数据被发送移位寄存器读空以后, 该中断即被置位。
3结论
本文提出了一种基于FPGA设计和实现UART的方法, 通过利用FPGA片上逻辑资源来实现UART的基本功能, 其通讯波特率、校验方法、中断方式均可根据实际需要进行配制。此外, 利用FPGA的可重配置性, 还可以在FPGA上方便的实现多路UART通讯扩展, 与传统设计相比, 能有效减少系统的PCB面积, 降低系统的功耗, 提高设计的稳定性和可靠性, 并可方便地进行系统升级和移植。
参考文献
[1]何健标, 王宏远, 林静宜, 等.基于最佳接收的UART的设计与实现[J].电子技术应用, 2006 (8) :55-58.
[2]何慧珠, 秦丽, 张会新.基于FPGA的UART IP设计与实现[J].微计算信息, 2008, 24 (1) :223-224.
[3]陈小琴.基于Verilog HDL的多功能信号发生器的设计与实现[J].仪器仪表学报, 2008, 29 (4) :322-324.
[4]季雄, 段继海, 胡媛媛, 等.基于Verilog HDL的UART设计[J].微计算机信息, 2006, 6 (2) :230-232.
[5]赵延, 葛利嘉, 双涛, 基于FPGA的UART设计实现及其验证方法[J], 现代电子技术, 2008 (17) :163-164.
UART 篇2
1 FPGA芯片介绍
Actel SmartFusion系列FPGA在Actel独特的模数混合Fusion系列的基础上融入了高效的ARM内核—Cortex-M3,该内核属于硬核,不占用FPGA的逻辑资源。这就使得SmartFusion系列FPGA不仅具有FPGA高速并行处理的特点,还具有ARM灵活控制的长处,它必将成为新一代SOC的完美解决方案[3]。SmartFusion系列FPGA的系统结构由三部分组成:Actel Flash架构的FPGA功能模块、Cortex-M3为控制器子系统(MSS)、模拟功能模块组成。SmartFusion系列FPGA有如下性能特色:低成本、低功耗、安全性、上电即行、固件错误免疫。
2 UART通信原理
串口通信可以分为两种类型:同步通信方式和异步通信方式。UART是通用异步收发器,是一种串行通信方式。在数据传输过程中是通过一位位地传输来实现通信的,串行通信方式具有传输线少,成本低等优点,缺点是速度慢[4]。由于接收和发送的时钟是可以独立的,这样有利于增加发送与接收的灵活性,所以一般多用异步通信方式。如图1所示为数据传输格式。UART传送一个字符的信息由起始位、数据位、奇偶校验位及停止位组成。每个字符的前面都有一个低电平的起始位,字符本身有5—8位数据位组成,接着是一位校验位(可选),最后是停止位(1位,1位半或2位),停止位后面是不定长度的空闲位[5]。停止位及空闲位都规定高电平,这样可以保证起始位开始处有一个下降沿。
3 UART在SmartFusion中的实现
3.1 UART硬件电路设计
硬件电路主要由SmartFusion系列FPGA串口模块、MAX3232组成,电路原理图如图2和图3所示,数据从F_TXD0(以一个口举例)进入MAX3232进行电平转换,之后从FPGA_TXDA输出送入SmartFusion串口模块中,然后进行串并转换后由数据总线进入FPGA的其他模块中。数据经过处理之后进行并串转换后由FPGA_RXDA输入,再经过MAX3232电平转换后由F_RXD0输出。
3.2 UART的结构设计
如图4所示UART由三部分组成:波特率发生模块、发送模块、接收模块[1]。
4 UART模块设计及仿真
4.1 波特率发生器的设计
在实际应用中,波特率发生器产生的分频时钟是波特率时钟的16倍, 目的是为了在接收时进行精确的采样,降低采样错误的概率,以提取异步的串行数据[6]。其时序如图5所示,图中clk1x是由clk16x倍频得到的,从而产生了数据收发时钟。
以下是波特率16倍频的代码:
4.2 接收模块设计
接收模块如图6所示,接收模块的作用是把收到的串行数据转换成并行数据进行输出,并判断是否有错。接收模块从获取数据串的第一个0开始工作,然后把随后依次输入的8位数据位通过移位,在寄存器中完成串并转换,并将并行数据输出至端口Dout[7:0]。将8个数据位移位至寄存器后,接收模块将检测输入数据串的最后一位是否为1(停止位)来判断接收到的数据正确与否,若不为1,输出Frame_e将被置1。
a) Rxd 串行数据输入端;
b) Clk16x 系统分频后的时钟信号;
c) Rst 全局复位;
d) Rdn 输出控制端;
e) Dout[7:0] 并行数据输出端;
f) Data_ready 接收数据准备好标志;
g) Frame_e 帧出错标志;
h) Parity_er 奇偶校验出错标志。
接收模块时序仿真波形如图7所示。测试的串行接收数据位为00111000,同时rxd还包括1位开始位、1位停止位。接收的并行数据Dout[7:0]为00111000,奇偶校验位没有出错,满足数据帧传输格式。
接收模块测试部分程序如下所示。
4.3 发送模块设计
发送模块如图8所示,发送模块主要实现对并行数据的转换,即将并行数据转换成串行数据,并把串行数据按照既定数据帧格式进行输出。串行数据由1位起始位,8位数据位,1位停止位组成。设计中增加了写控制信号Wrn、串并转换过程标志,使得UART发送模块应用更加灵活。
a) Clk16x 系统分频后的时钟信号;
b) Rst 全局复位;
c) Wrn 写控制信号;
d) Tsre 并串转换过程标志;
e) Tbre 整个工作过程标志;
f) Din 8位并行数据输入端;
g) Sdo 并串转换后数据输出端。
发送模块时序仿真波形如图9所示。测试的并行数据有两个Din=11110000和Din=10101010,由仿真波形知输出Sdo=11110000和Sdo=10101010输出与输入一致,其中输入第一串数时,有1位开始位(低电平),8位数据位,1位停止位,满足串行帧传输格式。
发送模块测试部分程序如下所示:
5 结论
设计采用FPGA实现UART模块的功能,可以减小系统面积,降低功耗,同时使得设计更加紧凑和稳定。设计中使用了Verilog HDL语言[7],FPGA选用了SmartFusion AF200系列,此款FPGA是基于FLASH的,配置信息都存放在片内FLASH中,与传统的SRAM FPGA比起来,它具有体积小,功耗低,安全性高等特点。设计实现了标准UART模块并加以验证,在某些具体应用中,也可以将本设计中的发送和接收模块单独使用,进一步体现了FPGA设计的灵活性。
本文的创新点在于提出了基于FLASH架构的FPGA的UART模块设计,大大节约了SmartFusion内嵌ARM资源,提高整个系统的运行效率。模块化的设计和各种控制信号的提出,也使得基于FPGA的UART的应用更加灵活。
参考文献
[1]杨夏,王平,张军.基于FPGA的简化UART电路设计.微计算机信息,2008;24(08):226—227
[2]郑争兵.一种基于FPGA的UART电路设计.国外电子测控技术,2010;7(07):85—87
[3] Wong Bill.FPGA combines hard-core cortex-m3 and analog peripher-als.Electronic Design,2010;58(5):35—39
[4]张明.基于FPGA的UART控制器的多模块设计与实现.中国科技信息,2006;(16):140—142
[5]唐建.LPC总线接口UART控制器FPGA实现.四川:电子科技大学学位论文,2008:38—52
[6]刘贤明,赵侃,谢恺.一种基于FPGA的IP核设计.四川兵工报,2011;(03):70—72
UART 篇3
1 UART原理及设计简介
UART的全称是通用异步收发器 (Universal Asynchronous Receiver/Transmitter) , 是实现设备之间低速数据通信的标准协议。“异步”指不需要额外的时钟线进行数据的同步传输, 是一种串行总线接口, 只需占用2根线就可以完成数据的收发 (1根接收数据, 1根发送数据) 。
UART一帧由起始位、数据位、校验位和停止位组成。数据逐位传输, 示意图如图1所示。
异步通信要求发送的每一帧数据都必须按照图1给定的UART格式进行格式化。一帧数据由4部分组成, 首先是起始位“0”;接着是发送的数据 (这里采用8位) ;然后是可选的检验位来判断接收数据有无错误 (这里选用奇检验) ;最后是停止位“1” (停止位可以为1位、1.5位和2位) 。若线路上没有传输的数据, 则线路始终保持为“1”, 即空闲。接收端不断检测线路状态, 非接收状态下如果检测到线路由“1”变为“0” (“0”至少保持8个内部时钟周期) , 则认为有发送数据需接收, 接收器进入接收阶段。
UART模块总结构如图2所示。首先, 发送时按照UART帧格式, 由发送写信号启动发送波特率发生器, 先发送一位起始位, 然后由发送波特率发生器时钟启动发送移位寄存器, 将发送数据存入发送移位寄存器, 并将发送一位寄存器中的数据发送, 同时由发送波特率发生器时钟启动发送数据计数器, 当计数器计数到第10位时, 产生奇偶校验位, 此时发送奇偶校验位, 计数到第11位时, 发送停止位, 同时产生发送完成指示信号。接收时, 先接收端开始检测并确认起始位, 然后通知UART控制端口接收数据, 开启接收波特率发生器, 依靠接收波特率发生器产生的时钟信号将发送的8位数据移入接收移位寄存, 同时由接收波特率发生器产生的时钟信号启动接收数据计数器, 当计数器计数到第10位, 也就是奇偶校验位时, 判断接收到的检测奇偶校验位是否发生错误, 错误则放弃将接收移位寄存器中的数据输出, 正确则接着接收停止位, 没有接收到停止位逻辑“1”, 则标志帧错误, 放弃将接收数据输出, 反之, 将接收数据输出, 产生接收完成信号指示信号。
2 UART设计
由图2可以看出, UART设计主要分为发送和接收2个模块组成。采用Verilog HDL硬件描述语言按照Top to Down的思想对各个模块先分别设计然后连接起来形成总体架构。
2.1 发送子模块
发送子模块的状态图如图3所示。
发送子模块由5个状态转换:空闲状态、发送起始位状态、发送数据状态、添加奇偶位状态和添加停止位状态。
(1) 空闲状态:在复位时或者在没有检测到发送写信号下降沿时, 保持空闲状态。
(2) 发送起始位状态:在检测到发送写信号下降沿时, 启动发送波特率发生器 (周期为内部时钟的16倍) , 开始发送起始位“0”, 由于在空闲状态时发送数据线处于高电平“1”状态, 所以在发送起始位之后, 发送数据线会产生一个下降沿, 这个下降沿可以启动数据接收。
(3) 发送数据状态:这里采用发送8位数据, 从高位到低位依次发送8位数据, 发送完毕进入下一个状态。
(4) 添加奇偶位状态:奇/偶校验是对数据进行逐位同或/异或运算, 这里采用奇校验, 简单来讲, 即在数据位后面添加“0”或“1”, 使最后输出数据“1”的个数为奇数。
(5) 添加停止位状态:输出停止位“1”, 进入空闲状态。
2.2 接收子模块
接收子模块的状态图如图4所示。
接收模块也有5个状态:空闲状态、起始位接收判断是否有效状态、接收数据状态、判断奇偶校验结果状态、接收停止位并判断帧错误状态。
(1) 空闲状态:在复位时或者未检测到起始位时, 保持空闲状态。
(2) 起始位接收并判断是否有效状态:在接收到接收数据线RXD的下降沿时, 开始对起始位检测, 如果在内部时钟前8个时钟对RXD采样都是“0”时, 说明起始位有效, 否则认为是抖动引起的下降沿, 回到空闲状态。起始位有效后, 启动接收波特率发生器, 接收波特率发生器的时钟频率和发送波特率发生器的时钟周期一样, 为内部时钟CLK的16倍, 这是为了发送接收时钟同步。但是, 光靠时钟同步是不能保证接收数据的正确, 如图5接收模块时序同步示意图所示, 由于发送数据每个周期发送一位数据, 所以发送数据TXD的周期为发送时钟的2倍, 同时RXD也是接收时钟的2倍, 即内部时钟CLK周期的32倍, 如果要保证在接收时钟CLK_REC上升沿时, 在RXD中间部位采样第一位数据 (这样的采样数据更可靠) , 就要求接收时钟CLK_REC选择是高电平开始启动, 还是低电平开始启动, 由于检测起始位用了8个CLK, 如果要检测到起始位有效后在接收第一个数据RXD1中部采样数据, 要求接着延时16个时钟CLK, 因此, 应该选择高电平启动接收时钟CLK_REC, 这样就可以确保接收的数据可靠有效。
(3) 数据接收状态:接收数据线RXD上传送过来的8位数据, 接收完毕后进入下一个状态。
(4) 判断奇偶校验结果状态:将RXD上接收到的奇偶校验位跟接收数据计算后的奇偶校验位比较, 判断结果, 如果相同, 则进入下一个状态, 否则回到空闲状态。
(5) 接收停止位并判断帧错误状态:将RXD上接收到的停止位与“1”作比较, 相同则将接收数据输出, 否则直接进入空闲状态。
3 仿真功能分析
设计的仿真采用Modelsim仿真, 设计对UART的功能进行了仿真。图6是接收模块仿真图, 接收数据输入RXD上的数据依次为11010101、10010101、10110101, 在每次接收完成一帧数据后, 标志位rxrdy置“1”, 在开始下一次接收时, 标志位rxrdy置“0”, 奇校验位和帧错误位一直为“0”, 说明奇校验校验正确, 帧接收数据也正确, 因此, 在标志位rxrdy置“1”时, 输出数据, 仿真结果正确可靠。
图7是发射模块仿真图, 在写信号 (wrsig) 出现下降沿时, 开始发送数据, 首先发送起始位“0”, 然后发送8位数据10101011, 接着发送奇校验位0, 最后发送停止位“1”, 发送完成8位数据后, txdone标志位置“1”, 发送完一帧数据后, 标志位paritycycle置“1”, 观察输出数据tx波形, 结果正确可靠。
4 结语
本文介绍了基于Verilog HDL设计的UART模块, 采样点选择可靠, 其可准确判断接收数据的起始, 创新点在于接收器与接收数据同步实现, 串行数据能被准确接收, 并通过在Model Sim下的仿真, 可下载至可编程逻辑器件中, 实现UART功能。
参考文献
[1]王冠, 黄熙, 王鹰.Verilog HDL与数字集成电路设计[M].北京:机械工业出版社, 2006
UART 篇4
尽管控制器局域网 (controller area network, CAN) 总线最初主要应用于汽车内部测量和执行部件之间的数据通信, 但经过20多年的发展, 当前CAN总线规范已被国际标准化组织 (ISO) 制定为国际标准, 即高速应用的ISO11898和低速应用的ISO11519。
CAN协议定义了开放系统互联 (OSI) 模型7层结构中的物理层和数据链路层。与其它串行总线相比, CAN协议的独特性主要体现在:总线节点多主通讯方式;采用非破坏性载波监听多路访问冲突避免 (CSMA/CA) 总线仲裁技术;短帧格式以满足实时性需求。从而, CAN总线在汽车、医疗、铁路列车和城市轨道列车、消防报警、机器人以及工业自动化等领域得到广泛应用[1,2,3,4,5,6,7,8,9,10,11,12,13]。
通常, 应用CAN现场总线的集成系统可分为2类:一类是由具备CAN接入功能的主要节点和部分不具备CAN接入功能的节点组成, 而不具备CAN接入的设备则通过转换器或转换模块来实现底层物理连接;另一类则是全部节点具备CAN接入功能。在第一类系统的集成时, 对于不具备CAN总线接入的设备一般采用转换模块来实现;CAN转换模块具体包括USB/CAN、RS232或RS485/CAN和以太网/CAN等, 如:武汉迈威光电技术有限公司的MWE232-CAN隔离转换器和MWE-CAN100协议转换器;重庆勤智科技有限公司的CAN 232/485转换器;武汉吉阳光电科技有限公司的GY8507 USB-CAN适配器;广州致远电子有限公司的USBCAN-Ⅰ/Ⅱ接口模块、CAN485MB智能协议转换器和CANET系列以太网-CAN转换器。这些转换器能方便地将具有USB、RS232、RS485或者以太网接口的设备挂接到CAN总线上, 但这类应用的兼容性无法保障且应用通信软件开发难度大, 系统的可靠性和稳定性往往较低。而设计具备CAN接口的节点则成为设备制造商的必然选择。
笔者曾对CAN总线智能节点硬件设计的芯片选型问题进行探讨, 并介绍了当时国内应用较广泛的CAN收发器、CAN独立控制器和内置CAN控制器的微处理器, 比较了采用CAN独立控制器和直接使用内置CAN控制器的微处理器的设计方案, 认为直接采用内置CAN控制器的微处理器设计CAN节点电路结构简洁紧凑, 有利于提高设计效率[14]。然而, 电子产品设计不仅需考虑应用需求, 还须从电子元器件选型、产品结构、嵌入式应用软件继承等多角度充分论证。尽管目前市场上已有许多内置CAN控制器的微处理器, 但无论从微处理器发展历史来看, 还是内嵌通信结构而言, 通用异步收发器 (universalasynchronous receiver and transmitter, UART) 具有更悠久的历史和更广泛的应用。表1列出了部分微处理器型号及其内部集成UART模块的数量。因此, 从充分继承已有硬件和软件应用的角度出发, 在设计具备CAN接口的嵌入式智能设备时, 采用UART/CAN接口转换方案同样具有一定的应用前景, 而CSM100芯片能满足设计此类嵌入式设备的需要。应用CSM100模块可方便地完成具有UART结构的嵌入式微控制器实现CAN总线接口, 特别适用于工业智能设备的升级换代。
1 基于 CSM100 芯片的电路设计
1.1 CSM100 芯片简介
CSM100芯片是广州致远电子有限公司于2006年推出的嵌入式UART转CAN模块。该芯片集成了具有Flash ROM、RAM、EEPROM和看门狗的8位微处理器、CAN控制器、CAN收发驱动器、电源电路和隔离电路。其主要特点包括:1) 支持CAN2.0A和CAN2.0B规范;2) 支持透明转换和透明带标识转换方式;3) 内置DC/DC模块, 隔离电压2500 VDC;4) 内置高速光电隔离电路;5) 集成有1路标准UART接口 (支持3.3 V或5 V系统的TTL电平) 和1路CAN总线接口;6) UART波特率范围:600 b/s~115200 b/s, CAN支持5 kb/s~1000 kb/s的15种标准通讯波特率;7) 最高数据帧流量:400帧/秒;8) 工作温度范围:—40℃~+85℃;9) 外形尺寸为31.5 mm×19.9 mm×6.5 mm, 相当于DIP24的集成电路[15]。
另外, CSM100系列芯片最初只有CSM100和CSM100T这2个型号, 后者支持自定义协议转换。致远公司于2013年和2014年又推出了3个型号:CSM100TL、CSM100-L和CSM100V33。这3款芯片将CAN侧的隔离地外引至芯片引脚, 以满足集成系统对总线侧参考电平接线的需求, 从而避免CANH或CANL引脚电平偏离CAN驱动芯片的可承受范围;而CSM100V33则适用于3.3 V的应用系统。
1.2 与 CSM100 相关的电路设计
应用CSM100实现CAN总线接入功能的典型电路如图1所示, 具体包括电源引脚 (Vin与GND) 、UART引脚 (RXD与TXD) 、CSM100配置功能控制引脚 (CFG与RST) 以及CAN驱动引脚 (CANH与CANL) 。特别地, CSM100芯片要求供电电源:DC (5±5%) V, 最大电流<70 mA;而UART接口支持3.3 V或5 V系统的TTL电平。
图1电路包含总线终端匹配电阻 (R1=120Ω) , 而未考虑保护功能。通常要求CAN总线接口具有静电保护、瞬态电压抑制和抗浪涌性能, 可在CANH和CANL端加入瞬态抑制二极管 (transient voltagesuppressor, TVS ) 器件, 如MMBZ27VCLT1、SMBJ5.0A或PESD1CAN[16]。
图1设计中, 考虑到CSM100的参数配置和正常工作这2种模式。根据CSM100 Eva评估板 (V1.1) 电路, 图1设计了用于微控制器 (MCU) 在线修改CSM100参数配置所需的2个控制信号CFG和RST, 以提高灵活性, 也免去生产过程对每一片CSM100参数预配置这一环节。而厂商提供的用户手册仅包括以下信息:将配置引脚 (CFG) 接参考电平地 (GND) , 重新上电可令芯片进入参数配置模式。在应用电路中, CSM100电源的通/断控制需增强型场效应管或其它开关器件 (如单压摆率负载开关器件AP2281) 。通过分析评估板电路, 芯片引脚3为CSM100内部微处理器的复位端。图1电路采用引脚CFG和RST来控制CSM100的工作模式:引脚RST=LOW (低电平) 时CSM100处于复位有效;MCU只需置CFG=LOW, 再复位CSM100, 则可令CSM100进入参数配置模式, 适时地修改CSM100的工作参数。反之, 置CFG=HIGH (高电平) , 复位CSM100, 则可令CSM100处于正常工作状态。
2 CSM100 芯片工作模式及通讯分析
CSM100系列芯片定义了透明转换概念, 即UART转CAN:将串行总线中的数据不作任何修改地转换为CAN报文并传送到CAN-bus网络;CAN转UART:将CAN-bus网络的CAN报文不作任何修改地转换为串行总线中的数据[15]。
CSM100系列芯片支持3种CAN/UART转换方式:透明转换、透明带标识转换和自定义协议。其中, 仅CSM100T和CSM100TL芯片支持自定义协议的转换方式。而工作于何种方式则由CSM100内部可修改的工作参数确定。
CSM100芯片的内部工作参数由3部分组成, 1) 转换工作参数:转换方式、转换方向、CAN帧标识处理、UART数据帧之间的时间间隔等;2) UART工作参数:UART通讯波特率和数据位格式;3) CAN工作参数:CAN波特率、帧类型 (标准帧和扩展帧) 、发送帧标识、滤波使能、接收过滤模式、验收码和屏蔽码。
无论是参数配置模式, 还是正常工作模式, CSM100芯片UART的通讯格式固定为1个起始位、8个数据位、1个停止位、无奇偶校验位。
2.1 参数配置模式
将CSM100的配置引脚 (CFG) 拉至低电平, 重新上电;或者, 如图1所示电路的MCU置CFG=LOW (低电平) , 再复位CSM100 (产生1个低电平脉冲) , 则可使CSM100进入参数配置模式, 直到下一次上电或复位。
CSM100芯片在参数配置模式下, UART的波特率固定为19200 b/s, 且采用厂商自定义的固定命令帧和应答帧, 其格式包括帧起始字、命令字节、数据长度、数据域 (或状态字节) 和校验字节。其中命令字包括参数配置 (01) 、验证产品标识 (02) 、读参数配置 (03) 和读软件版本号及生产日期 (04) 。
依据致远公司提供的《CSM100嵌入式模块配置格式》技术资料, CSM100芯片包含56字节的工作参数和4字节的产品标识, 其工作参数如表2所示。
2.2 正常工作模式
CSM100芯片在正常模式下, 可工作于透明转换或者透明带标识转换方式, 具体由转换工作参数的转换方式决定。
2.2.1 透明转换方式
CSM100透明转换方式的特点:可不增加UART的通讯数据, 实时地将需传送的数据在UART数据帧和CAN报文间转换, 能承担较大流量的数据传输[17]。
以CAN标准帧、传送8字节数据为例, CSM100在透明转换方式下, UART与CAN报文的数据转换情况如图2所示。当UART向CAN报文转换时, CAN报文的帧信息 (即标准帧或扩展帧) 和配置标识 (标准帧2字节, 扩展帧4字节) 由转换工作参数 (见表2) 中的“UART向CAN转换时配置的CAN帧信息”和“UART向CAN转换时的ID1、ID2、ID3、ID4”这几项参数预先设定;而CAN报文向UART转换时, 图2 (b) 的虚线框所示CAN报文的帧信息和帧ID是否向UART转换则由转换工作参数 (见表2) 中的“向UART转换时CAN帧信息转发使能”和“向UART转换时CAN帧ID转发使能”这2个参数确定。当UART传送的数据长度小于8个字节时, CSM100内部微处理器以转换工作参数中“UART帧时间间隔字符数”定义的时间 (简称TFF) 来判识不同的UART数据帧。即当UART空闲超过TFF时, CSM100则立即将此前UART传送的数据帧以CAN报文的形式发送到CAN总线上。
由以上分析可知, CSM100透明转换方式适用于设备所发CAN帧标识 (ID) 固定不变的应用场合;而不适用于同一设备需传送不同帧ID的应用, 即不适用于CANopen应用层协议的实现。若CAN报文向UART转换时关闭“CAN帧信息”和“CAN帧ID”的转换, 则对于互连2个设备的UART端而言, 可等效视为长距离的双工串行通讯, 应用层可采用其它长数据串的协议;但仅限于双节点CAN互连的应用。
2.2.2 透明带标识转换方式
CSM100工作于透明带标识转换方式时, 将UART数据帧中指定位置和长度的数据自动转换成CAN报文的帧ID, 而具体的位置和字节长度由转换工作参数 (见表2) 中的“UART帧中CAN标识起始地址”和“UART帧中CAN标识的长度”预先设定;在CAN报文向UART转换时, 也将CAN帧ID转换在UART数据帧的相应位置。以CAN标准帧 (2字节ID) 、帧ID起始地址=0 (即UART第1、2字节为帧ID) 为例, CSM100透明带标识转换示例如图3所示。
(a) UART转CAN报文 (b) CAN报文转UART
CSM100透明带标识转换方式下, UART数据帧的划分完全依赖于帧与帧之间的时间间隔;即在同一数据帧内, 外部MCU发送给CSM100相邻字节之间的时间不能大于TFF, 否则CSM100将认为从UART端接收到2个数据帧。
特别地, 当向CSM100芯片发送的UART数据帧长度大于“8字节与CAN帧ID字节长度”之和时 (即出现“超长UART数据帧”) , CSM100将向CAN总线发送2个甚至更多的CAN报文, 而每一个报文的CAN帧ID都相同 (均为该UART数据帧指定位置和长度的数据) 。这样, 若CAN总线上挂接了另一个由CSM100芯片组成的设备, 该设备的CSM100只能对每个CAN报文进行带“帧ID”的转换, 即在UART端接收到多个带CAN帧ID的UART数据帧。因此, 在2个设备UART数据帧出现“发送方所发数据和接收方接收的数据不对等”的现象:接收方UART的每一帧都包含“帧ID”部分。
CSM100透明带标识转换方式适用于所发CAN帧ID需根据不同功能而适当改变的应用场合, 如CANopen协议的实现。
2.3 CSM100 通讯数据分析
无论CSM100工作于透明转换方式, 还是透明带标识转换方式, 都必须保证接收方能够准确、唯一地解析发送方所发的数据。由于UART数据帧和CAN报文在帧识别、字节长度等方面的不同, 可能导致在同一总线的多个基于CSM100的CAN节点在UART接收方不能完全按发送方的次序还原数据串, 从而破坏应用层协议。
应用CSM100芯片设计CANopen协议等严格依照CAN规范每帧数据域最多8字节的智能设备时, 只需依照CAN及相关应用层规范来实现, UART发送帧和接收帧的辨识依据为帧间间隔时间是否大于TFF。此时, CSM100工作于透明带标识转换方式, 在嵌入式软件实现方面, 外部微控制器的UART发送程序:传送的数据帧不出现“超长UART数据帧”, 且每一个UART数据帧发送完成后至少延时TFF, 再发下一帧;外部微控制器的UART接收程序:对于数据域为8字节的UART数据帧可按字节总长度来识别 (如图3示例, UART接收数据帧总长度为10字节) , 而对于数据域小于8字节的UART数据帧则以TFF间隔时间来判识。
应用CSM100芯片实现CAN互连, 从外部微控制器UART发送和接收的角度, 应用层协议需解析的有效数据串超过8字节时, 则可分为2种情形:
1) CAN总线上只有2个节点的特殊应用场合, 如图4所示。通常, 外部MCU程序可保证不出现上文所述透明带标识转换方式“超长UART数据帧”的情形;节点A的MCU通过UART向CSM100发送的每一帧数据, 经CSM100传送到CAN总线后, 节点B的CSM100将依次把CAN报文转换为对应的UART数据帧。这样, 接收方 (节点B) UART所接收的数据帧顺序与发送方 (节点A) 的发送次序完全相同, 如图4示例:节点B接收到的数据帧依次为a1、a2、a3。从而, UART的多个数据帧可以容易地组合形成更高一层的应用数据协议, 该应用层协议可以不受CAN报文数据域8字节长度的限制。
2) 当CAN总线上有3个或更多节点 (如图5所示) 时, 由于每个节点所发报文出现在CAN总线上的时间具有不确定性, 此处仅讨论节点B接收的情形:节点B收到的UART数据帧顺序可能无法与发送方 (节点A) 完全一致, 即图5中节点B接收的UART数据帧依次为a1、c1、a2、a3 (包含了节点C发送的UART数据帧) 。此时, 若应用数据协议仍是由多个UART数据帧组合而成, 将导致通讯协议解析程序的复杂化, 大大增加MCU软件设计的难度;并且, 由于接收数据包混杂着多个节点所传的UART数据帧, 必然降低数据的实时性。
因此, 应用CSM100芯片开发CAN总线节点时, 常推荐采用遵循以CAN标准为基础的应用层协议。
3 管理 CSM100 的嵌入式软件设计
与CSM100芯片相关的微控制器程序主要由2部分组成:1) 参数配置模式下, 通过UART读取CSM100的工作参数, 并判断参数是否符合应用需要, 必要时修改CSM100的工作参数;2) 正常工作模式下, 按照应用层约定, 设计UART的发送和接收处理程序。
采用面向过程的结构化程序设计方法, 编写嵌入式软件。微控制器对CSM100的管理过程包括参数配置模式复位、参数配置模式启动、读CSM100参数、写CSM100参数、正常工作模式复位、正常工作模式启动、工作状态1、工作状态2, 以及每一个过程对应的延时, 其过程转换如图6所示。其中, 工作状态1和2用于发送不同优先级的应用数据。每一个管理过程及其延时对应一个管理阶段, 图6未画出启动CSM100时, 微控制器自身UART模块的初始化处理。在读/写CSM100参数阶段, UART的波特率为19200b/s, 微控制器发送CSM100命令帧和处理相应的应答帧;在工作状态1和2阶段, UART的波特率须与CSM100对应参数定义一致, 微控制器完成UART发送和接收处理。
4 结语
CSM100系列芯片内部集成了一个高性能微处理器和包含光电耦合器、DC/DC转换器、CAN总线驱动器等必要的器件, CAN通道支持CiA (CAN inAutomation) 组织推荐的15种标准波特率。在嵌入式智能产品设计和升级换代中, 采用CSM100芯片实现CAN总线接口, 具有体积小、应用设计方便等特点, 特别适用于那些采用了内部未集成CAN控制器的微处理器, 而需增加CAN总线功能的智能设备。
UART 篇5
随着物联网技术发展需要,2.4 GHz频段的无线应用得到了空前发展,无线空中传输速率较快,无线模块提供给用户使用的大多为SPI接口。相对于UART接口来说,SPI接口采用同步串行传输,传输速度较快,但是通信时传输距离短、要占用更多的CPU、内存和I/O接口资源。UART接口是全双工异步接口,大部分MCU自带这种接口,使用时编程简单,占用内存少。根据用户需要,可以将UART接口转换为RS 232电平或RS 422电平,延长传输距离,所以UART接口在控制类领域仍大量使用。
基于UART接口的无线模块,不用设计额外的电路和程序,可以按有线方式使多个节点进行通信,并且受地理条件限制少、安装灵活。本文依据市场发展需求,研究和设计了一种基于STC15W204S单片机和nRF24L01无线射频收发芯片实现的小成本、低功耗UART无线模块。
1 UART无线模块传输数据面临的问题及解决方案
UART无线模块接口示意如图1所示,单片机STC15W204S一方面接收UART接口的数据和配置命令,另一方面通过SPI接口与nRF24L01进行通信,传送数据、命令、启动发送和检测接收等功能。在设计时一方面要解决各种接口速度不匹配问题,另一方面还要尽量提高数据传输速度。
1.1 速度匹配问题
通过对UART、SPI和无线这三种通信模式的数据传输速度分析来看,SPI通信的速度是由STC15W204S提供的时钟信号决定的,可以达到5 Mb/s;nRF24L01的无线数据包空中速率可以设置为250 Kb/s,1 Mb/s和2 Mb/s,速度虽然快,但数据是以数据包方式在空中传输,不具备连续性;UART传送数据的速度范围为每秒几百位到1.5 Mb/s,其速率受发送和接收线对距离(线长度)的影响非常大,常用速度一般不会超过128 Kb/s。由于三种通信模式的数据传输速度不一致,在数据传输过程中难免会有部分数据积压,需要合理的设置一段存储区来处理数据。
1.2 无线通信有效数据传输速率问题
nRF24L01的无线数据包包含前导码、地址、标志位、数据(1~32 B)和校验,发射时消耗在启动、发送接收模式切换和应答时间较长。由于数据包中数据长度可以设置1~32 B,其有效数据传输率相差很大。下面以发送一包数据时序来分析其有效数据传输速率,如图2所示,为增强型SchockBurstTM模式发送一个有效字节的数据包所需时间为339μs,每增加一个有效字节仅需4μs,设发送一包数据的时间为TECB,MCU上传数据至nRF24L01的时间为TUL,发送的有效字节数为N,则根据时序图可以得到公式(1):
当STC15W204S的晶振设为22.118 4 MHz时,经编程测试,TUL消耗时间为250μs,故TECB=250+335+4N=585+4N。
其有效数据通信频率设为F,则得到公式(2):
将TECB的值代入公式(2)得到:
当N=1 B时,F=13.582 Kb/s;
当N=32B时,F=359.04 Kb/s。
由此可见,数据长度的大小很大程度上影响了无线数据传输效率,一个数据包中数据长度越大,则数据传输效率越高。
为了提高数据传输速率,每个无线数据包尽量包含更多的有效数据,但是两个无线数据包之间会有一定时间间隔,如果每个数据包都按最大有效数据量来打包,当UART接收数据量达不到打包条件时,则会使程序处于等待打包状态,即使可以增加延时退出程序来解决,由于消耗CPU时间较长导致实时性差。
如果每从UART接收一个数据就打包发送,虽然实时性高,但传输效率很差,经测试,在这种情况下,UART速度最大可设置为4 800 b/s。
所以在无线数据打包时,变长长度的数据包可以有效地解决数据传输速度和实时性问题。
2 解决方案
STC15W204S单片机的UART为全双工通信方式,但发送和接收缓冲器只有1个字节,为了解决数据传输的速度匹配和无线数据实时性较差这两个问题,需要设计一个缓冲区对接收和发送的数据进行缓存。在设计缓冲区时,除了考虑其大小来满足通信需要,还要考虑如何减少CPU处理数据的时间。首先确定UART数据缓冲区大小,设置数据写入和读出操作指针,指针通过取模的方式循环指向缓冲区内的位置。当接收新数据时,数据写入指针通过加1取模调整,然后写入数据,当从缓冲区读数据时,数据读出指针通过加1取模调整,然后取出数据。这样,缓冲区内部数据不需要进行移动,大大节省了CPU处理数据的时间。
当UART向无线接口发送数据时,将无线数据包的数据长度设置为32个字节,最后1个字节定义为有效数据长度,为了保障通信的实时性,只要UART接收缓冲区中有数据就启动一次无线打包发送程序,将数据全部打包传输,数据包的长度是变长的,不超过31个字节,最后1个字节为有效数据长度。这样既提高了数据传输效率,又保证传输实时性。
3 程序设计
在RAM中定义两个存储区,一个为接收缓冲区,一个为发送缓冲区。接收缓冲区长度宏定义为RECV_BUF_LEN,发送缓冲区长度定义为TRANS_BUF_LEN,具体值通过宏定义设置。定义变量Recv_In_Pointer和Recv_Out_Pointer分别为接收缓冲区数据写入和读出指针,Trans_In_Pointer和Trans_Out_Pointer为发送缓冲区数据写入和读出指针,调整指针后,对指针取模,则指针固定指向某个范围区域,构成循环缓冲区。下面讨论UART接收数据缓冲区工作原理。
为了避免UART的接收和发送数据时使CPU处于等待状态,UART的接收和发送采用中断模式,在中断服务程序中再判断是接收中断还是发送中断。如果是接收中断则将UART数据写入接收缓冲区,并调整写入数据指针,使之指向下一个空数据项。如果是发送中断,则调整数据读出指针,如果发送缓冲区没有数据,则将发送数据结束标志置位。
设置RECV_BUF_LEN=16,在接收数据缓冲区,其初始状态为输入指针Recv_In_Pointer和输出指针Recv_Out_职Pointer都指向接收缓冲区位置0处,如图3(a)所示。当UART接收到数据,进入UART中断服务程序,将数据写入接收缓冲区Recv_In_Pointer指向的位置,然后调整指针Recv_In_Pointer,使其指向空数据项,同时将位变量Recv_End置1,表示接收缓冲区已有新数据,如图3(b)所示。当接收缓冲区有数据(Recv_End=1),CPU处理UART数据时,从接收缓冲区Recv_Out_Pointer指向的位置读出数据,然后调整指针Recv_Out_Pointer,使其指向下一个数据项,当Recv_In_Pointer和Recv_Out_Pointer的值相同则表示接收缓冲区中无数据,同时将Recv_End清1。如果CPU不及时处理接收缓冲区中的数据,当UART接收数据过多时,就会使接收缓冲区溢出,如图3(d)所示。
下面介绍从UART接收到无线发送的部分程序。
UART中断接收部分程序如下:
在无线打包程序设计过程中,数据包最大数据长度为32 B,采用变长数据发送模式,将数据包的最后1个字节用来表示有效数据长度,有效数据长度宏定义为TX_PLOAD_WIDTH,可以在编译之前设置,最大长度为31 B,无线打包发送程序如下:
对于UART发送数据缓冲区,它的工作是接收无线数据包至无线接收缓冲区,然后对数据进行分析,提取有效数据,通过UART口发出。由于无线数据包数据项的最后一个字节表示有效数据长度,通过这个字节就可以知道应该从无线接收缓冲区取出多少字节的数据。单片机在这方面处理的速度远远高于无线打包程序处理速度,所以这方面程序不需要过多优化。
4 测试
测试时采用长数据串连续传输,传输时会将数据分成多个数据包,根据UART接收数据量的多少变长打包,当UART接收数据速度越快,则无线数据包中含有的有效数据量越大。由于无线数据包中的数据长度设置为32个字节,最后1个字节表示有效数据个数,只要有效数据量不超过31,就说明缓冲区不会溢出。
将两个UART无线模块连接至计算机,在程序代码中插入测试代码,将数据包中有效数据量返回,使用串口调试软件进行数据通信测试。其中一个无线模块用于接收数据,如图4(a)所示,串口号为COM8,另一个无线模块用于发送数据,如图4(b)所示,串口号是COM9,串口速率都设置为128 000 b/s,连续发送1 000个字符数据用于测试。测试结果表明,无线数据发送时封装为70个数据包,其中数据包最大有效数据长度为15,小于31个,从COM8接收到的数据也是1 000个字符,说明无线模块在该速率下传输是准确、可靠的。
根据这个方法对不同速率情况下,数据传输和打包情况测试结果如表1所示。
该结果说明当速率设置为4 800 b/s及以下时,可以实现串口数据实时打包传输,即每接收一个串口数据就立刻打包从无线端口送出,不需要设置缓冲区。当速率设置为9 600 b/s及以上时,会出现几个数据封装为一个无线数据包的情况,这种情况就必须要设置UART接收和发送缓冲区,才能实现可靠传输。
5 结语
本无线模块经过多次测试检验是非常可靠的。考虑到无线模块不同的使用用户,作者为无线模块编写了配置程序,配置信息保存在E2PROM。配置内容包括波特率、无线频道、发送和接收通道地址、接收运行和自动应答等,用户在使用时只需配置一次即可。作者设计时采用了STC新款宽电压1T单片机STC15W204S,工作可靠,速度快,价格便宜。由于无线模块采用UART接口后,用户只需要安装UART接口编程即可,不用考虑无线数据收发问题,使用非常方便。
摘要:在无线通信环境下,基于UART接口的无线模块可以释放CPU软硬件资源、使用方便、用途广泛。通过介绍一种廉价的无线模块设计方案,根据n RF24L01封装无线数据包和UART接口速度慢的特点,设计了对UART数据的发送和接收双缓冲器,开发软硬件,实现了可靠的无线数据通信。实验表明无线模块UART接口的可靠通信速率可以达到128 000 b/s,达到预期效果,满足大部分网络化条件下无线通信功能要求。
关键词:UART,NRF24L01,缓冲器,无线模块
参考文献
[1]李辉,宋诗,周建江.基于ARM和nRF24L01的无线数据传输系统[J].国外电子元器件,2008(12):44-46.
[2]曾勇,杨涛,冯月晖.基于nRF24L01的超低功耗无线传感器网络节点设计[J].电子技术应用,2008(7):45-48.
[3]刘志平,赵国良.基于nRF24L01的近距离无线数据传输[J].应用科技,2008(3):55-58.
[4]刘超伟,赵俊淋,易卫东.基于nRF24L01的无线图像传感器节点设计实现[J].电子测量技术,2008(6):136-139.
[5]黄秀节,颜可煌,赵伟.基于nRF24L01的无线USB控制系统[J].国外电子测量技术,2009(12):43-46.
[6]韦积慧.基于nRF24L01的无线网络设计与实现[D].长春:吉林大学,2012.
[7]郝文延,焦明华.基于DSP和nRF24L01的无线环境监测系统设计[J].单片机与嵌入式系统应用,2011(3):51-54.
[8]杨旭,李德敏,张谦益.基于nRF24L01的一种无线通信协议设计[J].通信技术,2011(7):57-59.
UART 篇6
1 FPGA与电子设计
用FPGA进行计算机I/O通信设备的开发设计,实现了功能类似Intel 8250及8251,美国半导体公司的16550串行通信接口的功能,同时实现了带有简单类汇编指令的微控制单元来控制与外围设备的通信。整个设计采用VHDL在Altera的QuartusⅡV6.0进行设计实现,并进行仿真验证。
1.1 FPGA的原理及其开发平台
通常的FPGA由布线资源分隔的可编程逻辑单元构成阵列,又由可编程I/O单元围绕阵列构成整个芯片,排成这列的逻辑单元由布线通道中可编程内连线连接来实现一定的逻辑功能,也就是说分段的互连线可以通过可编程开关以任意方式连接起来形成逻辑单元的信号线。一个FPGA主要由逻辑阵列块(LAB)、I/O块、RAM块和可编程的行/列线等组成[1]。
1.2 FPGA的开发软件及设计流程
FPGA的开发软件一般由生产FPGA的厂商根据自己的产品特性提供专门的开发工具,目前主要流行的是Xilinx的ISE平台和Altera的Quartus平台。本文使用的是后者。使用该设计开发软件能够完成FPGA系统设计的流程基本包括了设计输入(原理图输入或HDL语言描述输入)、综合、布线、下载等工作。本文所设计的电子系统设计输入采用VHDL语言。
选定了设计平台后,只要考虑所要设计系统的功能,借助集成开发环境即可完成想要的设计。一般来说利用进行电子设计的完整的设计流程分为电路的设计与输入、功能仿真、综合、综合后仿真、实现、布局布线后仿真、配置下载与调试等步骤。由于FPGA的灵活性和设计的可重复性,可以保证在任何仿真或者验证步骤出现问题时都能根据错误定位返回相应的步骤,以进行更改或者重新设计。这是传统电子设计方法无法比拟的。
2 系统设计与实现
本文所设计的系统实现了一个可简易汇编指令的微控制器MCU和一个计算机组成中的外围串行通信I/O设备。通过实现的一部分I/O输入/输出指令和条件跳转指令可实现与外设的通信控制。系统功能模块划分如图1所示。
2.1 串行通信外设的设计与实现
在计算机系统组成中,串行通信占据重要地位,它的使用范围包括计算机与外部设备之间,计算机与计算机之间、甚至在进行前期CPU设计时都会用到。传统的设计方法是应用Intel公司的8250/8251或者美国半导体的16550等芯片,但因设计复杂,占用电路体积大,而且出现问题不容易跟踪定位,所以本文采用FPGA实现。将串行通信的关键器件UART集成到FPGA内部,增加系统的可靠性,缩小PCB板体积,使得系统更加紧致,且能根据需要进行适当的设计、扩充和裁剪。实现的该I/O设备功能划分如图2所示。
2.1.1 UART模块的设计与实现
UART串行数据格式如图3所示,串行数据包括5~8位数据(可更改设置)、1位起始位、1~2位停止位、1位校验位。该模块主要由发送模块和接收模块两部分构成。在各自模块中分别由接收缓冲器、接收控制电路、发送缓冲区、发送控制电路、数据总线缓冲器、读写控制电路组成[2],逻辑框图如图4所示。
UART模块的发送模块和接收模块公用复位信号、时钟信号和并行数据线,并且有各自的输入/输出模块和控制电路单元。
(1)发送模块的设计。发送模块将从微控制器
(2)接收模块的设计。接收模块接收串行输入的数据(见图3),然后将其转换为并行数据送给微控制器MCU。与发送模块相同,也分为3种工作模式:空闲模式、检测起始位模式、移位输入模式。首先接收模块在接收时钟的控制下,不断地在RX端口检测输入数据的起始位,当检测到起始位后,接收模块由空闲模式转变为移位输入模式。此时通过RX端口进来的串行数据可能存在着些许抖动,因此需要添加消抖电路进行处理。消抖处理一般有两种办法[4],一种是在前端添加非门的RS触发器来完成,一种是类似软件的方式控制采集输入端的数据,并将前后采集的数据值进行比较,相同则保持,否则继续采集比较,这里采用的是后者。当接收完数据,更新接收缓冲区状态,以提供微控制器MCU查询,方便读取数据。接收模块的状态机FSM[3]如图6所示。
2.1.2 输入/输出缓冲区(FIFO)的设计与实现
FIFO(First In First Out)是一种先进先出的缓冲区结构。主要在通信过程中解决通信两端速度不匹配的问题。访问FIFO仅需要读/写控制线,不需要地址线,因此采用FIFO实现的缓冲区接口简单,读写方便。由于文中的微控制器MCU和I/O设备均在FPGA内部实现,因此采用同步FIFO实现,即写端口和读端口采用同一个时钟进行控制操作。该系统分别实现了位宽为8位,深度为256 b的缓冲区来对MCU发送给外设的数据和从外设接收的数据进行缓冲处理。实现方法可以采用Altera公司FPGA内部的资源实现。对FIFO的读/写控制可根据缓冲区的使用状态和MCU发送来的命令来实现。FIFO模块的结构图如图7所示。
读信号和写信号由微控制器MCU通过向I/O设备进行数据输入和输出操作产生。空标志和满标志用于MCU探测缓冲区状态,应用查询方式对外设进行读写数据操作。对于发送缓冲区,当缓冲区处于满状态时表明已经没有可用的存储空间缓冲数据,此时不允许进行写操作;对于接收缓冲区,当缓冲区处于空状态时,表明没有从设备收到任何的时间,此时不允许微控制器MCU从外设接收缓冲区读取数据。
通过QuartusⅡ产生的FIFO如图8所示。
图8中,aclr是异步复位信号;clock是时钟输入;rdreq和wrreq分别是读和写信号线;data[7...0]是FIFO的并行数据输入端;q[7...0]是FIFO的并行数据输出端;empty和full分别为FIFO空满标志的状态线;usedw[7...0]为当前状态下FIFO已经使用的存储量,即FIFO中已经写入并保存的数据量[10]。
2.2 微控制器MCU的设计与实现
在一个计算机系统中,中央处理器处于核心控制地位,它不仅是参与运算的核心器件,而且是控制外设的中枢。一般情况下,它实现了一定的功能指令集,用来由用户自己编程控制外部设备动作或者进行一些算术逻辑运算。本文中所实现的微控制器MCU主要以实现对外设的控制,实现了对外设端口的读写控制以及一些必要的程序控制指令。在一个微控制器的设计中,指令系统的设计尤其重要,它不仅关系到控制器的设计,也关系到软件程序的设计方法。指令系统的设计分为指令集设计和指令动作设计两部分,前者侧重于控制器的总体功能;后者侧重于指令的具体实现。进行指令设计时首先要进行指令分析,根据系统所要完成的功能,完成所需指令的功能设想,这是指令设计的基础;然后分析指令该放在什么地方,微控制器如何取指令和对指令进行识别等操作;最后确定指令格式以及每个指令完成指定功能所需要的一系列基本动作过程。可以使用ALtera公司FPGA内部的ROM作为程序存储器,详细的实现过程参看参考文献[3]。通过此系统进行分析,设计实现如表1所示指令。每条指令功能的完成具有取指令、指令译码、执行指令阶段。指令的分析译码执行由状态机逻辑控制具体实现。
3 系统仿真验证
用硬件描述语言VHDL所实现的设计输入,需要经过完整的编译过程才可以进行仿真验证,甚至下载配置。整个编译过程包括4个阶段:分析/综合(Analysis&Synthesis)、适配(Filter)、装配(Assembler)、时序分析(Timing Analyzer)[5]。
分析/综合阶段使用QuartusⅡ中Integrated综合用VHDL实现的输入文件,生成后续过程使用的EDI-Fice网表文件(.edf)。适配阶段使用由上一阶段建立的网表数据库,将工程的逻辑和时序要求与器件的可用资源相匹配,这个过程会将每个逻辑功能分配给最佳的逻辑单元位置,并选定相应的互联路径和引脚分配,为以后的布线和时序分析做准备。装配阶段根据上一阶段的资源匹配生成可供下载配置的功能文件。时序分析是对所有的逻辑进行分析,根据适配阶段的资源匹配情况进行时序分析,验证最佳情况(最快速率等级的最小延时)下的时序。在Quartus中可以通过选择Start Complication来运行所有的编译器模块,也可以通过选择Start单独运行各个模块,还可以通过选择Complier Tool(Tools菜单),在Complier Tool窗口运行该模块,以启动编辑器模块。在Complier Tool窗口中,可以打开该模块的设置文件或报告文件,或打开其他相关的窗口。
完成上述编译阶段以后,就要编程实现数据的发送和接收工作。在本例中,为了方便测试,在外设内部通过将发送线直接连接至接收线进行内部环路的自检测试,外设缓冲区状态采用轮询方式工作[6]。测试程序编写如下:
上述简单程序段所对应的微控制器机器码加载在程序储存器中,如图9所示。
建立仿真输入文件,设置时钟信号和发送总线数据即可。首先对串行通信设备进行仿真测试,测试输入如图10所示。串行通信设备的仿真结果如图11所示。
从仿真结果可以看出,串行通信设备已达到预定的功能要求。
加入微控制器作用后使用图所对应的类汇编程序进行测试。在此例程中,只简单发送了一个8位数据来说明问题,如图12所示。
系统仿真结果如图13所示。
可以看出程序的执行结果如预想一样,最终在数据总线上显示的是接收到并从接收缓冲区读出的数据。说明加入MCU和FIFO缓冲区后系统环路测试功能正常,已达到设计要求。
4结语
在当今电子设计领域,尤其是电子核心器件和设计软件落后的情况下,应用传统的电子设计方法既浪费时间,且成本可能太高,甚至有时候性能也不能满足要求,通过FPGA技术进行设计可以使性能得到大大改观。本文就是利用FPGA技术实现的一个计算机外围I/O设备和一个简单的微控制器。随着FPGA技术的进一步成熟和发展,它的性能和灵活性会更加出色,将来完全有可能将一台计算机系统在其内部,并搭配外围接口电路,而且性能会更加突出。随着计算机技术应用的扩大,尤其是嵌入式计算机的广泛使用,应用FPGA技术进行现代数字系统的设计,会使系统更加紧致,功能更加完善,功耗更加降低,性能更加稳定。因此,应用FP-GA进行电子设计势在必行。
摘要:现代数字电子系统设计正在朝着新的方向发展,即利用FPGA技术进行系统设计。介绍了一种利用FPGA来实现通用串行异步收发器(UART)和控制通信的MCU的数字系统,底层设计模块采用VHDL硬件描述语言实现,并进行了仿真验证。该设计方法和理念为以后的计算机系统以及其他的数字电子系统提供了一个新的思路,应用此技术可以使系统设计更加紧凑、可靠。
关键词:计算机系统,FPGA,VHDL,UART,MCU,有限状态机
参考文献
[1]杨晓慧,杨旭.FPGA系统设计与实例[M].北京:人民邮电出版社,2010.
[2]戴梅萼,史嘉权.微型计算机技术及应用[M].3版.北京:清华大学出版社,2006.
[3]韩明.基于FPGA的通用异步收发器的设计[D].大连:大连海事大学,2009.
[4]姜咏江.计算机原理综合课程设计[M].北京:清华大学出版社,2009.
[5]潘松,黄继业.EDA技术使用教程[M].北京:科学出版社,2002.
[6]唐硕飞.计算机组成原理[M].北京:高等教育出版社,2008.
[7]杨宗国,李艳萍.基于FPGA的UART模块的设计[J].现代电子技术,2009,32(2):19-21.
[8]刘韬,楼兴华.FPGA数字电子系统设计与开发实例导航[M].北京:人民邮电出版社,2005.
UART 篇7
FPGA(Field Programmable Gate Array,现场可编程门阵列)以设计灵活及速度快的特点,在数字专用集成电路的设计中得到了广泛应用[1]。利用FPGA可以设计出高效的IP核,拥有操作灵活可移植复用性强等优点。
Pico Blaze是一款典型的8位微控制器软核,主要针对Spartan-3系列器件的应用,同时它也可应用于Virtex-II,Virtex-II Pro和Cool Runner-II等其它可编程逻辑器件系列[2]。本文从Pico Blaze的体系结构出,并通过一些常用功能设备的应用,详细介绍Pico Blaze的开发过程。
2 Pico Blaze处理器的结构及特点
根据图1,Pico Blaze具有如下特点:
a.16个8位数据宽度的通用寄存器,s1~s F,没有特殊预留寄存器,操作方法简单,具有同样的优先级;b.1K的片上可编程存储区,在FPGA配置过程中可以自动加载;c.8位算术逻辑单元用于记录进位及零标志;d.64字节的内部缓存器;e.256个输入端口和;256个输出端口,用于外部输入输出操作;f.31个调用堆栈;g.保守地说,每条指令执行的时间为两个时钟周期在Virtex-II Pro FPGA上可以达到最高200MHZ的速度;h.快速中断响应,最差5个时钟周期;i.在Xilinx Spartan-3,Virtex-II,and Virtex-II Pro FPGA的基础上进行了优化,仅占用96个片(Slice)及0.5~1的BRAM;j.支持汇编语言及仿真[3]。
由图2可知,Pico Blaze微处理器事实上包括两个子功能模块。存储器块将程序数据送入Pico Blaze模块,KCPSM3模块提供了1024个地址,且操作32个寄存器。若用户的程序超过了256条指令,则可以考虑将设计分解为几个过程,每一个过程由一个单独的Pico Blaze模块(每个拥有自己的RAM)完成。在一些设计中,以一个Pico Blaze为主(Master),其它一个或多个Pico Blaze为辅(Slave)。双端口分布式存储器是在处理器间交换数据的一个很好的选择。可选择将超过256个指令的程序分解到两个或多个块状RAM中,用一个选择开关来选择存储了要执行的指令的RAM。最简单的是使用一个被一触发器输出控制的二选一选择器来选择RAM。
3 基于Pico Blaze的UART操作
串口操作是嵌入式领域中的一个重要的组成部分,大部分的数据都是通过串口将数据送出的。在定义成串口的引脚另一端连上MAX322、MAX485或CP2102等芯片即可实现针对PC的串口、远程数据485通信及USB通信的功能。
KCPSM提供了一个Uart_rs及Uart_tx的核,可以通过连接轻松地进行串口通信。
图3为UART IP核,其中,data_in及data_out分别是串口输入输出的数据端口,用于传输8位数据。write_buffer用于输出数据时指定发送数据。read_buffer用于在接收数据后通知uart_rs接收数据。
en_16_x_baud输入指定波特率的时钟,输入的时钟要于当前FPGA的时钟相匹配。因此我需要一个时钟控制的进程。
应用一个常数作为时钟的一个除数,指定en_16_x_baud响应,其计算方法为:XX=FPGA时钟÷(波特率×16)
serial_out及serial_in直接连到FGPA输入输出引脚,通过不同的芯片输出可以变成232、485或USB信号。
buffer_data_present,buffer_full,uffer_half_full用于指示当前接收或发送缓冲区状态,通常当uart_rs的buffer_data_present为“1”时,说明串口有数据进入,就可以从data_in口接收数据了。
4 应用开发方法
Pico Blaze支持汇编语言开发,指令简单,仅有49个操作指令。可以使用两种开发环境进行编译,生成VHDL文件。分别是KCPSM3及Mediatronix公司开发的p Blaze IDE。
用汇编语言编写的PSM文件通过这两种编译环境即可生成VHDL文件,再用ISE将Pico Blaze的核实例化后一起进行综合,就可以进行调试运行了。
在综合的主程序中,我们除了要实例化Pico Blaze核与p Blaze IDE生成的核之外还要将我们所用的用于输入输出控制其它核一起加入进来。例如uart的核心及uart相关的核,同时还要加入一些外部控制的进程,例如第3节提到的波特率时钟进程。
另外,其中必不可少的要加入两个分别控制汇编程序输入输出的进程。通常我在程序中会定义输入输出口,这样我们的调度程序才会直到作用。当程序开始运行时,Pico Blaze会按照程序访问端口的顺序依次给出端口信息,这个信息就是就是通过Pico Blaze核的Port_id表示的。
如图4所示,address表示程序运行的地址,程序在地址中访问的端口会依次通过port_id表示出来。这就需要一个进程在主程序中按着时钟不断扫描port_id的信息。
5 结论
Pico Blaze是一款非常适合百万门以下低成本FPGA的处理器软核,在进行工业控制及数据运算时以其速度快、资源占用小等特点而优于其它软核。
参考文献
[1]胡爱华,杨郁池,刘院英,王玉.液晶显示模块及其在智能仪表中的应用[J].计算机测量与控制,2007,(2).
[2]蔡超.8位嵌入式微控制器PicoBlaze的应用[J].福建电脑,2007,(12).
【UART】推荐阅读: