精华内容
下载资源
问答
  • 51单片机——串行通信

    千次阅读 2021-08-28 23:03:37
    本文首先介绍了并行通信和串行通信的概念,然后对串行通信进行详细的介绍。然后介绍了51单片机的串行通信口的结构与原理,最后介绍了串行通信的四种方式,并介绍了如何计算波特率。

    目录

    1 概述

    1.1 并行通信和串行通信

    1.2 串行通信的两种方式

    1.2.1 异步通信

    1.2.2 同步通信

    1.3 串行通信的数据传送方向

    2 串行通信口的结构与原理

    2.1 串行通信口的结构

    2.2 串行通信口的工作原理

    2.2.1 接收数据过程

     2.2.2 发送数据过程

    3 串行通信口的控制寄存器

    3.1 串行控制寄存器(SCON)

    3.2 电源控制寄存器(PCON)

    4 四种工作方式与波特率的设置

    4.1 方式0

    4.1.1 方式0-发送数据

    4.1.2 方式0-接收数据

    4.2 方式1

    4.2.1 方式1-发送数据

    4.2.2 方式1-接收数据

    4.3 方式2

    4.3.1 方式2-发送数据

    4.3.2 方式2-接收数据

    4.4 方式3

    4.5 波特率的设置

    4.5.1 方式0的波特率

    4.5.2 方式2的波特率

    4.5.3 方式1和方式3的波特率


    1 概述

            通信的概念比较广泛,在单片机技术中,单片机与单片机单片机与其他设备之间的数据传输称为通信。

    1.1 并行通信和串行通信

            根据数据传输方式的不同,可将通信分并行通信串行通信两种。同时传输多位数据的方式称为并行通信。同时传输一位数据的方式称为串行通信

            如图1(a)所示,在并行通信方式下,单片机中的8位数据10011101通过8条数据线同时送到外部设备中。并行通信的特点是数据传输速度快,但由于需要的传输线多,故成本高,只适合近距离的数据通信。逐位传输数据的方式称为串行通信。

            如图1(b)所示,在串行通信方式下,单片机中的8位数据10011101通过一条数据线逐位传送到外部设备中。串行通信的特点是数据传输速度慢,但由于只需要一条传输线,故成本低,适合远距离的数据通信。

    图1 通信方式 

    1.2 串行通信的两种方式

            串行通信又可分为异步通信同步通信两种。51系列单片机采用异步通信方式。

    1.2.1 异步通信

            在异步通信中,数据是一帧一帧传送的。异步通信如图2 所示,这种通信是以帧为单位进行数据传输,一帧数据传送完成后,可以接着传送下一帧数据,也可以等待,等待期间为空闲位(高电平)。

    图2 异步通信

            (1)帧数据格式

            在串行异步通信时,数据是以帧为单位传送的。异步通信的帧数据格式如图3所示。从图中可以看出,一帧数据由起始位、数据位、奇偶校验位和停止位组成。 

     图3 异步通信的帧数据格式

            ① 起始位。

            表示一帧数据的开始,起始位一定为低电平。当单片机要发送数据时,先送一个低电平(起始位)到外部设备,外部设备接收到起始信号后,马上开始接收数据。

            ② 数据位。

            它是要传送的数据,紧跟在起始位后面。数据位的数据可以是5~8位,传送数据时是从低位到高位逐位进行的。

            ③ 奇偶校验位。

            该位用于检验传送的数据有无错误。奇偶校验是检查数据传送过程中是否发生错误的一种校验方式,分为奇校验和偶校验。奇校验是指数据位和校验位中“1”的总个数为奇数,偶校验是指数据位和校验位中“1”的总个数为偶数。以奇校验为例,若单片机传送的数据位中有偶数个“1”,为保证数据和校验位中“1”的总个数为奇数,奇偶校验位应为“1”,如果在传送过程中数据位中有数据产生错误,其中一个“1”变为“0”,那么传送到外部设备的数据位和校验位中“1”的总个数为偶数,外部设备就知道传送过来的数据发生错误,会要求重新传送数据。数据传送采用奇校验或偶校验均可,但要求发送端和接收端的校验方式一致。在帧数据中,奇偶校验位也可以不用。

            ④ 停止位。

            它表示一帧数据的结束停止位可以是1位、1.5位或2位,但一定为高电平。一帧数据传送结束后,可以接着传送第二帧数据,也可以等待,等待期间数据线为高电平(空闲位)。如果要传送下一帧,只要让数据线由高电平变为低电平(下一帧起始位开始),接收器就开始接收下一帧数据。

            (2)51系列单片机的几种帧数据方式

            51 系列单片机在串行通信时,根据设置的不同,其传送的帧数据有以下四种方式:

            ① 方式0。

            称为同步移位寄存器输入/输出方式,它是单片机通信中较特殊的一种方式,通常用于并行I/O接口的扩展,这种方式中的一帧数据只有8位(无起始位、停止位)。

            ② 方式1。

            在这种方式中,一帧数据中有1位起始位、8位数据位和1位停止位,共10位

            ③ 方式2。

            在这种方式中,一帧数据中有1位起始位、8位数据位、1位可编程位和1位停止位,共11位。

            ④ 方式3。

            这种方式与方式2相同,一帧数据中有1位起始位、8位数据位、1位可编程位和1位停止位它与方式2的区别仅在于波特率(数据传送速率)设置不同

    1.2.2 同步通信

            在异步通信中,每一帧数据发送前要用起始位,结束时要用停止位,这样会占用一定的时间,导致数据传输速度较慢。为了提高数据传输速度,在计算机与一些高速设备进行数据通信时,常采用同步通信。同步通信的帧数据格式如图4所示。

     图4 同步通信的帧数据格式

            从图中可以看出,同步通信的数据后面取消了停止位,前面的起始位用同步信号代替,在同步信号后面可以跟很多数据,所以同步通信传输速度快。但由于在通信时要求发送端和接收端严格保持同步,这需要用复杂的电路来保证,所以单片机很少采用这种通信方式。

    1.3 串行通信的数据传送方向

            串行通信根据数据的传送方向可分为三种方式:单工方式半双工方式全双工方式。这三种传送方式如图5所示。

    图5 数据传送方式 

            ① 单工方式。在这种方式下,数据只能向一个方向传送。单工方式如图5(a)所示,数据只能由发送端传输给接收端。

            ② 半双工方式。在这种方式下,数据可以双向传送,但同一时间内,只能向一个方向传送,只有一个方向的数据传送完成后,才能往另一个方向传送数据。半双工方式如图5(b)所示,通信的双方都有发送器和接收器,一方发送时,另一方接收,由于只有一条数据线,所以双方不能在发送的同时进行接收。

            ③ 全双工方式。在这种方式下,数据可以双向传送,通信的双方都有发送器和接收器,由于有两条数据线,所以双方在发送数据的同时可以接收数据。全双工方式如图5(c)所示。

    2 串行通信口的结构与原理

            单片机通过串行通信口可以与其他设备进行数据通信,将数据传送给外部设备或接受外部设备传送来的数据,从而实现更强大的功能。

    2.1 串行通信口的结构

            51单片机的串行通信口的结构如图6所示。

     图6 串行通信口的结构

            与串行通信口有关的部件主要有:

            ① 两个数据缓冲器SBUF。

            SBUF是可以直接寻址的特殊功能寄存器(SFR),它包括发送SBUF和接收SBUF发送SBUF用来发送串行数据,接收SBUF用来接收数据,两者共用一个地址(99H)。在发送数据时,该地址指向发送SBUF;而在接收数据时,该地址指向接收SBUF。

            ② 输入移位寄存器。

            在接收控制器的控制下,将输入的数据逐位移入接收SBUF

            ③ 串行控制寄存器 SCON。

            SCON 的功能是控制串行通信口的工作方式,并反映串行通信口的工作状态

            ④ 定时器T1。

            T1用作波特率发生器,用来产生接收和发送数据所需的移位脉冲,移位脉冲的频率越高,接收和传送数据的速率越快

    2.2 串行通信口的工作原理

            串行通信口有接收数据和发送数据两个工作过程,下面以图6所示的串行通信口结构为例来说明这两个工作过程。

    2.2.1 接收数据过程

            在接收数据时,若RXD端(与P3.2引脚共用)接收到一帧数据的起始信号(低电平),SCON寄存器马上向接收控制器发出允许接收信号,接收控制器在定时器/计数器T1产生的移位脉冲信号控制下,控制输入移位寄存器,将 RXD 端输入的数据由低到高逐位移入输入移位寄存器中,数据全部移入输入移位寄存器后,移位寄存器再将全部数据送入接收 SBUF中,同时接收控制器通过或门向CPU发出中断请求,CPU马上响应中断,将接收SBUF中的数据全部取走,从而完成了一帧数据的接收。后面各帧的数据接收过程与上述相同。

     2.2.2 发送数据过程

            相对于接收过程来说,串行通信口发送数据的过程较简单。当CPU要发送数据时,只要将数据直接写入发送SBUF中,就启动了发送过程。在发送控制器的控制下,发送门打开,先发送一位起始信号(低电平),然后依次由低到高逐位发送数据,数据发送完毕,最后发送一位停止位(高电平),从而结束一帧数据的发送。一帧数据发送完成后,发送控制器通过或门向CPU发出中断请求,CPU响应中断,将下一帧数据送入SBUF,开始发送下一帧数据

    3 串行通信口的控制寄存器

            串行通信口的工作受串行控制寄存器SCON电源控制寄存器PCON的控制。

    3.1 串行控制寄存器(SCON)

            SCON 寄存器用来控制串行通信的工作方式及反映串行通信口的一些工作状态。SCON寄存器是一个8位寄存器,它的地址为98H,其中每位都可以位寻址。SCON寄存器各位的名称和地址如下。

            ① SM0、SM1位:串行通信口工作方式设置位

            通过设置这两位的值,可以让串行通信口工作在四种不同的方式,具体见表1,这几种工作方式在后面将会详细介绍。

    表1 串行通信口工作方式设置位及其功能

            ② SM2位:用来设置主-从式多机通信

            当一个单片机(主机)要与其他几个单片机(从机)通信时,就要对这些位进行设置。当SM2=1时,允许多机通信;当SM2=0时,不允许多机通信。

            ③ REN位:允许/禁止数据接收的控制位

            当REN=1时,允许串行通信口接收数据;当REN=0时,禁止串行通信口接收数据。

            ④ TB8位:方式2、3中发送数据的第9位

            该位可以用软件规定其作用,可用作奇偶校验位,或在多机通信时,用作地址帧或数据帧的标志位,在方式0和方式1中,该位不用。

            ⑤ RB8位:方式2、3中接收数据的第9位

            该位可以用软件规定其作用,可用作奇偶校验位,或在多机通信时,用作地址帧或数据帧的标志位,在方式1中,若SM2=0,则RB8是接收到的停止位。

            ⑥ TI位:发送中断标志位

            当串行通信口工作在方式0时,发送完8位数据后,该位自动置“1”(即硬件置“1”),向CPU发出中断请求,在CPU响应中断后,必须用软件清0在其他几种工作方式中,该位在停止位开始发送前自动置“1”,向CPU发出中断请求,在CPU响应中断后,也必须用软件清0,以准备开始发送下一帧数据

            ⑦ RI位:接收中断标志位

            当串行通信口工作在方式0时,接收完8位数据后,该位自动置“1”,向CPU发出接收中断请求,在CPU响应中断后,必须用软件清0在其他几种工作方式中,该位在接收到停止位期间自动置“1”,向CPU发出中断请求,在CPU响应中断取走数据后,必须用软件对该位清0,以准备开始接收下一帧数据。在上电复位时,SCON各位均为“0”。

    3.2 电源控制寄存器(PCON)

            PCON寄存器是一个8位寄存器,它的字节地址为87H,不可位寻址并且只有最高位SMOD与串行通信口控制有关。PCON寄存器各位的名称和字节地址如下。

            SMOD位:波特率设置位。

            在串行通信口工作在方式1~3时起作用。若SMOD=0,波特率不变;当SMOD=1时,波特率加倍。在上电复位时,SMOD=0。

    4 四种工作方式与波特率的设置

            串行通信口有四种工作方式工作在何种方式受SCON寄存器的控制。在串行通信时,要改变数据传送速率(波特率),可对波特率进行设置

    4.1 方式0

            当SCON寄存器中的SM0=0、SM1=0时,串行通信口工作在方式0

            方式0称为同步移位寄存器输入/输出方式,常用于扩展I/O端口。在单片机发送或接收串行数据时,通过RXD端发送数据或接收数据,而通过TXD端送出数据传输所需的移位脉冲

            在方式0时,串行通信口又分两种工作情况:发送数据和接收数据。

    4.1.1 方式0-发送数据

            当串行通信口工作在方式0时,若要发送数据,通常在外部接8位串/并转换移位寄存器74LS164,具体连接电路如图7所示。其中RXD端用来输出串行数据,TXD端用来输出移位脉冲,P1.0端用来对74LS164进行清0

     图7 串行通信在方式0时的数据发送电路

            在单片机发送数据前,先从P1.0引脚发出一个清0信号(低电平)到74LS164的CLR引脚,对其进行清0,让D7~D0全部为“0”然后单片机在内部执行写SBUF指令,开始从RXD端(P3.0引脚)送出8位数据,与此同时,单片机的TXD端输出移位脉冲到74LS164的CLK引脚,在移位脉冲的控制下,74LS164接收单片机RXD端送到的8位数据(先低位后高位),数据发送完毕,在74LS164的D7~D0端输出8位数据。另外,在数据发送结束后SCON寄存器的发送中断标志位TI自动置“1”

    4.1.2 方式0-接收数据

            当串行通信口工作在方式0时,若要接收数据,一般在外部接8位并/串转换移位寄存器74LS165,具体连接电路如图8 所示。在这种方式时,RXD端用来接收输入的串行数据,TXD端用来输出移位脉冲,P1.0端用来对74LS165的数据进行锁存

     图8 串行通信口在方式0时的数据接收电路

            在单片机接收数据前,先从 P1.0 引脚发出一个低电平信号到74LS165 的S/\overline{L}\引脚,让74LS165锁存由D7~D0端输入的8位数据,然后单片机内部执行读SBUF指令,与此同时,单片机的TXD端送移位脉冲到74LS165的CLK1引脚,在移位脉冲的控制下,74LS165中的数据逐位从RXD端送入单片机,单片机接收数据完毕,SCON寄存器的接收中断标志位RI自动置“1”。

            在方式0中,串行通信口发送和接收数据的波特率都是fosc/12

    4.2 方式1

            当SCON寄存器中的SM0=0、SM1=1时,串行通信口工作在方式1

            在方式1时,串行通信口可以发送和接收每帧10位的串行数据其中TXD端用来发送数据,RXD端用来接收数据。

            在方式1中,一帧数据中有10位,包括1位起始位(低电平)、8位数据位(低位在前)和1位停止位(高电平)。在方式1时,串行通信口又分两种工作情况:发送数据和接收数据。

    4.2.1 方式1-发送数据

            在发送数据时,若执行写SBUF指令,发送控制器在移位脉冲(由定时器/计数器T1产生的信号再经16或32分频而得到)的控制下,先从TXD端送出一个起始位(低电平),然后再逐位将8位数据从 TXD 端送出,当最后一位数据发送完成,发送控制器马上将SCON的TI位置“1”,向CPU发出中断请求,同时从TXD端输出停止位(高电平)

    4.2.2 方式1-接收数据

            在方式1时,需要设置SCON中的REN=1,串行通信口才允许接收数据。由于不知道外部设备何时会发送数据,所以串行通信口会不断检测RXD端,当检测到RXD端有负跳变(由“1”变为“0”)时,说明外部设备发来了数据的起始位,于是启动RXD端接收,将输入的8位数据逐位移入内部的输入移位寄存器。8位数据全部进入输入移位寄存器后,如果满足RI位为“0”、SM2位为“0”(若SM2不为“0”,但接收到的数据停止位为“1”也可以)的条件,输入移位寄存器中的8位数据才可以放入SBUF,停止位的“1”才能送入SCON的RB8位中,RI位就会被置“1”,向CPU发出中断请求,让CPU取走SBUF中的数据,如果条件不满足,输入移位寄存器中的数据将无法送入SBUF而丢弃,重新等待接收新的数据

    4.3 方式2

            当SCON寄存器中的SM0=1、SM1=0时,串行通信口工作在方式2

            在方式2时,串行通信口可以发送和接收每帧11位的串行数据,其中1位起始位、8位数据位、1位可编程位和1位停止位。TXD端用来发送数据,RXD端用来接收数据

            在方式2时,串行通信口又分两种工作情况:发送数据和接收数据。

    4.3.1 方式2-发送数据

            在方式2时,发送的一帧数据有11位,其中有9位数据,第9位数据取自SCON中的TB8位。在发送数据前,先用软件设置TB8位的值,然后执行写SBUF指令(如MOV SBUF,A),发送控制器在内部移位脉冲的控制下,从TXD端送出一个起始位(低电平),然后逐位送出8位数据,再从TB8位中取出第9位并送出,当最后一位数据发送完成,发送控制器马上将SCON的TI位置“1”,向CPU发出中断请求,同时从TXD端输出停止位(高电平)

    4.3.2 方式2-接收数据

            在方式2时,同样需设置SCON的REN=1,串行通信口才允许接收数据,然后不断检测RXD端是否有负跳变(由“1”变为“0”),若有,说明外部设备发来了数据的起始位,于是启动RXD端接收数据。当8位数据全部进入输入移位寄存器后,如果RI位为“0”、SM2位为“0”(若SM2不为“0”,但接收到的第9位数据为“1”也可以),输入移位寄存器中的8位数据才可以送入SBUF,第9位会放进SCON的RB8位,同时RI位置“1”,向CPU发出中断请求,让CPU取走SBUF中的数据,否则输入移位寄存器中的数据将无法送入SBUF而丢弃

    4.4 方式3

            当SCON中的SM0=1、SM1=1时,串行通信口工作在方式3方式3与方式2一样,传送的一帧数据都为11位,工作原理也相同,两者的区别仅在于波特率不同,方式2的波特率固定为fosc/64或fosc/32,而方式3的波特率则可以设置

    4.5 波特率的设置

            在串行通信中,为了保证数据的发送和接收成功,要求发送方发送数据的速率与接收方接收数据的速率相同,而将双方的波特率设置相同就可以达到这个要求。在串行通信的四种方式中,方式0的波特率是固定的,而方式1~方式3的波特率则是可变的波特率是数据传送的速率,它用每秒传送的二进制数的位数来表示,单位符号是bit/s

    4.5.1 方式0的波特率

            方式0的波特率固定为时钟振荡频率的1/12,即方式0的波特率 = fosc/12

    4.5.2 方式2的波特率

            方式2的波特率由PCON寄存器中的SMOD位决定

            当SMOD = 0时,方式2的波特率为时钟振荡频率的1/64;

            当SMOD = 1时,方式2的波特率加倍,为时钟振荡频率的1/32,即

    方式2的波特率 = fosc*2^{SMOD}/64

    4.5.3 方式1和方式3的波特率

            方式1和方式3的波特率除了与SMOD位有关,还与定时器/计数器T1的溢出率有关。方式1和方式3的波特率可用下式计算:

    方式1、3的波特率 = T1的溢出率·2^{SMOD}/32

            T1的溢出率是指定时器/计数器T1在单位时间内计数产生的溢出次数,也即溢出脉冲的频率

            在将定时器/计数器T0设作工作方式3时,T1可以工作在方式0、方式1或方式2三种方式下。

            当T1工作于方式0时,它对脉冲信号(由时钟信号fosc经12分频得到)进行计数,计到2^{13}时会产生一个溢出脉冲到串行通信口作为移位脉冲;

            当T1工作于方式1和2时,则分别要计到2^{16}2^{8}−X(X为T1的初值,可以设定)才产生溢出脉冲。

            如果要提高串行通信口的波特率,可让T1工作在方式2,因为该方式计数时间短,溢出脉冲频率高,并且能通过设置T1的初值来调节计数时间,从而改变T1产生的溢出脉冲的频率(又称T1的溢出率)。

            当T1工作在方式2时,T1两次溢出的时间间隔,也即T1的溢出周期为

    T1的溢出周期 = (2^{8}− X)·12/ fosc

            T1的溢出率为溢出周期的倒数,即

    T1的溢出率 = fosc/[12·(2^{8}− X)]

            故当T1工作在方式2时,串行通信口工作方式1、3的波特率为

            方式1、3的波特率 = (2^{SMOD}/32)·fosc/[12·(2^{8}− X)] 

            由上式可推导出T1在方式2时,其初值X为

    X = 2^{8}− (2^{SMOD}·fosc)/(384·波特率)

            举例:单片机的时钟频率fosc=11.0592MHz,现要让串行通信的波特率为2400bit/s,可将串行通信口的工作方式设为1、T1的方式设为2,并求出T1应设的初值。

            求T1初值的过程如下。

            先进行寄存器设置:为了让波特率不倍增,将 PCON 寄存器中的数据设为00H,这样SMOD位就为“0”;设置TMOD寄存器中的数据为20H,这样T1就工作在方式2。再计算并设置T1的初值:

    X = 2^{8}2^{SMOD}·fosc/384·波特率 = 256 −(2^{0}× 11.0592 × 10^{6})/(384 × 2400)= 244

            十进制数244转换成十六进制数为F4H,将T1的初值设为F4H。

            由于设置波特率和初值需要计算,比较麻烦,一般情况下可查表来进行设置。常见的波特率设置见表2。

    表2 常用的波特率设置

    展开全文
  • 串行通信有单工通信、半双工通信和全双工通信3种方式。 单工通信:数据只能单方向地从一端向另一端传送。例如,目前的有线电视节目,只能单方向传送。 半双工通信:数据可以双向传送,但任一时刻只能向一个方向...

    数据通信的基本概念

    串行通信有单工通信、半双工通信和全双工通信3种方式。

    单工通信:数据只能单方向地从一端向另一端传送。例如,目前的有线电视节目,只能单方向传送。

    半双工通信:数据可以双向传送,但任一时刻只能向一个方向传送。也就是说,半双工通信可以分时双向传送数据。例如,目前的某些对讲机,任一时刻只能一方讲,另一方听。

    全双工通信:数据可同时向两个方向传送。全双工通信效率最高,适用于计算机之间的通信。

    此外,通信双方要正确地进行数据传输,需要解决何时开始传输,何时结束传输,以及数据传输速率等问题,即解决数据同步问题。

    实现数据同步,通常有两种方式,一种是异步通信,另一种是同步通信。

    异步通信

    在异步通信中,数据一帧一帧地传送。每一帧由一个字符代码组成,一个字符代码由起始位、数据位、奇偶校验位和停止位4部分组成。每一帧的数据格式如图7-1所示。

    一个串行帧的开始是一个起始位“0”,然后是5〜8位数据(规定低位数据在前,高位数据在后),接着是奇偶校验位(此位可省略),最后是停止位“1”。

    1. 起始位
      起始位"0”占用一位,用来通知接收设备,开始接收字符。通信线在不传送字符时,一直保持为“1”。接收端不断检测线路状态,当测到一个“0”电平时,就知道发来一个新字符,马上进行接收。起始位还被用作同步接收端的时钟,以保证以后的接收能正确进行。
    2. 数据位
      数据位是要传送的数据,可以是5位、6位或更多。当数据位是5位时,数据位为D0〜D4;当数据位是6位时,数据位为D0〜D5;当数据位是8位时,数据位为D0〜D7。
    3. 奇偶校验位
      奇偶校验位只占一位,其数据位为D8。当传送数据不进行奇偶校验时,可以省略此位。此位也可用于确定该帧字符所代表的信息类型,“1"表明传送的是地址帧,“0”表明传送的是数据帧。
    4. 停止位
      停止位用来表示字符的结束,停止位可以是1位、1.5位或2位。停止位必须是高电平。接收端接收到停止位后,就知道此字符传送完毕。

    图7-1 (a)表示一个字符紧接一个字符的传送情况,图7-1 (b)表示两个字符之间有空闲位的情况,空闲位为“1”,线路处于等待状态。空闲位是异步通信的特征之一。

    同步通信

    在同步通信中,发送端首先发送同步字符,紧接着连续传送数据(即数据块),并由时钟来实现发送端与接收端的同步。同步传送时,字符与字符之间没有间隙,仅在数据块开始时用同步字符(SYNC)来指示,其数据格式如图7-2所示。

    同步通信传送速度较快,但硬件结构比较复杂;异步通信的特点是硬件结构较简单,但传送速度较慢。

    MCS-51单片机釆用异步通信方式。

    波特率

    波特率是数据传送的速率,指每秒传送二进制数据的位数,单位是位/秒(bps)。假设数据传送速率是240字符/秒,而每个字符包含10个数据位

    则传送的波特率为10x240=2400bps

    每一位代码的传送时间几为波特率的倒数:

    T=1/2400=0.4165ms

    异步通信的波特率一般在50〜64000bps之间。

    串行口的结构

    MCS-51有一个可编程的全双工串行通信接口,可作为通用异步接收/发送器UART,也可作为同步移位寄存器。

    它的帧格式有8位、10位和11位,可以设置为固定波特率和可变波特率,给使用者带来很大的灵活性。

    80C51串行口的内部简化结构如图7-3所示。

    图中有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H,可同时发送、接收数据。发送缓冲器只能写入,不能读出;接收缓冲器只能读出,不能写入。

    串行发送与接收的速率与移位时钟同步,定时器T1作为串行通信的波特率发生器,T1溢出率经2分频(或不分频)又经16分频作为串行发送或接收的移位时钟。移位时钟的速率即波特率。

    MCS-51单片机串行接口内部有一个发送数据缓冲器和一个接收数据缓冲器,简称串行数据缓冲器,共用一个地址99H;

    一个串行口控制寄存器SCON,用来选择串行口工作方式、控制数据接收和发送,并标示串行口的工作状态等。

    当串行口接收数据时,外界的串行信号通过单片机的引脚RXD (P3.0串行数据接收端),进入串行口的接收数据缓冲器。

    当串行口发送数据时,CPU将数据写入发送数据缓冲器,由发送数据缓冲器将数据通过引脚TXD (P3.1串行数据发送端),发送至外部的通信设备。

    特殊功能寄存器PCON控制串行口的波特率。PCON中有一位是波特率倍增位。

    串行口控制寄存器SCON

    串行口控制寄存器SCON决定串行口通信工作方式,控制数据的接收和发送,并标示串行口的工作状态等,其位格式为:

    SMO、SM1:串行口工作方式控制位,对应4种工作方式,如表7-1所示(fosc是晶振频率)。

    SM2:多机通信控制位,主要用于工作方式2和工作方式3。

    若SM2=1,则允许多机通信。

    多机通信规定:第9位数据位为1 (即TB8=1),说明本帧数据为地址帧:第9位数据为0(即TB8=0),则本帧数据为数据帧。

    当从机接收到的第9位数据(在RB8中)为1时,数据才装入接收缓冲器SBUF,并置RI=1向CPU申请中断;如果接收到的第9位数据(在RB8中)为0,则不置位中断标志RL信息丢失。

    当SM2=0时,则不管接收到第9位数据是否为1,都产生中断标志RI,并将接收到的数据装入SBUF。应用这一特点可以实现多机通信。

    串行口工作在方式0时,SM2必须设置为0;工作在方式1时,如SM2=1,则只有接收到有效的停止位时才会激活RI。

    REN:允许接收控制位。当REN=1时,允许接收;当REN=0时,禁止接收。此位由软件置1或清零。

    TB8:在方式2和方式3中,此位为发送数据的第9位,在多机通信中作为发送地址帧或数据帧的标志。TB8=1,说明该发送帧为地址帧;TB8=0,说明该发送帧为数据帧。在许多通信协议中,它可作为奇偶校验位。此位由软件置1或清零。在方式0和方式1中,此位未使用。

    RB8:接收数据的第9位。在方式2和方式3中,接收到的第9位数据放在RB8中。它或是约定的奇/偶校验位,或是约定的地址/数据标志位。在方式2和方式3多机通信中,若SM2=1且RB8=1,说明接收到的数据为地址帧。

    TI:发送中断标志位。在一帧数据发送完时置位。TI=1,申请中断,说明发送缓冲器SBUF已空,CPU可以发送下一帧数据。中断被响应后,TI不能自动清零,必须由软件清零。 ,

    RI:接收中断标志位。在接收到一帧有效数据后,由硬件置位。RI=1.申请中断,表示一帧数据接收结束,并已装入接收缓冲器SBUF中,CPU响应中断,取走数据。RI不能自动清零,必须由软件清零。

    串行口发送中断标志TI和接收中断标志RI共为一个中断源。因此,CPU接收到中断请求后,不知道是发送中断TI还是接收中断RI,必须用软件来判别。单片机复位后,控制寄存器SCON的各位均清零。

    特殊功能寄存器PCON

    电源控制寄存器PCON中只有一位SMOD与串行口工作有关,它的位格式为:

    SMOD:波特率倍增位。串行口工作在方式1、方式2、方式3时,若SMOD=1,则波特率提高一倍;
    若SMOD=0,则波特率不提高一倍。单片机复位时,SMOD=0。

    串行口的四种工作方式

    MCS-51单片机串行口可设置4种工作方式,由SCON中的SMO、SM1进行定义。

    方式0

    方式0时,串行口为同步移位寄存器的输入/输出方式。主要用于扩展并行输入或输出口。数据由RXD (P3.0)引脚输入或输出,同步移位脉冲由TXD (P3.1)引脚输出。发送和接收均为8位数据,低位在先,高位在后。波特率固定为focs/12。

    方式0输出

    方式0时输出时序如图7-4所示。

    对发送数据缓冲器SBUF写入一个数据,就启动了串行口的发送过程。内部的定时逻辑在SBUF写入数据之后,经过一个完整的机器周期,输出移位寄存器中输出位的内容送RXD引脚输出。移位脉冲由TXD引脚输出,它使RXD引脚输出的数据移入外部移位寄存器。当数据的最高位D7移至输出移位寄存器的输出位时,再移位一次后就完成了一字节的输出,中断标志TI置1。如要再发送下一字节数据,必须用软件先将TI清零。

    方式0输入

    方式0时输入时序如图7-5所示。

    当SCON中的接收允许位REN=1,用指令使SCON中的RI为0时,就会启动串行口接收过程。TXD引脚为串行输入引脚,移位脉冲由TXD引脚输出。当接收完一帧数据后,由硬件将输入移位寄存器中的内容写入SBUF,中断标志RI置1。如要再接收数据,必须用软件将RI清零。

    方式0输出时,串行口可以外接串行输入并行输出的移位寄存器,如74LS164、CD4094等,其接口逻辑如图7-6所示。TXD引脚输出的移位脉冲将RXD引脚输出的数据(低位在先)逐位移入74LS164或CD4094。

    方式0输入时,串行口外接并行输入串行输出的移位寄存器,如74LS165,其接口逻辑如图7-7所示。

    方式1

    串行口定义为方式1时,是10位数据的异步通信口。TXD为数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式如图7-8所示。其中1位起始位、8位数据位、1位停止位。

    方式1输出

    当执行一条写SBUF的指令时,就启动了串行口发送过程。在发送移位时钟(由波特率确定)的同步下,从TXD引脚先送出起始位,然后是8位数据位,最后是停止位。一帧10位数据发送完后,中断标志TI置1。方式1的发送时序如图7-9所示。方式1的波特率由定时器1的溢出率决定。

    方式1输入

    方式1的接收时序如图7-10所示。

    当用软件置REN为1时,接收器以所选择波特率的16倍速率釆样RXD引脚电平,检测到RXD引脚输入电平发生负跳变时,则说明起始位有效,将其移入输入移位寄存器,并开始接收这一帧信息的其余位。

    在接收过程中,数据从输入移位寄存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0 (或接收到的停止位为1)时,将接收到的9位数据的前8位数据装入接收SBUF,第9位(停止位)进入RB8,并置RI=1,向CPU请求中断。

    方式2和方式3

    串行口工作于方式2或方式3时,为11位数据的异步通信口。TXD为数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式如图7-11所示。

    由图可见,串行口工作于方式2和方式3时起始位1位,数据位9位(含1位附加的第9位,发送时为SCON中的TB8,接收时为RB8)、停止位1位,一帧数据为11位。方式2的波特率固定为晶振频率的1/64或1/32,方式3的波特率由定时器T1的溢出率决定

    方式2和方式3输出

    CPU向SBUF写入数据时,就启动了串行口的发送过程。SCON中的TB8写入输出移位寄存器的第9位,8位数据装入SBUF。方式2和方式3的发送时序如图7-12所示。

    发送开始时,先把起始位0输出到TXD引脚,然后发送移位寄存器的输出位(D0)到TXD引脚。每一个移位脉冲都使输出移位寄存器的各位右移一位,并由TXD引脚输出。

    第一次移位时,停止位“1”移入输出移位寄存器的第9位上,以后每次移位,左边都移入0。当停止位移至输出位时,左边其余位全为0,检测电路检测到这一条件时,使控制电路进行最后一次移位,并置TI=1,向CPU请求中断。

    方式2和方式3输入

    软件使接收允许位REN为1后,接收器就以所选频率的16倍速率开始取样RXD引脚的电平状态,当检测到RXD引脚发生负跳变时,说明起始位有效,将其移入输入移位寄存器,开始接收这一帧数据。方式2和方式3的接收时序如图7-13所示。

    接收时,数据从右边移入输入移位寄存器,在起始位。移到最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0 (或接收到的第9位数据为1)时,接收到的数据装入接收缓冲器SBUF和RB8 (接收数据的第9位),置RI=1,向CPU请求中断。如果条件不满足,则数据丢失,且不置位RI,继续搜索RXD引脚的负跳变。

    多机通信的工作原理

    MCS-51单片机具有多机通信功能。

    串行口工作在方式2、方式3均可实现多机通信。串行控制寄存器SCON中的SM2和TB8、RB8相配合可以完成主从式多机通信。

    多机通信规定:第9位数据位为1 (即TB8=1),说明本帧数据为地址帧;第9位数据为0 (即TB8=0)时,则本帧数据为数据帧。

    若SM2=1,则仅当从机接收到的第9位数据为1时,数据才装入接收缓冲器SBUF,并置RI=1,向CPU申请中断;如果接收到的第9位数据为0,则不置位中断标志RI,该帧信息丢弃。

    主从式多机通信中,一台是主机,其余为从机,从机要服从主机的调度和支配。

    在多机通信时,一台为主机,其他为从机,所有从机的SM2都必须置1。主机首先发送一帧地址数据中断所有从机。从机接收到地址后,判断主机发送地址是否为本机地址,若是本机地址,则将SM2清零,进入正式通信状态,把本机的地址发送回主机作为应答信号,然后开始接收主机发来的数据或命令信息。其他从机由于地址不符,其SM2=1保持不变,不与主机通信,从中断返回。

    主从式多机通信遵循的通信协议为:

    • 使所有从机的SM2=1,处于只接收地址帧的状态。
    • 主机向从机发送一帧地址信息,其中包括8位地址,且第9位为1,表示发送的是地址,中断所有从机。
    • 从机接收。
    • 主机接收从机发回的应答地址信号后,与其发送的地址信息进行比较,如果相符,则使TB8=0,正式发送数据;如果不符,则发送错误信息。
    • 通信的各机之间必须以相同的帧格式及波特率进行通信。

    波特率的及算方法

    在串行通信中,收发双方对发送或接收的数据的波特率要有一个约定。

    MCS-51单片机串行口有4种工作方式:方式0和方式2的波特率固定不变;方式1和方式3的波特率可以变化,由定时器T1的溢出速率决定。

    下面介绍串行口 4种工作方式对应的波特率。

    方式0的波特率

    釆用工作方式0时,移位脉冲由机器周期的第6个状态周期S6给出,每个机器周期产生一个移位脉冲,发送或接收一位数据。因此,波特率是固定的,为振荡频率的1/12,不受PCON寄存器中SMOD的影响。用公式表示为

    工作方式0的波特率 = fosc/12

    方式2的波特率

    釆用工作方式2时,移位脉冲由振荡频率fosc的第二节拍P2时钟(即fosc/2)给出,所以,方式2波特率取决于PCON中的SMOD位的值,当SMOD=0时,波特率为fosc/64;当SMOD=1时,波特率为人fosc/32。用公式表示为

    工作方式2的波特率=(2^SMOD/64) * fosc

    方式1和方式3的波特率

    方式1和方式3的移位脉冲由定时器T1的溢出速率决定。因此,方式1和方式3的波特率由定时器T1的溢出速率与SMOD值同时决定。用公式表示为

    方式1、方式3的波特率=(2*SMOD/32) x T1的溢出速率

    其中,T1的溢出速率取决于T1的计数速率(在定时方式时,计数速率 = fosc/12)和T1的预置初值。

    定时器T1作为波特率发生器时,通常选用定时器T1工作在方式2,并使其工作在定时方式(即C/T=0)。

    此时,T1的计数速率为fosc/12 (这时应禁止T1中断)。设定时器初值为X,则每过“256-X”个机器周期,定时器T1产生一次溢出。用公式表示为

    T1 的溢出速率=(fosc/12) / (256-X)

    当给出波特率后,可用下式计算出定时器T1工作在方式2的初始值为

    X=256-(fosc * (SMOD+1) / (384*波特率)

    当T1作为波特率发生器时,最典型的用法是使T1工作在自动再装入的8位定时器方式(即方式2,且TCON的TR1=1,以启动定时器)。这时溢出速率取决于TH1中的计数值。

    在单片机应用中,常用的晶振频率为12MHz和11.0592MHz。所以,选用的波特率也相对固定。常用的串行口波特率与各参数的关系如表7-2所示。

    在使用串行口之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。具体步骤如下。

    1. 确定T1的工作方式(编程TMOD寄存器);
    2. 计算T1的初值,装载TH1、TL1;
    3. 启动T1 (编程TCON中的TR1位);
    4. 确定串行口控制(编程SCON寄存器);
    5. 串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。

    image-20200602010518784

    展开全文
  • 串行总线技术(一)-串行总线结构(以PCIe为例)串行总线的出现在早期的计算机系统中,多数外围设备使用并行总线结构。这些总线包括PCI和PATA(并行ATA)。当通信速率较低时,并行总线结...

    3bb40fa785e836bab1494a6103cfce2b.png

    串行总线技术(一)-串行总线结构(以PCIe为例)

    串行总线的出现

    在早期的计算机系统中,多数外围设备使用并行总线结构。这些总线包括PCI和PATA(并行ATA)。当通信速率较低时,并行总线结构可以设计得非常简单和有效,可以连接大量外围设备。通过使用中央仲裁机制,可以方便地实现总线设备间的通信:然而,当速率和带宽不断增加时,并行结构的潜力不断被发掘并不再能够满足系统设计要求。

    并行总线结构的带宽可以通过增加总线宽度或者提高总线的工作频率来实现,但这种增加带宽的方式会逐渐变得困难。并行总线会占用很多引脚,而对现代数字芯片来说,单一芯片中集成了大量的功能,引脚本身就是一种非常紧张的资源,这为继续增加总线宽度带来了困难。

    另外,总线频率已经进行了多次增加(如PCI-->PCIX),继续对大量信号线提高工作频率也变得更加困难。除此之外,并行结构还有一些固有不足,如没有包的概念,没有错误检验机制等。在并行总线中,传输的是数据突发片段,不是完整的数据包,也没有与所传输数裾 相关的CRC校验结果以进行差错控制。并行总线的不足促进串行总线结构的发展,这不仅克服了原有的缺陷,还带来了其他好处。如图所示为并行总线与串行总线示例。

    447b79565efe60fd75ab5f99374ac1e2.png 538966c2d406f5b4c3040a8ae4c835df.png

    现在的数字系统中有很多种串行总线。PCI Express(代替了并行PCI总线)、SATA(代替PATA)以及USB等就是一些常用的高速总线。这些总线的速率也从MHz达到了GHz。

    串行总线的优缺点

    优点

    • 占用引脚数量少

    串行总线使用一对信号线发送数据(TX+ TX-),使用一对信号线接收数据(RX+ RX-)。而PCI和PCIX等并行总线会占用大量引脚。

    • 差分信号

    TX和RX信号线上采用的是差分信号传输方式,这种传输方式具有很高的抗噪声能力。

    • 强错误检测能力

    串行协议使用基干包的数据传输方式,对数据包采用了CRC校验。相比于PCI中采用的奇偶校验,CRC校验具有很强的检错能力。

    • 纠错与恢复

    因为采用基于包的传输方式并且带有CRC校验,接收设备能够检测出接收数据包中的错误并通知发送端出现了传输错误,发送端可以重新发送出现错误的数据包。

    • 全双工数据和控制流

    数据包可以在TX信号线上传输,同时可以在RX信号线上接收控制信息。SATA使用类似HOLD的流控原语来实时阻止数据发送以避免数据溢出。

    • 分割式数据传输

    在分割式数据传输中,request和completion可以不出现在同一个数据传输操作中。这不是串行总线所特有的必要特征。所有的串行总线都使用包和分割式数据传输协议进行数据传输。多数早期的并行总线(PCI、AHB)不支持分割式数据传输。最新的并行总线,如AXI 开始支持这一协议。

    缺点

    串行总线也存在一些不利之处。

    • 只支持点到点连接

    通过串行总线只能连接两个设备,而对于并行总线,可以在单一总线上连接多个设备,并目.很容易增减总线上的设备。对于串行总线,我们需要使用交换机和多个总线设备连接。

    • 更大的延迟

    由于串行及分层结构特点,串行结构的总线延迟更大一些。

    串行总线结构

    串行总线结构只允许点到点连接,一条串行总线只能连接两个设备,而并行总线可以同吋连接多个设备。在串行总线结构中,总线设备中需要包括两个基本电路部件:MAC控制器(通常简称为控制器)和PHY(主要实现模拟收发功能)。MAC具有分层结构,通常包括三个 层次。PHY包括两个部分:PCS和PMA。PCS(Physical Coding Sublayer,物理编码子层)主要实现编解码等数字逻辑功能。PMA主要实现时钟恢复、均衡和信号电平检测等模拟功能。

    下面我们将以PCIe和SATA为例,对串行总线结构加以分析,如图所示。

    2c62c0ff59219bbf1c1f9f34e0f37b58.png

    MAC控制器包括三个层次:PHY逻辑层 、 数据链路层和事务层。每一层都有自己特定的功能。

    PHY逻辑层

    两个相互联接设备的PHY逻辑层之间使用PHY层包进行通信,称为有序训练集合,如图所示。PHY层包被用于建立链路和确定交互的操作速度,在训练阶段结束时,双方进入连接阶段,此时它们已经做好了传输数据链路层和事务层包的准备。PHY层包产生于PHY层,终结于另一侧的PHY逻辑层,不会上交给其他层次。

    c57f1de5cd76df56330b490ed5b0ffc6.png

    数据链路层

    数据链路层使用短的、固定长度(2个dword/8字节)的包在两个设备间交互链路信息,如图所示。这些包也被称为DLLP(Data Link Layer Packet,数据链路层包)。DLLP被用于交换信用信息、ACK、NAK和功率管理协议。DLLP在本层产生,终止于对端的同一层, 不会进一步向上提交。

    28e72432b2e5353c9821d6f296acd7ff.png

    事务层

    本层在两个设备间进行实际的数据交互,如下图所示。这些包被称为TLP(Transaction Layer Packet,事务层包),TLP为变长包。TLP包括头域、数据净荷和CRC校验。一个TLP由start-of-packet符号开始,以END符号结束。

    0d05b15fd1039fc03ccd92a570a89a89.png

    串行总线时钟

    在PCIe中,平台提供100MHz参考时钟,通过PCIe插槽提供给总线设备。PCIe端点设备从PCIe连接器处获取该参考时钟并将其交给PHY PMA层。PMA内部有一个PLL,它根据输入的100MHz时钟和输入的RX数据流生成250MHz的时钟PCLK。PHY将PCLK提供给MAC发送数据(从MAC到PHY)和接收数据(从PHY到MAC)都同步于PCLK。对于PCIe,MAC的接收和发送电路工作在同一个时钟域。对于其他串行总线结构,如SATA收发电路时钟可能不同。在SATA中,发送和接收时钟是不同的,属于异步时钟。

    发送路径的微结构

    MAC和PHY PCS之间的接口是标准的,虽然这不一定必要,但标准化有利于IP核的开发,可提高不同芯片厂商IP核之间的互操作性。对于PCIe来说,该接口被称为PIPE接口。

    MAC提供的发送数据的位宽为8比特或16比特。PCLK的频率与数据总线的位宽有直接关系,数据位宽为8比特时,PCLK为250MHz数据位宽为16比特时,PCLK为125MHz,如图所示。

    00ca7a2918b58ad29b3e0755584b5048.png

    这两个频率是PCIe Genl所使用的,在Gen2中,二者都进行了翻倍。位宽变换电路模块可以将16比特的数据位宽转换成8比特的位宽,接着将其送入8b/10b编码器。编码器将每个8比特的数据转换成为10比特的编码值并将其传递到PHY的PMA层。PMA层使用一个高速时钟(Genl时为2.5GHz,Gen2时为5GHz)进一步将10比特的编码结果转换为单比特串行数据并通过TX信号线发出。

    接收路径的微结构

    PMA接收电路实现比特提取和串并变换功能,将单比特的串行接收数据变换成为10比特的并行数据,如图所示。

    88466fc5bea9f359e763c6ba2d7f96c8.png

    10比特的数据流从PMA接收电路进入PCS接收电路。此时的10比特数据流并非是字符对准的。在PCS内部,10比特数据流先后进入字符对准电路、弹性缓冲区、10b/8b解码电路并最终进入可选的8b/16b转换电路。

    字符对准

    PCIe接收的数据是以10比特的字符为组成单位的。PMA接收电路将接收数据组成10比特字符时没有按照字符边界进行。字符对准逻辑电路查找COMMA字符并以它为基础进行字符边界对准。对准后的字符流被送入弹性缓冲区,如图所示。

    19976dbf9a65f8790824289f7f5fd492.png

    弹性缓冲区

    PCIe链路两端所使用时钟的标称值均为250MHz。它们可以使用平台提供的同一个时钟,或者选择它们自带的时钟源来生成250MHz的工作时钟。当使用相互独立的时钟时,它们之间会有微小的偏差(偏差可能非常微小,但不会为0),此时,经过一段时间之后,会造成数据的上溢或下溢。总线一端的时钟频率可能比另一端略微高一些,频率低的一端会出现数据缓冲区上溢,频率高的一端会出现数据缓冲区下溢。串行总线中使用弹性缓冲区来处理时钟频率上的微小差别。我们将对PCIe和SATA中的弹性缓冲区加以介绍。

    位宽为10比特的接收符号流被写入一个FIFO。按照PCIe协议,在发送数据时,会按照一定的间隔定期发送填充包(称为SKIP集合)。这些填充包可以在不影响数据净荷、编码/解码、扰码/解扰码的情况下快速插入和去除。写入逻辑持续将10比特的字符写入FIFO,读岀逻辑持续将FIFO中的字符读出。如果写入速度比读出速度快,FIFO中的数据深度将逐渐增加。

    当FIFO中的数据深度达到了预先设定的上限时,写入逻辑会丢弃1个或多个SKIP字符。类似地,当写入速度低于读出速度时,FIFO中的数据深度会逐渐降低,当深度降至预先设定的下限时,读出逻辑不再从FIFO中读出数据,它会暂停读出数据,同时向数据通路中插入一个SKIP符号。这里的FIFO就是弹性缓冲区,其内部数据深度是变化的,可以用于调整读写时钟频率的微小偏差,如图所示。

    4a1e61ba9fb2709ff8e331b7c8e7b38a.png

    需要说明的是,这种工作机制可以用于处理微小的读写频率偏差,不适合处理较大的频率偏差(较大的时钟偏差需要深度较大的弹性缓冲区并且会引入较大的延迟)。规范中对频率偏差会提出限制,例如,PCIe中的频率偏差应小于300PPM。当时钟偏差被限定在一定PPM之内时,SKIP出现的间隔就可以计算得到。

    SATA使用了类似的机制,它会在每256个双字之间插入两个ALIGH原语。ALIGN原语根据两边的频率差可以快速地被丢弃或插入。

    10b/8b解码和8b/16b转换

    弹性缓冲区的输出进入解码器电路,它会将10比特的字符转换成为8比特的数据。如果PCS-MAC接口数据通道宽度为16比特,那么需要将两个连续的8比特数据拼接起来构成16比特的数据并送给接收MAC如果数据通路宽度为8比特,那么不需要做任何处理,直接送给接收MAC。

    后面会继续讲讲《串行总线更多结构》,敬请期待。

    032f0b24a3963054f4579f492b607e8c.gif

    NOW

    学习Xilinx FPGA最好的资料其实就是官方手册,下表总结了部分手册的主要介绍内容,关注我,持续更新中......

    文件名主标题内容简单介绍是否有中文版
    UG4767 Series FPGAs GTX/GTH  TransceiversGTX和GTH介绍,PCIe、serdes等学习必备
    UG4717 Series FPGAs SelectIO Resources描述 7 系列 FPGA 中可用的 SelectIO资源。
    UG1114PetaLinux Tools DocumentatonPetaLinux 工具文档 参考指南是,V2019.2
    UG949UltraFAST 设计方法指南(适用于 Vivado  Design Suite)赛灵思® UltraFast™  设计方法是用于为当今器件优化设计进程的一套最佳实践。这些设计的规模与复杂性需要执行特定的步骤与设计任务,从而确保设计每一个阶段的成功开展。依照这些步骤,并遵循最佳实践,将帮助您以最快的速度和最高的效率实现期望的设计目标是,V2018.1
    IP手册pg057FIFO GeneratorFIFO生成器IP使用手册
    pg104Complex Multiplier复数乘法器IP使用手册
    pg122RAM-Based Shift Register 移位寄存器IP使用手册

    45ca22f429c9dfff436af538e7189353.png

    推荐阅读

    【Vivado那些事】如何查找官网例程及如何使用官网例程

    【Vivado使用误区与进阶】总结篇

    【Vivado那些事】Vivado中常用的快捷键(二)其他常用快捷键

    SystemVerilog数字系统设计_夏宇闻 PDF

    图书推荐|ARM Cortex-M0 全可编程SoC原理及实现

    简谈:如何学习FPGA

    Github 上有哪些优秀的 VHDL/Verilog/FPGA 项目

    AD936x+ZYNQ搭建收音机(一)

    AD936x+ZYNQ搭建OpenWIFI

    无招胜有招-Vivado非工程模式下的详细设计

    面试中经常会遇到的FPGA基本概念,你会几个?

    推荐一些可以获取免费的国外的原版书籍(电子版)网站

    FPGA 的重构

    国产CPU概括

    从电子游戏历史看IC发展的助推剂

    80年代电子游戏及电脑游戏的发展历史

    PCIe总线的基础知识

    万字长文带你回顾电子游戏的七十多年历史(完整版)

    FPGA中异步复位,同步释放的理解

    OpenFPGA系列文章总结

    用Verilog设计一个16 位 RISC 处理器

    介绍一些新手入门FPGA的优秀网站(新增)

    Verilog数字系统基础设计-CR

    Verilog数字系统基础设计-奇偶校验

    建立和保持时间及时序简单理解

    (Xilinx)FPGA中LVDS差分高速传输的实现

    Xilinx Multiboot实例演示

    高速串行通信常用的编码方式-8b/10b编码/解码
    Verilog计时(微秒、毫秒和秒)脉冲的产生及同步整形电路

    图书推荐|一本图像/视频处理的强大工具书

    Verilog HDL-同步技术

    再说System Verilog 与 Verilog 的关系

    数模混合信号建模语言Verilog-AMS

    Intel/Altera 系列FPGA简介

    一块带给无数人年少欢乐的CPU,别说你没用过它

    Verilog在编写第一行代码之前

    【例说】Verilog HDL 编译器指令,你见过几个?

    穿越时空的爱恋-Z80 CPU的前世今生

    【Vivado】那些事儿-汇总篇

    古老CPU启示录-晶体管之路

    【Vivado那些事儿】约束的顺序

    童年修复系列-SNES芯片组介绍及FPGA实现

    优秀的 Verilog/FPGA开源项目介绍(二)-RISC-V

    展开全文
  • 4、串行程序并行化考虑这样一个问题:统计某个工程的代码行数。首先想到的思路便是,递归文件树,每层递归里,循环遍历父文件夹下的所有子文件,如果子文件是文件夹,那么再对这个文件夹进行递归调用。于是问题很...

    4、串行程序并行化

    考虑这样一个问题:统计某个工程的代码行数。首先想到的思路便是,递归文件树,每层递归里,循环遍历父文件夹下的所有子文件,如果子文件是文件夹,那么再对这个文件夹进行递归调用。于是问题很轻松的解决了。这个方案可以优化吗?

    再回想这个问题,可以发现,循环里的递归调用其实相互之间是独立的,互不干扰,各自统计自己路径下的代码文件的行数。于是,发现了这个方案的可优化点——利用线程池进行并行处理。于是一个串行的求解方案被改进成了并行方案。

    不能光说不练,写了一个Demo,对串行方案和并行方案进行了量化对比。代码如下:

    [java]viewplaincopyimportjava.io.*;

    importjava.util.Queue;

    importjava.util.concurrent.*;

    /**

    *Createdbycdlvshengon2016/5/16.

    */

    publicclassParallelSequentialContrast{

    intcoreSize=Runtime.getRuntime().availableProcessors();

    ThreadPoolExecutorexec=newThreadPoolExecutor(coreSize*4,coreSize*5,0,TimeUnit.SECONDS,

    newLinkedBlockingQueue《Runnable》(10000),newThreadPoolExecutor.CallerRunsPolicy());

    Queue《Future《Integer》》queue=newConcurrentLinkedQueue《Future《Integer》》();

    privateintcountLineNum(Filef){

    if(!f.getName().endsWith(“java”)&&!f.getName().endsWith(“.js”)&&!f.getName().endsWith(“.vm”))return0;

    intsum=0;

    try{

    BufferedReaderbr=newBufferedReader(newFileReader(f));

    Stringstr=null;

    while((str=br.readLine())!=null)sum++;

    }catch(FileNotFoundExceptione){

    e.printStackTrace();

    }catch(IOExceptione){

    e.printStackTrace();

    }

    returnsum;

    }

    privateclassTaskimplementsCallable《Integer》{

    Filef;

    publicTask(Filef){

    this.f=f;

    }

    publicIntegercall()throwsException{

    intsum=0;

    if(f.isDirectory()){

    File[]fs=f.listFiles();

    for(Filefile:fs){

    if(file.isDirectory())queue.add(exec.submit(newTask(file)));

    elsesum+=countLineNum(file);

    }

    }elsesum+=countLineNum(f);

    returnsum;

    }

    }

    publicintparallelTraverse(Filef){

    queue.add(exec.submit(newTask(f)));

    intsum=0;

    while(!queue.isEmpty()){

    try{

    Future《Integer》future=queue.poll();

    sum+=future.get();

    }catch(InterruptedExceptione){

    e.printStackTrace();

    }catch(ExecutionExceptione){

    e.printStackTrace();

    }

    }

    exec.shutdown();

    returnsum;

    }

    publicintsequentialTraverse(Filef){

    intsum=0;

    if(f.isDirectory()){

    File[]fs=f.listFiles();

    for(Filefile:fs){

    if(file.isDirectory())sum+=sequentialTraverse(file);

    elsesum+=countLineNum(file);

    }

    }elsesum+=countLineNum(f);

    returnsum;

    }

    publicvoidparallelTest(ParallelSequentialContrastpsc,Stringpathname){

    longstart=System.currentTimeMillis();

    intsum=psc.parallelTraverse(newFile(pathname));

    longduration=System.currentTimeMillis()-start;

    System.out.println(String.format(“paralleltest,%dlinesofcodewerefound,timecostis%dms”,sum,duration));

    }

    publicvoidsequentialTest(ParallelSequentialContrastpsc,Stringpathname){

    longstart=System.currentTimeMillis();

    intsum=psc.sequentialTraverse(newFile(pathname));

    longduration=System.currentTimeMillis()-start;

    System.out.println(String.format(“sequentialtest,%dlinesofcodewerefound,timecostis%dms”,sum,duration));

    }

    publicstaticvoidmain(String[]args){

    ParallelSequentialContrastpsc=newParallelSequentialContrast();

    Stringpathname=“D:\\Code_Git”;

    psc.sequentialTest(psc,pathname);

    psc.parallelTest(psc,pathname);

    }

    }

    因为要不断的扫磁盘(虽然我的是固态硬盘),所以并行方案的线程池开的很大。IO密集型程序的相对CPU密集型程序的线程池会更大。

    程序运行结果如下:

    [plain]viewplaincopysequentialtest,415079linesofcodewerefound,timecostis364ms

    paralleltest,415079linesofcodewerefound,timecostis163ms

    可以发现,在结果同等精确的情况下,串行方案耗时是并行方案的两倍多。这个是在我个人PC上做的测试,如果是线上服务器运行,恐怕差距只会更加明显。

    如果一个大任务,由许多个相互独立的子任务组成,我们就可以在这里找突破点,把一个串行程序并行化,榨干多和服务器的性能!

    5、串行和并行的区别

    串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别使用于计算机与计算机、计算机与外设之间的远距离通信。终端与其他设备(例如其他终端、计算机和外部设备)通过数据传输进行通信。数据传输可以通过两种方式进行:并行通信和串行通信。在计算机和终端之间的数据传输通常是靠电缆或信道上的电流或电压变化实现的。如果一组数据的各数据位在多条线上同时被传输,这种传输方式称为并行通信。并行通信时数据的各个位同时传送,可以字或字节为单位并行进行。并行通信速度快,但用的通信线多、成本高,故不宜进行远距离通信。计算机或plc各种内部总线就是以并行方式传送数据的。另外,在PLC底板上,各种模块之间通过底板总线交换数据也以并行方式进行。

    并行通信传输中有多个数据位,同时在两个设备之间传输。发送设备将这些数据位通过对应的数据线传送给接收设备,还可附加一位数据校验位。接收设备可同时接收到这些数据,不需要做任何变换就可直接使用。并行方式主要用于近距离通信。计算机内的总线结构就是并行通信的例子。这种方法的优点是传输速度快,处理简单。

    3e35fe71e45e8c718d2ea9af676ae607.png

    串行数据传输时,数据是一位一位地在通信线上传输的,先由具有几位总线的计算机内的发送设备,将几位并行数据经并--串转换硬件转换成串行方式,再逐位经传输线到达接收站的设备中,并在接收端将数据从串行方式重新转换成并行方式,以供接收方使用。串行数据传输的速度要比并行传输慢得多,但对于覆盖面极其广阔的公用电话系统来说具有更大的现实意义。

    af2a2ae8d5612ff93a0583cc68c43dc5.png

    串行数据通信的方向性结构有三种,即单工、半双工和全双工。

    973a2ec74215f8eecd9a1226b22db45d.png

    展开全文
  • 《嵌入式高速串行并行技术——基于FPGA实现与应用(张锋著)》 看了一下前言、目录、自序、以及他本书创作过程中的随笔 (小编就决定把这本书分享出来,也不知道这样做好不好。所以,在这里有个小请求,大家尽量...
  • 串行总线技术(二)-串行总线中的先进设计理念及SerDes/PMA介绍字节分割/链路聚合下面以PCIe为例对字节分割加以讨论,如图所示。PCIe使用链路和线路来发送串行数据。链路是一个逻辑...
  • 本文研究全球及中国市场串行控制台服务器现状及未来发展趋势,侧重分析全球及中国市场的主要企业,同时对比北美、欧洲、日本、中国、东南亚、印度等地区的现状及未来发展趋势。 本文重点分析在全球及中国有重要角色...
  • 51单片机(七)串行口通信

    千次阅读 2021-03-20 19:12:57
    一、并行与串行通信 1、并行通信 将数据每一字节的各位用多条数据线同时进行传送。每个字节8位,由8条数据线同时传送一位,同一时间总共传送1个字节。除了8条数据线外,还有一天信号线和若干控制线。 由于发送设备和...
  • 串行口通信(一)

    2021-01-06 13:59:07
    串行口通信就被发明出来,下面来了解串行口通信(uart)。 几个概念 为了能更好理解串行口通信,在介绍它之前,先来看看几个概念,补充知识,方便深入明白uart工作原理。 通信方式 通信方式 通信方式有两种,...
  • 摘要:串口通信是一种广泛使用且实用的通信方式,介绍RS232串行通信的联结方式,研究利用c语言编程实现RS232串行通信的过程。结合实际应用,在约定双方串行通信协议的基础上,运用C语言开发的串行通信软件,实现了...
  • 引言程序运行的方式可以分为三种:串行(Sequential)、并行(Parallel)、并发(Concurrent)。串行是最一般的情况,程序会按顺序执行每个任务,效率往往十分低下。与之相对的是并行,多个任务会同时运行在不同的cpu线程...
  • MySQL中四种事务级别事务隔离级别脏读不可重复读幻读读未提交(read-uncommitted)是是是读提交(read-committed)否是是可重复读(repeatable-read)否否是串行化(serializable)否否否MySQL默认事务级别为repeatable-read...
  • 串行FIR实现 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Create Date: 2021/03/13 17:28:28 // Design Name: FIR滤波器全串行结构实现仿真 /...
  • 在进行接下来的话题前,我们来谈谈并行,串行的问题。我们本节要弄明白的问题是,串行和并行,执行的流程是什么样的。不同的中间操作(运功)会对流程有什么样的影响。说真心的我真的不想大段大段贴代码。但是为了让...
  • Java中对象的串行化(Serialization)和transient关键字一、串行化的概念和目的1.什么是串行化对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把...
  • 串行接口的定义串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输...
  • 通信协议-GMSL(千兆多媒体串行链路)

    千次阅读 2021-08-30 13:58:11
    GMSL(Gigabit Multimedia Serial Links),中文名称为千兆多媒体串行链路,是Maxim公司推出的一种高速串行接口,适用于音频,视频和控制信号的传输。 通信介质支持同轴电缆以及屏蔽双绞线,使用50Ω同轴电缆或者100Ω...
  • [专业课笔记] 第七章 8951串行口正文基本知识数据通信并行通信串行通信串行口及其应用8951之间的点对点异步通信8951和pc的机间通信无线单片机及其点到多点通信RFID技术和物联网的应用 正文 基本知识 数据通信 本机的...
  • java串行

    2021-03-07 10:42:19
    对象通过写出描述自己状态的数值来记录自己,这个过程叫对象的串行化(Serialization-连续)。串行化的主要任务是写出对象实例变量的数值。如果变量是另一对象的引用,则引用的对象也要串行化。这个过程是递归的,...
  • java中对象的串行

    2021-04-08 09:20:25
    什么是串行化对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力。叫作对象的持续性(persistence...
  • RxHttp实现并行和串行、多串行(一) #前言 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们...
  • 描述随着目前对通信和计算机系统速度与带宽的需求不断上升,系统设计师正面临着严峻的...并行总线宽度经多年不断增长之后,如今出现了另一种朝着相反方向发展的总线技术趋势,即窄串行总线开始取代宽并行结构。例如...
  • 文章目录可编程串行异步通信接口芯片**8250**串行数据发送过程串行数据接收过程内部结构发送保持寄存器(3F8H/2F8H)接收缓冲寄存器(3F8H/2F8H)通信线状态寄存器(3FDH/2FDH)通信线状态寄存器示例中断允许寄存器(3F9H/...
  • 综 合 实验 报告实验题目 :双机串行通信的设计与实现学生班级 :电子学生姓名 :学生学号 :指导教师 :实验时间 :.9.12- .9.17题目 :双机串行通信的设计与实现资料内容仅供您学习参考,如有不当或者侵权,请联系改正...
  • 单片机C语言编程串行口通讯第7章 MCS-51单片机串行口 第7章 MCS-51单片机串行口 目 录 7.1 串行通信基本知识 7.2 串行口结构及控制 7.3 串行口工作方式 7.4 串行口应用举例 7.5 单片机与PC机通信的接口电路 本章要点...
  • MSP432的串行通信

    千次阅读 2021-07-23 15:43:53
    目录数字通信基本知识组成串行通信和并行通信同步通信和异步通信异步串行通信的通用基础知识异步串行通信的格式串行通信的波特率奇偶校验串行通信传输方式术语1.全双工(Full-duplex)2.半双工(Half-duplex)3.单工...
  • 串行输入

    2021-07-14 15:31:55
    SER = dat>>7; dat<<=1; 将dat中的数据串行输入SER 先将dat右移7位,只剩最高位 将最高位存入SER中 ...dat左移一位,第二位变成最高位,再将最高位存入SER中 ...实现了串行输入的功能
  • 写在前面本文是一篇CockroachDB官方博客的译文,主要阐述数据库实现串行化隔离的必要性。关于事务隔离性,Ivan曾经在“分布式数据库之事务隔离性”中从理论方面进行过系统的介绍,本文则是从数据库厂商的角度来阐述...
  • 图2 串行口结构框图(图片来自网络)系统总体设计 图2 系统设计线路图硬件电路设计 软件设计 先设置甲乙两块单片机串行口工作方式 ,然后再将初值赋值为250,发送数据,乙机接受数据显示,接受的数据返还甲机,相同...
  • 串行和并行通信在微型计算机中,通信(数据交换)有两种方式:并行通信和串行通信。线交换数据,数据的各位同时进行传送。串行通信——是指计算机与I/O设备之间仅通过一条传输线交换数据,数据的各位是按顺序依次一位...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 397,154
精华内容 158,861
关键字:

串行了