uart16550IP核的设计与FPGA的实现.docx
- 文档编号:14867360
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:35
- 大小:188.05KB
uart16550IP核的设计与FPGA的实现.docx
《uart16550IP核的设计与FPGA的实现.docx》由会员分享,可在线阅读,更多相关《uart16550IP核的设计与FPGA的实现.docx(35页珍藏版)》请在冰点文库上搜索。
uart16550IP核的设计与FPGA的实现
[键入文字]
[键入文字]
uart16550IP核的设计与FPGA的实现
串行通信在数字信息系统以及控制系统中得到了广泛的应用。
针对传统UART8250和UART16450传输速率低、稳定性相对较差,满足不了PC机通信速率的状况,介绍了高速异步串口UART16550的工作原理与设计实现,并且给出在现场可编程门阵列FPGA上的实现与验证仿真。
这项设计对于片上系统之间以及与PC机之间的串行数据传输有了很大程度的改善。
关键词:
UART16550,串口通信,FIFO,FPGA。
第一章绪论
1-1引言
自第三次科技革命以來计算机技术飞速发展,计算机网络技术和数字通信技术的日益普及。
由电子工业协会所制定的异步传输标准接口RS-232
(ANSI/EIA-232标准)成为IBM-PC及其兼容机上的串行连接标准。
RS-232串行通信接口被内置到许多计算机系统中作为外围设备接口,如鼠标、打印机或者Modem,同时也可以连接工业仪器仪表。
基于RS-232串行通讯标准,异步串行通信IP核在连接嵌入式系统和SOC系统中不可或缺。
UART是用于实现CPU与串行设备通信的芯片。
其将从外部传输來的串行数据去除起始位、停止位和校验位转化为字节使供内部并行器件使用,如处理由键盘或鼠标发出的中断信号。
反过來内部待发送的数据通过加入起始位、校验位和停止位并进行串并行转换也可以向外发送数据。
通过UART我们可以实现计算机内部与外部串行设备的同步管理问题。
常见的UART有INS8250和PC16450,PC16650,PC16750而在这里我们要介绍的16550优势在于它可以在计算机需要处理数据前在其FIFO内存储16字节数据,减少数据发送的次数,从而更有效的利用CPU,从而提高系统的整体性能。
随着FPGA技术的迅速发展和广泛应用,我们常需要将FPGA与其他数字系统进行串行通信。
专用的UART集成电路如8250、8251等既要考虑异步收发功能乂要兼容RS-232C接口等设计过于繁琐。
而实际中我们往往只是用UART的一些基本功能,在这里我们通过将所需的UART功能集成到FPGA内部,实现FPGA与其他数字系统的直接通信,从而简化整个系统电路,使系统更为灵活紧凑,性能也更加稳定。
本实验基于通用FPGA开发软件quatusii9.0实现UART16550的模块化编程和波形仿真。
VerilogHDL语言最初是于1983年由GatewayDesignAutomation公司(后被Cadence收购)为其模拟器产品开发的硬件建模语言,后成为IEEE的标准语言。
能形象化地抽象表示电路的行为和结构,支持硬件的设计、验证、综合和测试。
在此我们釆用VerilogHDL语言來进行设计。
1.2历史
在计算机出现之前就己经存在早期的串口设备(工控测量设备,电传打字机等),为了连接这些串口EIA制定了RS232标准,采用DB25接插件,支持同步和异步串口。
设计的D型接口有效的防止插反带來的不便。
这一标准化带來了许多便利。
随着计算机的出现,大型的生产商更倾向于新的体积小、成本低的DB9。
DB9是通过去除DB25中未使用的和支持同步模式的引脚得來。
但最初情况很混乱,因为DB9只定义了信号却没有定义信号和引脚的关系,制造厂商只能自行定义。
随着IBM的计算机成为工业标准,DB9逐渐统一于IBM的定义上。
随着计算机的普及,许多非RS232的串口也要接入PC端。
但给每一个新出现的串口增加一个新的I/O口也不现实。
因此将RS232串口和非RS232串口都通过RS232口接入的UART产生。
1981年,IBMPC主板上主要使用8250UART与外围设备通信。
几年后,出现716450UART,其速度有明显加快。
但是PC机的中断和软件响应时间仍然明显不足。
因此,出现了一种解决办法就是在UART中增加硬件缓存,其代表性产品就是16550o其内部增加了2个16字节的FIFOo后来随着FIFO字节的增加出现了32字节FIFO的16C650和64字节FIFO的16C750。
现如今我们主要使用的仍然是UART16550o
1.3串行并行、异步同步
串行是只有一根数据线,每当一个时钟脉冲到來只能发送一位数据。
并行有多个数据线,在每个时钟脉冲下可以发送多个数据位(n位并行口就可以发送n位)。
现如今主流是串行,因为在高速状态下,并行口的数据线之间串扰,而且并行口需要信号数据同时发送同时接收,任何一根数据线延迟均会引起问题。
而串行不存在这些并且串行可以釆用低压差分信号来大大提高抗干扰能力。
正因为如此串行可以将速度做到很高。
同步就是指发送发出数据后等待接收方返回响应后才继续发送下一个数据。
异步是发送方发送完数据后直接开始发送下一数据无需得到接收方响应。
第二章UART的基本结构和应用
2.1UART16550的基本结构
如图2.1所示,UART16550的基本结构由七部分组成分别为CPU接口模块、
波特率发生器模块、FIFO控制器模块、发送FIFO模块、接收FIFO模块和发送/接受模块。
CPLJ
图2.1UART16550基本结构图
下面将介绍整个UART工作原理。
CPU通过CPU接口模块设定整个UART初始状态,如是奇校验还是偶校验、波特率数值和停止位的位数。
波特率发生器分频出设定好的波特率并以设定的波特率控制发送和接收模块以达到发送和接收的同步。
发送数据时CPU将待发送的并行数据输入发送FIFO,在发送FIFO中有16字节的缓存以减少发送数据时CPU中断次数。
发送模块将并行数据转化为串行数据并在数据位前加上起始位后面加上奇偶校验位和停止位,通过串行发送方式发送给外设。
接收模块会时刻监视串行输入端口,一旦检测到电平转换(即起始位)接收模块会马上进行状态判断并接收数据,通过奇偶校验和启停位检测有效的排除掉错误数据,然后将启停位和校验位去除,剩余的数据位发送到发送FIFO,并通知CPU在CPU接口模块接收的数据,最后数据就被传输至中央处理区。
2.2串行通讯原理
图2.2异步串行数据传输格式
UART16550采用国际通用的RS-232C串行接口标准(IEEE标准),至少仅需2根导线(RX/TX)即可实现数据的发送与接收。
在RS-232C标准中规定了逻辑1即高电平为相对于地3-25V,逻辑0低电平为相对于地-3--25V。
每帧数据由起始位、数据位、奇偶校验位和停止位组成。
其中起始位为低电平占用1位;数据位5-8位不等发送和接收数据时均是从最低位开始的(如数据a其二进制位1100001接收发送顺序为1000011);奇偶校验位有奇校验、偶校验或者无校验;停止位为高电平有1位、1.5位、2位3种。
当无数据发送时,发送和接受引脚均保持高电平。
2.3功能与特征
UART16550是美国国家半导体公司生产的一种为pc配套的异步串口通信接口专用芯片主要功能有:
1.具有全双工、双缓冲器发送器和接收器。
全双工也就是仅需要两条信号线(RXD和TXD)即可完成互相通信,接收发送互不干扰,从而大大降低传送费用。
2.是一种串行异步通信接口(UART),不具有同步通信功能。
3.通讯波特率为50-115200bit/s,由编程决定。
4.异步通信格式可通过编程选择。
5.支持内部回环模式,具有奇偶校验、帧出和溢出错误等校验,片内具有优先级中断控制逻辑。
其主要特征有:
1.wishbone接口有2中可选择的交互模式分别为32-bit和8-bit。
2.FIFO部分只进行操作。
3.注册级别和功能兼容于NS16550A(不是16450)。
4.调试接口的交互模式为32-bito
现如今UART现在包含在微控制器中用于电脑和外围设备的串行端口。
第三章UART16550IP核的设计
3.1UART16550的设计思路
数据的发送,当发送模块接收到发送FIFO的数据后,发送模块自动添加由CPU设定好的配置寄存器内设定好的起始位、停止位和奇偶校验位。
通过移位寄存器通过串口通讯方式打包传送给接受仪器。
当无数据时发送端保持高电平lo接受是发送的逆序过程,接受时将去除起始位、停止位和奇偶校验位,并进行校验若无错误将把数据发送至接收FIFO传输给CPUo在此过程中FIFO对数据进行缓存,大大的减少了数据发送的次数提高了CPU的运行效率。
而在此期间CPU对波特率发生器的波特率进行预设以使串口两端设备在同一波特率下完成数据的发送和接收。
数据帧如图3.1
数据位
◄
—>
起始位
DO
D1
D2
D3
D7
校验位檸止位
空闲
波特率通常为9600b/so最高可为115200b/so
图3.1数据帧格式
当空闲时总线上为高电平。
开始数据发送首先为低电平的起始位当接收器接收到低电平的起始位时即开始逐位数据接收。
然后发送的是数据位,数据位可以是5-8位在此之前收发双方要约定好,数据位从数据低位LSB到数据高位MSB逐位发送。
奇偶校验位是用来为了保证数据远距离传输的安全可靠,这个校验位在此之前需要约定是否加入,奇偶校验就是在数据位后面加入低电平0或高电平1使得数据位中的1+校验位中的1总和个数为奇数或偶数,奇数则为奇校验,偶数则为偶校验。
停止位为高电平为数不固定有1位、1.5位和2位。
波特率是单位时间内传送的二进制数据的位数,单位为b/s,也叫数据位移。
波特率与收发时钟频率关系为:
收发时钟频率二波特率XN
N可取&16,32和64这个数值在一开始硬件设计时就已设定好。
一般选择16以保证速度和稳定性,通过2个8位的数据寄存器组合成16位分频寄存器实现系统频率的分频。
3.2UART模块仿真
将一个完整的硬件从功能上分为几大模块,通过对各个模块分别进行建模、仿真以达到各个模块功能实现任务的分工并最终在系统级进行综合來实现整个硬件功能。
这是现如今构建复杂数字系统的主要手段。
这一方式大大提高了数字系统设计效率和设计质量。
图3.2UART系统模块结构图
如上为系统级模块关系左边为CPU,右边为外部串行设备。
CPU接口模块实现CART与CPU数据发送。
发送/接收模块实现与外部串行设备的数据发送。
收发FIFO提高了CPU工作效率而波特发生模块解决了接收与发送可能不同步的问题(收发设备之间的时钟积累)。
3.3CPU接口模块
CPU接口模块主要用于寄存器配置、UART状态读取和CPU指令解读等功能。
通过3位地址线和8位数据线,CPU对波特率进行预先设定,以保证串口两端在同一波特率下完成发送和接收。
而且起到连接的作用,将CPU发送來的5-8位数据发送到发送模块以及将接收模块接收到的数据传送给CPU进行数据处理。
CPU接口模块由一系列控制和状态寄存器组成,包括IIR(InterruptIDRegister)中断寄存器、THR(TransmitHoldRegister)发送保持寄存器、LSR(LineStatusRegister)线状态寄存器、IER(InterruptEnableRegister)中断使能寄存器、RBR(ReceiverBufferRegister)接收缓冲寄存器、LCR(LineControlRegister)线控制寄存器、SCR(ScratchpadRegister)临时寄存器和FCR(FIFOControlRegister)FIFO控制寄存器。
可编程的UART16550使用前我们必须先要对控制器进行配置,设定包括波特率、奇偶校验、数据位数、FIFO的控制和停止位数的数值。
没有经过设定的UART16550将无法进行正常的工作。
3.4波特率发生模块
波特率发生器主要功能就是从输入时钟转换出需要的波特率clko波特率发生器实际就是一个分频器,通过设计一个计数器,使工作频率很高的系统时钟分频为所需的波特率时钟。
之所以需要设定这样一个时钟是因为收发设备间的时钟会积累导致接收数据不正确。
而波特率发生器就是专门产生一个远远高于波特率的本地时钟信号对输入RXD不断采样以保证接收器和发送器保持同步。
波特率发生器并不产生波特率时钟,其波特率二系统时钟频率/波特率因子。
如假设系统时钟频率为10MHz,需要设计波特率为9600bps射频模块,这所需的波特率因子二10MHz/9600Hz二1042。
波特率因子是一个22位数有16位整数和6位小数。
波特率发生器通过使用带有小数的除法器,对高频系统时钟进行分频,可以产生所有标准波特率,并十分精确。
3.5FIFO模块
UART16550带有2个8位宽、16字节的异步FIFO控制,分别为发送FIFO和接受FIFOoFIFO控制器从CPU接口读取信息、配置发送/接收FIFO并能通过CPU接口将数据快速传递给CPUo
FIFO解决了由于数据逐位传递中断过于频繁导致CPU工作效率低下的问题。
如果没有FIFO每发送一个数据都要中断处理一次,而通过添加FIFO可连续收发若干个数据,至多14个,一次中断克进行一并处理大大地提高了工作效率。
并且完全无需担心FIFO机制可能导致数据來不及处理和数据丢失的问题。
只要初始化配置好UART,FIFO会自己解决所有问题。
发送FIFO工作:
发送是一个相对较为缓慢的过程,在发送的同时数据会填充入发送FIFO里,发送FIFO会将数据一个一个发送出去,直到发送完毕与此同时发送完毕的数据会自动删除。
在此无须担心因为数据填充满导致数据丢失,在
此以波特率为9600Hz为例,等待出现一个空位时间在1ms左右十分短暂。
接收FIFO工作:
当接受模块接收到数据,就会将数据传送给接收FIFO在接收FIFO中填充数据。
程序及时取走这些数据同时FIFO里的数据自动删除。
3.6UART发送模块
发送原理:
空闲时发送模块会以逻辑1(高电平)表示暂不发送数据的空闲状态。
当发送模块接收到复位信号时马上进入就绪发送状态,并读取来自CPU的8位并行数据到寄存器内。
先输出逻辑0(低电平)作为起始位,当下一个串行通信要求的波特率时钟上升沿到來开始发送,每个位寄存器从高到低将数据发送到TXD端,经过8个单位时钟后确保8位数据完全发送完毕,此时8位并行数据转换为8位串行数据,最后在输出奇偶校验位和一到两位的停止位逻辑1(高电平),数据发送完成。
位数
起始位0
5-8位
9
10-11
操作
发送低电平
发送数据位
发送奇偶校验位
发送停止位高
电平
图3.3数据发送顺序
简述:
1、信号线上只有两种状态,分别以逻辑1和逻辑0來表示。
在空闲状态是数据线保持逻辑1。
2、起始位(startbit)占一位总是在每一帧的开始以逻辑0表示数据传输即将开始。
3、数据位(databits)有5-8位从低位(LSB)到高位(MSB)依次发送。
4、校验位(paritybit)能在一定程度上检测传输错误排除干扰,担当出现双位错时将无法检测出。
5、停止位在每帧的末尾表示数据传输结束有1位、1.5位和2位。
6、从起始位到停止位之间的一组数据成为一帧。
UART数据发送原理如图所示
图3.4发送流程图
3.7UART接收模块
接收模块的作用是接收串行设备输入的数据。
接收模块始终监视总线RXD端的电平状态。
当检测到总线RXD端低电平时接收模块接收并解析RXD线上的电平得到传输数据并最终发送给CPU。
接收数据时我们用波特率时钟(保证接收发送同步)上升沿计数,每接受一位计数一次。
逐位接收完数据后,开始接收奇偶校验位和停止位,并进行校验和判断。
确定无误后接收模块去除起始位、奇偶校验位和停止位并将串行数据转换为8位的并行数据并将并行数据送入接收FIFO并通知CPU來取数据。
计数器
0
5-8
9-10
11
操作
数据起始位检测
数据位接
匚攵
进行奇偶
校验
接收完
成?
图3.5UART数据接收顺序
UART的接收状态一共有4个:
1、stateO起始位检测:
当CART接收到起始位,也就是接收到从RX发送來的输入信号,由逻辑1到逻辑Oo一旦检测到起始位,就对采样时钟上升沿计数当计数到8(确保在起始位中点),转入下一状态。
2、statel数据接收处理和串并行转换:
对clk.rev±升沿计数,当计数到16时对数据釆样。
然后每个16位倍频釆样一位串行数据,同时进行串并转换,当检测到己接受8位时,进入下一状态。
3、state2奇偶校验:
对接收到的数据进行奇偶校验,奇偶校验成功后进入下一状态。
4、state3数据帧判断:
对该帧进行校验,检测若为高电平逻辑1则结束该帧。
UART发送原理如下图:
图3.6UART发送原理图
第四章主要模块的程序及仿真结果
4.1UART主体程序
将大规模电路的设计从系统级开始,划分为若干可操作模块进行仿真并在系统级进行组合。
UART的系统模块可以划分为4大部分波特率发生器、控制器、接收器和发送器。
其结构图如图4.1所示。
图4.1UART结构图
主要模块:
read接收模块send发送模块counters控制模块
CLK时钟计数器模块clear.check寄存器清零选择模块
主要引脚及功能:
read:
串行输入send:
串行输出data_in:
并行输入
data_out:
并行输出cs:
通知CPU接收数据位ks:
通知CPU发送准备位reset:
重启输入
state:
UART状态输入elk:
48M时钟输入
主体程序:
moduleuart(read,send,cs,ks,reset,state,elk,dat_in,dat_out);inputread,elk,reset,state;
//read为串行输入,elk为时钟输入48MHZ,reset为重启键,state为UART状态控制CPU控制模块
input[7:
0]dat_in;//8位并行数据输入
outputsend,cs,ks;
//send为串行输出,cs为通知CPU接收数据位,ks为通知CPU发送准备位output[7:
0]dat_out;//8位并行数据输出
wireclear,clk_enable,read_enable,clear3,send_enable,clear4,tl;//连续赋值
wire[7:
0]counters,dat_in;
readul(dat_out,cs,read,reset,clk_enable,elk,
read_enable,clear3,counters);//接收数据module
sendu2(dat_in,ks,send,reset,clk_enable,elk,
send_enable,clear4,counters);//发送数据module
elku3(elk,tl,clk_enable);〃时钟计数器模块
countersu4
(read_enable,send_enable,elk,state,11,read,counters,reset,clear);
checkuo(state,clear3,clear4,clear,clk_enable3,clk_enable4,clk_enable);//控制模块
endmodule/////////////////////////////////////////////////////////////////moduleread(dat_out,cs,read,reset,clk_enable3,
elk,read_enable,clear3,counters);//接4攵数扌折module
inputread_enable:
inputread,reset,clk;
//read为串行输入,read_control为时钟控制,reset为重启键
input[7:
0]counters;
outputcs,clear3,clk_enable3;//cs为通知epu读取数据位
output[7:
0]dat_out;//8位并行数据输出
endmodule/////////////////////////////////////////////////////////////////modulesend(dat_in,ks,send,reset,clk_enable4,elk,
send_enable,clear4,counters);//发送数据module
input[7:
0]dat_in,counters;
inputreset,elk,send_enable;
outputsend,clk_enable4,clear4,ks;//ks为通知cpu发送准备位endmodule
/////////////////////////////////////////////////////////////////modulecounters(read_enable,send_enable,elk,
state,tl,read,counters,reset,clear);//控制器module
inputelk,state,11,read,reset,clear;//state为uart状态输入,
//clear为程序计数寄存器清零控制位
output[7:
0]counters;
outputread_enable,send_enable;
endmodule
/////////////////////////////////////////////////////////////////moduleclk(clk,tl,clk_enable);//时钟计数器模块
inputelk,clk_enable:
outputt1:
endmodule
/////////////////////////////////////////////////////////////////modulecheck(state,clear3,clear4,clear,clk_enable3,
clk_enable4,clk_enable):
//clear选择模块
inputstate,clear3,clear4,clk_enable3,clk_enable4:
outputclear,clk_enable;
assignc1ear=state?
c1ear4:
clear3;
assignc1k_enab1e==state?
c1k_enab1e4:
clk_enable3;
endmodule
此处我们定义了UART的主要要引脚及内部连线,并定义了顶层分为4大模块发送模块(send)、接收模块(read).波特发生模块(elk)以及控制模块(counter
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- uart16550IP 设计 FPGA 实现