FPGA小白学习之路(6)串口波特率问题的处理

串口波特率问题的处理

此博文一共包含三个方面的内容:(1)异步串口通信的数据格式;(2)为何串口通信中接收端采样时钟频率是传输的波特率的16倍;(3)串口波特率等概念。

1、异步串口通信的数据格式

  串口的通信可以通过链接了解:https://wenku.baidu.com/view/7b459e47453610661ed9f4d4.html###

  异步串口通信的数据格式如图1所示:

图1 异步串口通信的数据格式

  由于在空闲状态时,传送线为逻辑“1”状态,而数据的传送总是以一个起始位“0”开始,所以当接收器检测到一个从“1”向“0”的跳变时,便视为可能的起始位(要排除干扰引起的跳变);起始位被确认后,就知道发送器已开始发送,接收器就可以按这个数据通信格式接收后续的数据了;当检测到停止位“1”后就表明一帧字符数据已发送完毕。

  关于接收器的设计最主要的一点是如何提高采样的准确率,最好是保证采样点处于被采样数据的时间中间点。所以,在接收采样时要用比数据波特率高n倍(n≥1)速率的时钟对数据进行采样。在本程序中用16倍波特率时钟进行采样。结合图2所示,我们讲解一下如何让采样时刻处于被采样数据的时间中间点:

图2 串口数据采样

  1. 在t1时刻若检测到低电平,就开始对这个低电平进行连续的检测;
  2. 当检测了8个时钟周期后,到达t2,此刻,若前面的8个周期都是低电平,则认为检测到了起始脉冲。否则就认为是干扰,重新检测。
  3. 在检测到起始位后,再计数16个采样时钟周期就到达了第一个数据位的时间中间点t3,在此刻采样数据并进行保存。
  4. 然后再经过16个周期,就是第二个数据位的时间中间点,在此时刻进行采样;然后,再经过16个周期,就是第三个数据位的时间中间点, 在此时刻进行采样…..一直这样采样,直到把所有的数据位采样完毕。

2、为何串口通信中接收端采样时钟频率是传输的波特率的16倍

  增强抗干扰是原因之一
  标准UART可以选16倍采样,也可以选64倍采样,个人觉得应该是方便分频设计.

  标准UART的RXD前端有一个"1到0跳变检测器",当其连续接受到8个RXD上的低电平时,该检测器就认为RXD线出现了起始位,进入接受数据状态。在接收状态,接收控制器对数据位7,8,9三个脉冲采样,并遵从三中取二的原则确定最终值。采用这一方法的根本目的还是为了增强抗干扰,提高数据传送的可靠性,采样信号总是在每个接受位的中间位置,可以避开数据位两端的边沿失真,也可以防止接受时钟频率和发送时钟频率不完全同步引起的误差。

3、串口波特率等概念

1:比特率:9600bps

  就是每秒中传输9600bit,也就是相当于每一秒中划分成了9600等份。

  如此,那么每1bit的时间就是1/9600秒=104.16666666666666666666666666667us。约0.1ms。既然是9600等份,即每1bit紧接着下一个比特,不存在额外的间隔。也不管是啥起始bit,数据bit,奇偶bit,停止bit。

2:帧格式,帧间隔。

  在电脑里,也就是超级终端等的端口设置。电脑的默认端口设置,也就是默认帧格式是:8个数据bit,1个停止bit,(起始1bit 是必须的)默认无奇偶,无流控。

  则实际就是10bit为1帧。一秒中可以发送9600/10=960个帧,也就是960字符,因为一帧里只有1个字符,1字符就是帧里面的8个数据bit

3:串口通讯

  串口当然可以连续,没有时间间隔地发送帧,默认情形下电脑在9600bps下可以发送960帧。

  但在实际工作中,在异步通讯下,一般需要一个交互过程,所以,电脑发送一个帧,或者若干帧,还需要等待从设备的应答,并不是一直发送的。有问有答地实现编程者的目标。

4:波特率时钟

  实际上是比特率时钟,每1bit所要花费的时间周期。而波特率(实际是比特率)发生器生成的分频时钟实际是对每1bit进行采样的时钟,它是波特率时钟的16倍。

  波特率发生器实质是设计一个分频器,用于产生和RS 232通信同步的时钟。在系统中用一个计数器来完成这个功能,分频系数N决定了波特率的数值。该计数器一般工作在一个频率较高的系统时钟下,当计数到 N/2时将输出置为高电平,再计数到N/2的数值后将输出置为低电平,如此反复即可得到占空比50%的波特率时钟,具体的波特率依赖于所使用的系统时钟频率和N的大小。如系统时钟频率是40 MHz,要求波特率是9 600bps,则16倍波特率时钟的周期约等于260个系统时钟周期,则计数器取260/2=130时,当计数溢出时输出电平取反就可以得到16倍约定波特率的时钟。

  也可以这么理解:40mhz晶振,最小计数脉冲是25ns, 16倍波特率的频率就是16*9600,其时钟周期就是1/(16*9600)=6.5us  也就是以40mhz晶振作为输入的话,计数器需要计数=6500/25=260 个计数。

  9600波特率也可理解为一种波特时钟频率,即1秒钟计数9600个,如果是16倍波特率时钟,即直接相乘就可以了。就是1秒计数9600*16=153600 。

  1/(9600*16) 除以(1/40000000)也就是以时钟周期除了最小时钟周期得到的就是计数的个数。简化而言就是 40000000/(9600*16)=260,也就是频率直接相除就得到要分频计数器计数的个数。

  串口通信必须要设定波特率,本设计采用的波特率为9 600 bit/s。产生波特率的时钟频率是越高越好,这样才可产生较高且精确的波特率。设计选用50M主频率要产生9600bit/s波特率,每传送一位数据需要5208.33个时钟周期。取一个最接近的数是5208,则波特率为9600.61,其误差约为0.006%,误码率很低可以确保通信正常。

