北邮设计一:异步串行通信控制器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计一:异步串行通信控制器
一、目的:
●掌握状态机的原理与设计方法;
●了解异步通信的原理和特点;
●掌握异步通信接口的设计方法。
二、异步通信原理简介:
我们主要以接收端为例来说明异步通信的工作原理,发送端可依此类推。异步通信的特点是数据在线路上的传输是不连续的,线路上数据是以一个字符为单位来传输的。异步传输时,各个字符可以是连续传输,也可以是间隔传输,这完全由发送方根据需要来决定。另外,在异步传输时,同步时钟信号并不传送到接收端,即收发双方各用自己的时钟来控制发送和接收。
由于字符的发送是随机进行的,因此,对于接收端来说就有一个判断何时有字符来,何时是新的一个字符开始的问题。因此,在异步通信时,对字符必须规定统一的格式。
异步信息传输格式
一个字符通常由四部分组成:起始位、数据位、奇偶校验位和停止位。一个字符由起始位开始,停止位结束。奇偶校验位只占一位,为了简化分析我们暂且规定不用奇偶校验位。
起始位为0信号,占用一位,来通知接收端一个新的字符开始来到。线路上不传输字符时,应保持为1。接收端不断检测线路的状态,若连续为1以后又开始测到一个0,就知道是发来一个新字符,马上应准备接收。字符的起始位还被用来同步接收端的时钟,以保证以后的接收能正确进行。接收时钟信号RXC的频率是数据率的N倍,一般N=8,16,32,64等。由于异步通信双方各用自己的时钟源,若是时钟频率等于波特率,则频率稍有偏差便会产生接收误差,因此,采用较高频率的时钟,就能保证正确地捕获到信号。
起始位后面紧接着的是数据位,它可以是5位、6位、7位和8位。我们这里规定采用8位的数据位。注意在发送时,总是低位先发送(最低位LSB,最
高位MSB)。
停止位用来表征字符的结束,它一定是高电平1。停止位可以是1位或2位。接收端收到停止位时,就表示这一字符的结束。同时,也为接收下一个字符做好准备,即只要再收到0就是新字符的起始位。若停止位以后不是紧接着传输下一个字符,则让线路上保持位1。
DATA …...
停止位
RXC ……………..
异步信息传输格式示意图
三、模块设计:
1. 接收模块:
①设计:
同步原理
比如,N=8。在‘起始位’前沿(下降沿),启动接收时钟从0计数,当计到4时(差不多在信息位的中间),输出‘采样时钟’SCLK。此后,每8个RXC,输出一个SCLK,以对接收数据RXD进行串-并变换,直到收到‘停止位’。
若在应该是停止位的地方收到逻辑‘0’,则表示出现‘帧错误’——FE(Frame Error)。应等待下一个高电平‘1’,把它作为停止位继续接收。这样就可以实现‘帧对准’(Frame Align)。
我们以接收8位串行数据为例,串——并变换至少需要9级移位寄存器,最后一级作为一帧数据完整接收的指示信号so来用。这里还需要一个8位寄存器缓存接收数据。其框图如下:
SCLK
接收端系统框图
其中,LDSR是接收移位寄存器置初始值的信号。在收到‘起始位’的前沿时,它把移位寄存器置成全’1’,这样,当‘起始位’移到so后,就知道整个的接收字符全部进入了移位寄存器。这样就可以省去‘接收位计数器’(否则,应该使用位计数,来指示‘接收完成’)。SCLK是采样(移位)时钟,(它应处在RXD每位数据的中间位置)。LDRB是接收缓存的‘装入’命令,它把移位寄存器的接收数据装入到缓存,以便接收设备把它取走。RE是接收设备的‘取数据’命令,它是低电平有效。
●接收双缓冲,包括‘接收移位寄存器RS(Rx Shifter)’和‘接收缓冲器RB
(Rx Buffer)’;
●RBF指示‘接收缓冲器(RB)’的状态:RBF=1,表示RB内的数据有效,
0表示无效;
●应有状态寄存器,指示FE,PE,OE,RBF,TBE等。
若ERBF=1,且RBF=1,则可产生‘接收中断’。读RB可使RBF=0。
接收逻辑对接收字符进行‘奇校验’,若不合规律,则使PE置1;否则,置0。
若发生FE,则FE置1,指示‘起止格式错’。
若下一次产生‘LDRB’时,RBF=1,则产生OE=1,表示‘接收字符丢失’。
当读接收数据后,使RBF清零,而读状态寄存器后,使OE,PE,FE清零。
要一个设备来产生
LDSR,SCLK,LDRB
及其它一些标志信号
FE等,这个设备称为
‘接收控制器’,它的
特点是:
●它按我们预定
的原理工作,
自动实现‘位
同步’和‘帧
对准’;
●依据不同的外
部条件,进入
不同状态,不
同状态完成不
同的动作。
接收控制器实际
是状态机,关于状态机
最准确的描述莫过于
‘流程图’。
②代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY RECEIVE IS--实体RECEIVE
PORT(RXD,RE,RXC,RESET,RESTATE: IN STD_LOGIC;--输入:数据序列,读信号,时钟,初始化,状态寄存器复位信号
FE,RBF,PE,OE: OUT STD_LOGIC;--输出
DOUT: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));--序列并行输出
END RECEIVE;
ARCHITECTURE A OF RECEIVE IS
SIGNAL SCLK,LDSR,LDRB: STD_LOGIC;--控制移位寄存器时钟、控制移位寄存器载入信号、接收缓存器载入信号
TYPE STATE_TYPE IS(S0,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13);--状态机信号定义SIGNAL STATE:STATE_TYPE;--状态及信号
SIGNAL RS: STD_LOGIC_VECTOR(8 DOWNTO 0);--移位寄存器9位SIGNAL RB: STD_LOGIC_VECTOR(7 DOWNTO 0);--接收缓存器8位SIGNAL RBF_TMP,PE_TMP,OE_TMP,FE_TMP: STD_LOGIC;
BEGIN
P1:PROCESS(RXC)--状态机(接收控制器)进程
BEGIN
IF RESET='1' THEN--初始化
STATE<=S0;
ELSIF (RXC'EVENT AND RXC='1') THEN--时钟上升沿