毕业设计片上系统的UART接口控制器IP设计文档格式.docx
《毕业设计片上系统的UART接口控制器IP设计文档格式.docx》由会员分享,可在线阅读,更多相关《毕业设计片上系统的UART接口控制器IP设计文档格式.docx(49页珍藏版)》请在冰豆网上搜索。
UART是当前较广泛使用的串行数据传输协议之一,它允许在串行链路上进行全双工通信,其应用范围遍及计算机外设、工业控制等场合。
现在专用的UART集成电路如8250、8251等既要考虑异步收发功能,又要兼容RS-232C接口设计等功能,比较复杂。
而在实际应用中,往往只需要用到UART的几个基本功能,而使用专用芯片势必会造成资源的浪费以及设备成本的提高。
所以我们可以将所需的UART功能集成到SOC内部,实现与其他SOC数字系统的直接通信,从而简化了整个系统电路,使系统更为灵活、紧凑,性能也更加稳定。
UART16550采用通用的RS-232C串行接口标准,其实现较为简单,最少只需要2条导线即可实现基本通信。
第二章背景
2.1知识背景
一、UART概述及其发展
UART:
(UniversalAsynchronousReceiver/Transmitter),全称是通用异步接收/发送装置,UART是一个并行输入成为串行输出的芯片,用于控制计算机与串行设备,是实现设备之间低速数据通信的标准协议。
通常集成在主板上,多数是16550AFN芯片。
UART作为一种串口因可靠性高、传输距离远、线路简单、串口通信协议的简洁而广泛应用于串行数据通信电路。
其基本原理是1个完整的数据在数据线上依次按比特位传送,虽然传输速率较低,但由于这种传输方式需要的数据线较少,只需用两根线就可以完成数据的收发(一根接收数据,一根发送数据),而且成本低廉,因此特别适合远距离数据传输。
“异步”指不需要额外的时钟线进行数据的同步传输,是一种串行总线接口。
常用的标准通信波特率有9600bps、115200bps等。
UART产生于上个世纪70年代,是第一块大规模集成电路。
1981年的推出的IBMPC采用了8250UART与外设进行数据通信,直到上个世纪末,UART一直是PC中最主要的串行通信接口。
随着高速串行总线USB的出现,USB以其诸多的优点取代了UART成为个人电脑中应用最广泛的串行接口。
而在嵌入式领域,由于UART具有操作简单、工作可靠、抗干扰强、传输距离远(组成485网络可以传输1,200米以上),设计人员普遍认为UART是从CPU或微控制器向系统的其他部分传输数据的最佳方式,因此它们被大量地应用在工业、通信和家电控制等嵌入式领域。
通常MCU/CPU都会自带一个UART串口,但实际应用中一个串口往往不够用,需要进行UART串口扩展。
二、UART控制器
UART控制器完成串行通信功能,控制器在内部总线的操作下,通过对寄存器的读写,完成如波特率设置、串并变换、FIFO控制、流控制及中断控制等,最终将需要发送的并行数据以一定的格式发送;
同时也将外部输入的串口数据流按一定格式进行采集完成数据的接收。
计算机内部采用并行数据,不能直接把数据发到Modem,必须经过UART整理才能进行异步传输,其过程为:
CPU先把准备写入串行设备的数据放到UART的寄存器(临时内存块)中,再通过FIFO(FirstInputFirstOutput,先入先出队列)传送到串行设备,ykl若是没有FIFO,信息将变得杂乱无章,不可能传送到Modem。
三、SOC的基本概念
SOC(系统级芯片SystemonChip),也有称片上系统,狭义的角度上讲,它是信息系统核心的芯片集成,是将系统关键部位集成在一块芯片上;
从广义角度讲,SOC是一个小型系统,是一个产品,是一个有专用目标的集成电路,其中包含完整系统并有嵌入软件的全部内容。
SOC也有译为“系统芯片集成”,意指它是一种技术,用以实现从确定系统功能开始,到软/硬件划分,并完成设计的整个过程。
SOC是在单个芯片上集成一个完整的系统,对所有或部分必要的电子电路进行包分组的技术。
所谓完整的系统一般包括中央处理器(CPU)、存储器、以及外围电路等。
SoC是与其它技术并行发展的,如绝缘硅,它可以提供增强的时钟频率,从而降低微芯片的功耗。
片上系统技术通常应用于小型的,日益复杂的客户电子设备。
例如,声音检测设备的片上系统是在单个芯片上为所有用户提供包括音频接收端、模数转换器(ADC)、微处理器、必要的存储器以及输入输出逻辑控制等设备。
此外系统芯片还应用于单芯片无线产品,诸如蓝牙设备,支持单芯片WLAN和蜂窝电话解决方案。
2.2本课题的研究内容
本课题内容是设计面向SOC的UART接口控制器,具体来说是设计基于NiosII处理器系统的UART接口控制器并在DE2开发板上进行了验证。
2.3论文结构
第一章为绪论
第二章介绍了背景,包括UART、SOC.
第三章介绍UART接口协议
第四章为UART接口控制器的设计与实现
第五章为测试验证
第六章为总结
第三章UART接口协议
UART主要由数据总线接口、控制逻辑、波特率发生器、发送部分和接收部分等组成。
UART内部所实现的功能包括微处理器接口、发送缓冲器、发送移位寄存器、帧产生、奇偶校验、数据接收缓冲器、接收移位寄存器等。
3.1帧格式
UART一帧由起始位、数据位、校验位和停止位组成。
数据逐位传输,示意图如图3-1所示。
异步串口通信协议作为UART的一种,工作原理是将传输数据的每个字符一位接一位地传输。
其中各位的意义如下:
图3-1UART帧格式示意图
一、起始位
UART空闲时(没有数据传输),总线为高电平(逻辑1),当需要数据传输时,首先发送一个“起始位”,起始位为一个低电平“逻辑0”。
二、数据位(资料位)
如图3-1的“2.”所示,紧挨着“起始位”的是数据位,它可以是4、5、6、7或8位,收/发双方在数据开始传输前,需要对双方数据位位数作一致的定义,否则会导致数据的传输错误;
数据位的发送采用低位(LSB)先发送。
通常采用ASCII码。
从最低位开始传送,靠时钟定位。
三、校验位
UART的校验位紧挨着数据位,采用奇/偶位校验方式,数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。
在实际的应用中,校验位可以是奇校验或者偶校验,也可以不包括校验位。
结束位也不一定是1位,还可以是1.5或者是2。
可有可无,是为了验证数据传输的安全性而设置的,在收/发双方进行数据传输前要预设好是否需要校验位,如果需要则是奇校验还是偶校验。
如图2-1的“3.”所示。
奇/偶校验是对数据进行逐位同或/异或运算。
如公式
(1)和公式
(2)所示。
DEVEN=D7⊕D6⊕D5⊕D4⊕D3⊕D2⊕D1⊕D0公式
(1)
DODD=~DEVEN公式
(2)
如对8位数据0x55(01010101b)作偶校验操作,得到的结果为“0”;
作奇校验得到的结果为“1”。
简单而言,偶校验增加一位“0”或“1”,使数据位加上校验位后“1”的个数为偶数;
而奇校验则是使“1”的个数为奇数。
如图3-2所示为奇偶校验RTL(寄存器传输级)示意图。
使用移位寄存器进行逐位操作。
当“LOAD”为逻辑“1”时,加载移位寄存器的数据和初始化校验结果寄存器为逻辑“0”;
之后在“CLK”的每个上升沿进行逐位“异或”运算。
图3-2奇偶校验RTL示意图
四、停止位
UART的帧以停止位作为停止标志,是在数据位(没有校验位)和校验位(有校验位)之后发送1~2位的逻辑“1”。
停止为可以为1位、1.5位和2位。
当发送完停止位之后,UART总线进入空闲。
五、空闲位
空闲指UART总线上没有数据进行传输,表现为发送方输出逻辑“1”,在空闲时,接收方时刻监视UART总线上电平变化,当发现起始化,则进入数据接收状态,直至接收完一帧数据,如果最后没有检测到停止位,则标志帧错误。
六、波特率(Baudrate)
波特率是衡量资料传送速率的指针,由于UART没有同步时钟线,收/发双方如果需要进行正确的数据传输,则要在收/发双方定义一致的位时钟,位时钟可以理解为UART总线一个位所占用的时间,即“波特率”。
在定义上,收/发双方的波特率可以是随意的,只需要保持一致,如双方都是1000bps,但是,这不能兼容现有常用的设备,兼容性差。
所以在工程应用中,常用一些特定的波特率真,如4800ps、9600bps或115200bps等。
3.2示例
因为UART的帧格式是可变,以下以几个示例,形象地描述UART的不同设置下的帧格式。
一、常用帧格式
如图3-3所示为8位数据位、无校验位、1位停止位的帧格式示意图,一帧共有10位。
发送的数据为0xA5。
图3-3常用帧格式
二、偶校验
如图3-4所示为8位数据位、偶校验、1位停止位的帧格式示意图。
每帧共有11位。
发送的数据为0xA5,则偶校验结果为“0”。
当加个校验位后,可以看出,“1”的个数为偶数。
图3-4带偶校验帧格式
三、奇校验
如图3-5所示为8位数据位、奇校验、1位停止位的帧格式示意图。
发送的数据为0xA5,则奇校验结果为“1”。
当加个校验位后,可以看出,“1”的个数为奇数。
图3-5带奇校验帧格式
3.3物理接口
UART的物理接口可以是RS-232、RS-485和IrDA红外线等。
其中RS-232是最为大家容易接触的,在2006年之前是大部分PC机的标准接口,早期电话线上网就是利用RS-232连接数PC机和Modem。
一、RS-232连接器
RS-232的连接器常用的是DB-9,其连接器示意图如图3-6所示,为九针连接器。
对于常用的简单应用,使用到的有三根线:
RxD、TxD和GND。
图3-6DB-9连接器示意图
实物图如图3-7所示。
图3-7DB-9实物图
二、RS-232电气特性
RS-232规定说明了RS-323C标准对逻辑电平的定义。
对于数据(信息码):
逻辑“1”(传号)的电平低于-3V,逻辑“0”(空号)的电平高于+3V;
对于控制信号;
接通状态(ON)即信号有效的电平高于+3V,断开状态(OFF)即信号无效的电平低于-3V,也就是当传输电平的绝对值大于3V时,电路可以有效地检查出来,介于-3~+3V之间的电压无意义,低于-15V或高于+15V的电压也认为无意义,因此,实际工作时,应保证电平在±
(3~15)V之间。
在TxD和RxD上:
逻辑“1”为-3V~-15V;
逻辑“0”为+3~+15V。
在RTS、CTS、DSR、DTR和DCD等控制线上:
信号有效(接通,ON状态,正电压)=+3V~+15V;
信号无效(断开,OFF状态,负电压)=-3V~-15V。
三、RS-232电平转换电路
由于RS-232的电气特性和MCU等输出的电气特性不一致,所以对于TTL电平的MCU,使用RS-232连接器(如和PC机通信),需要使用电平转换电路,通常使用集成电路(IC)完成电平转换,常用的IC有MAX232等,当然还有其它公司生产的IC,如SP232等,常以232作为标识。
如图3-8所示,是使用MAX232作为转换IC的电路图。
图3-8电平转换电路
四、实际应用
RS-232
RS-232在实际应用一般用于点对点的数据传输,当然在硬件和软件上加上一些手段,可以用于多机通信,但应用不多。
在通信速率低于20kb/s时,RS-232C所直接连接的最大物理距离为15m。
RS-485
RS-485在工业应用现场应用比较广泛,常使用单工通信组成一主多从的通信网络,使用双绞线连接多台设备,使用差分信号传输数据,所以抗共模干扰能力比RS-232强,共通信距离可以超过1Km。
第四章UART接口控制器的设计与实现
4.1UART接口控制器核(Core)的设计与实现
UART采用模块化、层次化的设计思想,全部设计都采用VerilogHDL来实现,其组成框图如图4-1所示。
整个UART由串行数据发送模块、串行数据接收模块、接收和发送FIFO、总线接口逻辑、寄存器和控制逻辑构成。
串行发送模块的接收完成并/串及串/并的转换;
发送和接收FIFO用于缓存发送和接收的数据;
总线逻辑用于连接UARTIP内部总线和LPC模块接口;
寄存器和控制逻辑实现UART内部所有数据的收发、控制和状态寄存器、内部中断的控制及波特率信号的产生等。
总线接口单元主要完成寄存器访问。
因为总线是由LPC总线模块产生。
在这里需要为LPC总线模块产生lpcack信号。
因为内部寄存器操作相当快,我们可以让lpcack在读写信号有效后下一时钟周期就有效,这样可以简化设计。
在UART中用到两个FIFO,一个发送FIFO,一个接收FIFO,均为16个字节深度,8位宽。
图4-1UART的模块功能框图
异步传输方式指收发两端各自有相互独立的定位时钟,收方利用数据本身来进行同步的传输方式。
数据流按照一定的帧格式串行发送,一个完整的数据帧由起始位、数据位、校验位、结束位构成,完成一个字节(8位)数据的传输。
图4-2UART顶层框图
设计采用经典的自上以下的分层次结构
由图4-2UART的顶层框图获知,本设计的UART分为以下三个模块(module):
一、波特率发生器divider
这个模块用于为UART的收/发器提供时钟,这个时钟为UART的波特率的16倍频,即如果波特率要求为9600bps时,该模块输出的时钟为9600Hz×
16=153600Hz。
输出时钟需要可配置(UBRRH、UBRRL)。
波特率的产生由一个16位的计数器来产生,计数器的初值由波特率设置寄存器的值来决定,当计数器计数到0时产生一个enable信号,该信号的产生频率为波特率的16倍。
enable信号被用来控制接收和发送模块状态机的运行。
从而达到控制发流数据位时间的目的。
波特率发生器实现波特率的变换。
利用外部时钟信号产生一个所需波特率l6倍的波特率时钟,用来控制UART的接收与发送。
接收模块是用于接收串行信号,并将其转化为并行数据;
而发送模块则将准备输出的并行数据按照UART的帧格式转化为串行数据输出。
波特率发生器实际上是一个分频器。
主要是产生和.RS-232通信所采用的波特率同步的时钟。
由于串行数据帧与接收数据时钟是异步的,所以在UART的接收端在什么时刻将数据移入寄存器.怎样选择可靠的采样点是非常关键的。
一般采用高速时钟对串行数据采样是非常有效的方法。
在实际设计中,一般最大选择16倍于波特率的时钟频率。
实现波特率时钟的基本思路就是设计一个计数器,该计数器工作在速度很高的系统时钟下,通过总线写入不同的数值到波特率发生器保持寄存器中,然后用计数器的方式生成所需要的各种波特率就能得到所需的波特率时钟.
,
图4-3波特率发生器模块图
图4-4波特率发生器电路图
波特率发生器代码
二、接收器rxd
接收模块是整个UART的设计的重点,其主要功能是检测数据的起始位,并对接收的数据进行串并转换,并将接收好的数据储存等待微机处理。
由于串行数据帧与接收数据时钟是异步的,接收功能实现的关键是接收器与每个接收字符同步。
要保证异步通信的双方准确无误地交换信息,必须有效控制采集通信线路上的电平信号的时机。
由异步串行通信的特点可知,接收同步是通过低电平起始位实现的。
而为了保证采样的正确性,采样在数据位的中间进行,并且接收单元采样数据的频率与发送单元发送数据的频率相同,是波特率时钟周期的l6倍,这样可以有效地降低由于时钟不匹配而导致的误采样。
接收模块的设计主要由状态机实现其核心功能,采用独热编码方式,虽然独热编码多用了两个触发器,但所用组合电路可节省一些.使电路的速度和可靠性有显著提高161。
控制接收器的起始/停止位检测,接收数据的计数,移位寄存的功能。
接收器时刻监视UART总线的RXD线的电平,当检测到起始位,接收器启动接收状态机,根据寄存器(UCSRB、UCSRC)的设定,解析RXD线的电平,当完成一个字节接收,输出接收到的数据和线状态。
接收器的设计主要是围绕“有限状态机”而进行。
图4-5接收器模块图
图4-6接收器模块电路图
接收器部分代码
串行数据接收器用于检测串行数据的开始位,并在特定的时刻将串行总线上的串行数据进行采样,同时对数据流的帧格式进行检查,最后将转换的并行数据输出。
因为输入的串行数据信号与内部时钟是异步的,因此,串行信号实际是一个跨时钟域的信号,为了保证信号被可靠的采样并避免亚稳态情况,我们采用了比较稳妥的处理方法,那就是对输入的外部串行数据信号进行了两次采样。
采用以下verilog描述可以实现对输入信号的两次采样。
always@(posedgeclk)
begin
sig_stagel<
:
=siga;
sig_out<
sig_stagel;
end
同串行发送模块一样,我们采用有限状态机来描述整个串行数据的接收过程。
按照接收串行数据的顺序,整个过程分为空闲状态(idle)、接收开始位状态(rec—start)、接收准备状态(rec--prepare)、接收数据状态(rec—bit)、接收数据完毕状态(rec—end)、接收核验位状(rec_parity)、校验位计算状态(calc_parity)、校验位检查状态(check_parity)、等待(wait)、接收停止位状态(rec_stop)、保存数据状态(push)。
整个状态转移见下图。
图4-7串行数据接收状态转移
外部复位使状态从idle开始。
空闲状态(idle):
在此状态,不断检测UART使能和串行输入信号的状态。
如果串行输入信号出现由高到低的电平变化并且UART使能有效,则将采样计数器置为14,并进入下一状态(rex_start)。
接收开始位状态(rex_start):
在此状态,状态机等待7个时钟周期(也就是半个波特率的时间),然后重新对串行输入信号进行采样,如果仍为低,则认为收到的开始位有效,马上进入接收准备状态(rex);
否则认为数据总线上先前检测到的低电平为干扰,开始位无效,重新返回到空闲状态。
接收准备状态(rex_prepare):
在此状态中,根据LCR寄存器中的值算出即将接收的数据帧中数据位的个数,然后等待采样计数器被减至0,随即转入接收数据状态(rex_bit),同时将采样计数器再次置为14。
接收数据状态(rec_bit):
当采样计数器计到7时,接收串行数据线上的数据位,并放入移位寄存器中,并将数据位个数计数器减1。
当采样计数器计到0时,立刻转入接收数据完毕状态(rex_end)。
接收数据完毕状态(rex_end):
在此状态中,如果判断到数据位数计数器已经为0,表明数据字已经接收完毕,这时要判断帧中是否有校验位,如果没有校验位,那么接下来将会是停止位的接收(rex_stop);
如果有核验位的话,下一状态将会是接收核验位状态(rexparity)。
而如果发现数据位还没有接收完时,将会回到接收数据状态(rexbit)继续进行数据位的获取。
接收校验位状态(rex_parity):
在采样计数器计到7时开始对校验位进行获取。
随后进入校验位计算状态(calc_parity)。
校验位计算状态(calc):
在该状态,将根据接收的数及检验位一起parity)
进行检验各计算。
随后进入校验位检查状态(check_parity)。
校验位检查状态(check_parity):
根据寄存器的核验位设置及接收数据的校
验和来判断是否出现校验错。
随后进入等待(wait)状态。
等待(wait):
等待采样计数器被减到0。
此时可以进入接收停止位状态(rec_stop)。
接收停止位状态(rex_stop):
仍然是在第7个采样时钟位置,对串行数据采样获得停止位,如果发现串行输入数据为0,那么停止位不正常,将把frameerror信号置为有效。
在采样时钟计为0时进入保存数据状态(push)。
保存数据状态(push):
在此状态中,将push信号置为有效,同时将接收到的数据及状态位压入FIFO中。
不过如果发现检测到是break状态,那么压入的数据将会是0。
状态然后将再次回到空闲(idle)状态。
完成一次数据帧的接收。
三、发送器txd
发送模块的设计相对简单。
其功能是将要发送的并行数据转换成串行数据.并且在输出的串行数据流中加入起始位和停止位。
发送器首先将要发送的8位数据寄存,并在最低位后添加起始‘O’.在最高位前添加停止位‘l’,组成10位要发送的数据.然后根据UART内核模块的计数值将相应的数据送人移位寄存器输入端。
UART内核模块输出的计数值是从0依次计到9。
即先将要发送数据的最低位送人移位寄存器。
发送器是监视EBI总线,当检测需要发送一个字节时,发送器启动发送