5:分频系数

  计数器很容易实现分频。可用lpm-counter实现。

  比如分频系数是2,那么,直接用q0作为输出即可。如果分频系数是4,那么q0,q1作为有效比特。

  总而言之,要n整数分频,即计数n后清零重计数。至于50%占空比则另外考虑。奇数分频似不易实现50%占空比。

原文地址:https://www.cnblogs.com/kybyano/p/8290106.html

时间: 2024-08-30 09:38:27

FPGA小白学习之路(6)串口波特率问题的处理的相关文章

FPGA小白学习之路(2)erro:buffers of the same direction cannot be placed in series

锁相环PLL默认输入前端有个IBUFG单元,在输出端有个BUFG单元,而两个BUFG(IBUFG)不能相连,所以会报这样的错: ERROR:NgdBuild:770 - IBUFG 'u_pll0/clkin1_buf' and BUFG 'BUFG_inst' on net    'clkin_w' are lined up in series. Buffers of the same direction cannot be    placed in series. ERROR:NgdBuil

(转)FPGA小白学习之路(5)clk为什么要用posedge,而不用negedge

clk为什么要用posedge,而不用negedge 转自:http://www.cnblogs.com/dangxia/archive/2012/03/07/2383744.html Verilog中典型的counter逻辑是这样的: 1 always@(posedge clk or negedge reset) begin 2 3 if(reset == 1'b0) 4 5 reg_inst1 <= 8'd0; 6 7 else if(clk == 1'b1) 8 9 reg_inst1 <

FPGA小白学习之路(1) System Verilog的概念以及与verilog的对比

转自CSDN:http://blog.csdn.net/gtatcs/article/details/8970489 SystemVerilog语言简介 SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE1364-2001 Verilog硬件描述语言(HDL),并对其进行了扩展,包括扩充了C语言数据类型.结构.压缩和非压缩数组. 接口.断言等等,这些都使得SystemVerilog在一个更高的抽象层次上提高了设计建模的能力.SystemVerilog由Acceller

(转)FPGA小白学习之路(4)PLL中的locked信号解析

ALTPLL中的areset,locked的使用 转自:http://www.360doc.com/content/13/0509/20/9072830_284220258.shtml 今天对PLL中areset和locked详细查了下资料,发现网上这方面的资料很少,所以自己认真读了下Documentation---ug_altpll.pdf,现在我将我学到的内容总结如下: areset简而言之就是高电平有效,对pll进行复位. 下面我们主要来认识一下locked信号: Locked这个输出到底

(转)USB小白学习之路(8)FX2LP cy7c68013——Slave FIFO 与FPGA通信

此博客转自CSDN:http://blog.csdn.net/xx116213/article/details/50535682 1 USB 概述 USB名称解释 USB是通用串行总线(Universal Serial Bus)的缩写.能过在计算机运行过程中随意地接入,并且立刻就能投入工作,那么这样的特性叫做即插即用PnP(Plug and Play).由于USB是主从模式的结构,设备与设备之间.主机与主机之间不能互连.为了解决这个问题,出现了USB OTG(On the go),它的做法:同一

USB小白学习之路(9) CY7C68013A Slave FIFO模式下与FPGA通信

CY7C68013A Slave FIFO模式下与FPGA通信 CY7C68013A的时钟是由FPGA提供的24MHz,RESET引脚也是由FPGA控制. 1.开始时没有给FPGA烧录程序,将CY7C68013A接到PC上,安装驱动后,是检测不到device的,经查找,原因有两个: ①没有时钟,这种情况下需要先让FPGA跑起来,为CY7C68013A提供时钟 ②复位引脚没有控制,因为CY7C68013A的复位时低有效,如果FPGA的引脚不控制,就会使得此引脚电平不固定,CY7C68013A处于复

USB小白学习之路(7) FPGA Communication with PC by CY7C68013,TD_init()解析

void TD_Init(void) { CPUCS = ((CPUCS & ~bmCLKSPD) | bmCLKSPD1);          //设置CPU时钟频率为48M,寄存器CPUCS的位如下所示.此语句就是将CPUCS的b4,b3位设为10, //同时不改变其他bit. 图1 寄存器CPUCS的描述 //USBCS = Ox80; //set high speed mode 添加此语句时工程编译不通过 IFCONFIG = 0XCB; //选择内部时钟频率为48M,FIFO/GPIF

小白学习之路,基础四(函数的进阶)

一,内置函数 前面已经认识了函数,对函数都有所了解了,其实呢,在Python中提供了很多内置的函数方便给我们调用.下面会给大家提到一些常用的常用内置函数的用法,当然还有一些其他没讲到的,你也可以看参考文档,深入学习一波.咳咳咳,不多说了,直接进入装逼的代码环节. 更多的内置函数详情请参考http://www.runoob.com/python3/python3-built-in-functions.html 1 abs(-3) #取绝对值 2 all([1,2,5,0]) #当全部为真或者全部不

(转)USB小白学习之路(12) Cy7c68013固件之Slave FIFO

Cy7c68013固件之Slave FIFO 转自:http://blog.csdn.net/zengshaoqing/article/details/53053539 选择SlaveFIFO传输方式 SlaveFIFO传输示意如图1: 图1 Slave FIFO传输示意图 在Slave FIFO方式下,FX2LP内嵌的8051固件的功能只是配置Slave FIFO 相关的寄存器以及控制FX2LP何时工作在Slave FIFO模式下.一旦8051固件将相关的寄存器配置完毕,且使自身工作在Slav