这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » Xilinx » 设计UART串行传输模块

共1条 1/1 1 跳转至

设计UART串行传输模块

菜鸟
2010-12-23 16:54:30     打赏
一、 实验原理: 1、 概述 UART的全称是通用异步收发器(Universal Asynchronous Receiver/Transmitter),是实现设备之间低速数据通信的标准协议。“异步”指不需要额外的时钟线进行数据的同步传输,是一种串行总线接口,只需占用两根线就可以完成数据的收发(一根接收数据,一根发送数据),常用的标准通信波特率有9600bps、115200bps等。 2、 通信协议与帧格式 UART一帧由起始位、数据位、校验位和停止位组成。数据逐位传输,示意图如图 1.1所示。 a) 起始位 UART空闲时(没有数据传输),总线为高电平(逻辑1),当需要数据传输时,首先发送一个“起始位”,起始位为一个低电平“逻辑0”。 为什么需要起始位? 因为UART没有控制线,要让接收方知道什么时候开始接收数据,需要一些手段,在UART,数据的传输只有一根线,所以在发送数据之前,先发一位逻辑“0”作为数据发送的起始标志,接收方在空闲时,当检测到有一个低电平,则开始接逐位接收数据。 b)数据位 如图 1.1的“2.”所示,紧挨着“起始位”的是数据位,它可以是5、6、7或8位,收/发双方在数据开始传输前,需要对双方数据位位数作一致的定义,否则会导致数据的传输错误;数据位的发送采用低位(LSB)先发送。 为什么数据位可变? 因为UART是一种低速总线,每多发一位都占用不少的时间(由传输波特波决定),所以可以传输数据的特点,采用不同位数据的波特率以节约时间。如在Modbus协议中,Modbus-ASCII是以ASCII码传输的,因为ASCII是不会大于0x7F,所以使用7位的数据位,而Modbus-RTU则采用8位的数据位。 c)校验位 UART的校验位紧挨着数据位,采用奇/偶位校验方式,可有可无,是为了为了验证数据传输的安全性而设置的,在收/发双方进行数据传输前要预设好是否需要校验位,如果需要则是奇校验还是偶校验。如图 1.1的“3.”所示。 为什么需要校验? UART长距离数据传输时,使用RS-232、RS-485传输,一般使用较长的导线连接收/发设备,其工作现场因存在不同程序的干扰,可能会导致数据的传输错误,加个校验位可作初步的校验,如果校验出错,说明数据是不可靠的,直接丢弃;如果校验通过,则数据有一定的可靠性,可进入下一级的校验,通常加入通信协议,如Modbus-RTU引入了CRC校验。 d)停止位 UART的帧以停止位作为停止标志,是在数据位(没有校验位)和校验位(有校验位)之后发送1~2位的逻辑“1”。停止为可以为1位、1.5位和2位。当发送完停止位之后,UART总线进入空闲。 e) 空闲 空闲指UART总线上没有数据进行传输,表现为发送方输出逻辑“1”,在空闲时,接收方时刻监视UART总线上电平变化,当发现起始化,则进入数据接收状态,直至接收完一帧数据,如果最后没有检测到停止位,则标志帧错误。 f)波特率(Baudrate) 由于UART没有同步时钟线,收/发双方如果需要进行正确的数据传输,则要在收/发双方定义一致的位时钟,位时钟可以理解为UART总线一个位所占用的时间,即“波特率”。在定义上,收/发双方的波特率可以是随意的,只需要保持一致,如双方都是1000bps,但是,这不能兼容现有常用的设备,兼容性差。所以在工程应用中,常用一些特定的波特率真,如4800bps、9600bps或115200bps等。 如果波特率是9600bps,则传输速度最大是多少? 波特率的单位是bps(位每秒),是指发送一位所占用的时间。如果UART定义8位数数位、无校验、1位停止位。则一帧数据的位数N如公式(3)所示: N = 1位起始位+8位数据位+0位校验位+1位停止位=10bits 公式(3) 所以最大数据传输率为:9600bps / N = 960BPS(字节每秒)。即当波特率为9600rps,UART帧格式为8位数据位、无校验、1位停止位时,最大的数据传输率为0.96KBPS。 g)常用帧格式 如图 1.3所示为8位数据位、无校验位、1位停止位的帧格式示意图,一帧共有10位。发送的数据为0xA5。 3、硬件接口 a)RS-232连接器 RS-232的连接器常用的是DB-9,其连接器示意图如图 1.6所示,为九针连接器。对于常用的简单应用,使用到的有三根线:RxD、TxD和GND。串口接口头分公母接头,下面所示为母的接头。 实物图如图 1.7所示。 B)电平转换电路(与计算机连接) 二、实验过程 有了上面的理论基础我们就可以开始设计一个UART的串行传输模块了。 1、系统框图的设计: 系统的传输取决于波特率的大小,所以要设计一个专门产生波特率计数,实质上是对系统时钟频率进行分频。由于是单线发送和接收,实现了全双工传输,实质上是相当于串行序列接收与发生,只不过这个序列是有一定的通信格式而已。下面是两个系统的框图设计: 图2.1接收模块系统框图 图2.2发送模块的系统框图 2、 波特率计数器设计: 我们以9600的波特率,50MHZ的时钟晶振举例说明:由上面的理论知识我们可以知道,9600bps,则表示传输一位的时间需要1/9600s。时钟晶振为50MHZ,则一个时钟脉冲周期为:1/50M s。则串行传输一位的时间长度需要50M/9600=5208个时钟脉冲周期,半周期为2604个时钟脉冲周期。这个波特率时钟脉冲就可以由系统时钟脉冲分频所得。 程序设计: --工程名:时钟分频器 --功能:实现对时钟脉冲的分频,产生9600波特率时钟脉冲 --时间:2010-12-10 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity speed_select is port(clk:in std_logic;--时钟信号 rst:in std_logic;--复位信号,低电平有效 bps_start:in std_logic;--信号开始传输信号 clk_bps:out std_logic);--波特率信号 end entity; architecture behav of speed_select is constant bps_para: integer :=5207; constant bps_para_2: integer :=2603; signal cnt:integer range 0 to bps_para:=0; begin process(clk) --计数进程 begin if(rst='0') then cnt --判定有没有并行数据输入 if(rx_int='1') then shifter --状态1,低电平起始位输出 tx --状态2,8位数据移位输出 if(cnt --状态3,高电平停止位输出 tx



关键词: 设计     串行     传输     模块     时钟     数据     发送     波特率         

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]