在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 16614|回复: 26

[原创] 码力分享:基于APB总线的UART接口软核设计

[复制链接]
发表于 2015-10-17 21:11:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x

随着超大规模集成电路设计技术以及深亚微米制造技术的发展,系统集成芯片(System-on-a-Chip,SOC)的设计方法己成为下一波IC产业的主流,而IP核作为SOC设计的基础,其发展状况受到业界的广泛关注。

本文立足于自主研制的可重构媒体SoC芯片的系统功能需求,在详细研究了AMBA总线接口协议与UART接口协议的基础上,设计了基于AMBA总线的 UART IP核,给出IP核模块结构及作用,分析APB从模块接口时序以及与外部设备通信的过程,结合波形图阐述发射和接收的基本原理,利用verilog硬件描述语言完成了RTL代码设计与验证,并给出了主要模块ModelSim仿真的波形图。


关键字:FPGA,IP核,APB总线,UART接口,Modelsim仿真。


把UART内部按照功能划分模块,可以分为收发控制器、收发fifo、接收器、发送器、波特率发生器、中断控制6大模块[11]。UART的外部端口可以分为3类,连接到APB 总线上的端口、连接到外部串口( RS 232C 接口) 的端口和中断信号线。其中UART面向APB总线的端口有:PRESET,PCLK,PSEL,PENABLE,PWRITE,PADDR,PWDATA,PRDATA。其功能分别是:

PADDRAPB总线地址线

PWDATAAPB总线写数据线

PWRITEAPB总线写控制信号

PRDATAAPB总线读数据线

PCLKAPB总线时钟

PRESETAPB总线复位信号

PSELAPB从机选择信号

PENABLEAPB从机使能信号

UART面向外设的输入/输出信号有:Rxd_iTxd_o。其中Rxd_iTxd_o分别为串口的接收和发送引脚,UART还有很多可扩展的功能,但鉴于本人的精力和能力有限,所以选择了UART中最简单的通信模式的设计,即只需要用2个数据线和一个地线。


                               
登录/注册后可看大图

4.1 UART软核结构

4.2 APB接口模块

APB从机接口模块主要包括地址译码及各个控制寄存器和状态寄存器的读写等,这些寄存器的各个控制字控制着其它各个功能模块[12]。它是UART与cpu通信的接口,处理器通过它对UART进行控制,对各个寄存器写入控制字和需要发送的数据以及从寄存器中读出各模块的状态和接收到的数据。UART工作方式和传送的数据及其格式均由接口模块控制。

图4.2给出UART作为 APB总线从模块的一个写时序图。


                               
登录/注册后可看大图

4.2 UART读写时序图

其中T1~T2IDLE状态,即地址与数据都没有送到总线上;

T2~T3周期为SETUP周期,此时APB桥发出一个选择信号PSEL表示当前选中UART设备,并根据地址信息选中相应要接收数据的寄存器;

T3~T4周期为ENABLE周期,此时APB桥将产生一个PENABLE信号,表示可以接收数据。

T4~T5表示此时总线又回到IDLE状态。读周期与写周期的原理基本一致,最大不同在于读写控制信号PWRITE必须为低电平。

4.3波特率产生模块

UART收发通道使用采样时钟和串口数据同步,由于此UART使用16次采样,所以采样时钟是串口数据波特率的16倍。采样时钟由系统时钟经过两次分频得到。另外由于可重构媒体SoC芯片中APB总线的正常工作频率为200MHz,而UART的最快传输速率为56Kbps,所以分频电路是本文设计中必不可少的部分。

如果通过一级分频,则需要一个可以计数几千个时钟周期的计数器,分频过程不够灵活,分频系数太大,功耗的代价不容忽视。如果采用两级分频,那么每一级分频计数器只需要较少的几位就可以实现最终波特率分频Baud,各级分频系数减小。如果分成三级分频,那么每一级的计数器就更小,分频灵活性增加,但是分的级数越多所需的计数器个数也越多,对于用户来说配置Baud时钟就越复杂。考虑到设计的灵活性和用户使用的简单性,对上述方案折中处理,采用两级时钟分频,第一级为预分频,第二级为固定16分频。

4.4 发送模块

发送模块将从处理器接收到的数据按规定的格式加上起始位,奇偶校验位和停止位后串行输出。与UART串行输出相比,处理器与UART通讯的速度要快得多,这样处理器可以一次往FIFO中写入多个字节的数据,发送时依次从FIFO中一次取出一个字节来串行输出。形式如下:


                               
登录/注册后可看大图

4.3 发送数据通路

发送模块就是要完成FIFO和发送数据功能模块的设计,FIFO并不是设计的重点,设计的重点的发送功能模块的实现,在该部分设计采用的状态机的方法。

发送端有限状态机是实现发送数据的重要组成部分,是实现高效率高可靠性逻辑控制的重要途径。本文通过发送端状态机产生并行数据到串行数据的转换的移位模块发送控制信号,众多的功能任务增加了发送状态机设计的复杂性,设计的难度在于如何采用简单的状态机规律满足多样化的功能行为。

在设计中定义了四个状态,将整个数据发送的过程变成这4个状态间的转换。


                               
登录/注册后可看大图

4.4 发送数据状态转化图

其中idle是空闲状态,当发送数据开始将进入数据发送阶段(DATA),该阶段一般会重复8次,之后进入奇偶校验(PARITY)状态,如果设置无校验方式发送,则直接由数据发送阶段跳过奇偶校验阶段而进入结束。结束状态完毕之后进入空闲状态,如此周而复始。完成了不断的数据发送任务。

4.5 接收模块设计

接收器模块receiver完成数据从RXD引脚到DRR寄存器的串行接收,中间要经过接收移位寄存器RSR,接收控制逻辑、接收FIFO等逻辑最终到达数据接收寄存器DRR,其数据通路如图4.5


                               
登录/注册后可看大图

4.5 接收数据通路

接收过程同样是通过状态机完成的,其状态和发送模块的状态相类似,与其不同的是需要进行数据监测。具体的检测过程是这样的:在接收过程中,当进入允许接收数据状态时,UART会一直监视串行数据输入RXD。在空闲状态时,RXD始终为高电平,当接收时钟的上升沿采样检测到低电平时,就连续对RXD采样8次,如果每个采样的值都是0,则认为检测到一个有效起始位,然后每隔16拍采样一次数据,每次采样的值作为接收到的一个有效数据位,在接收完6~8个有效数据之后,检测下一个值是否为1(停止位),如果为1,则一帧数据接收完毕。在上述过程中如果出现起始位和停止位错误时,都要重新检测起始位,然后重复上述过程。其状态转换图如下:


                               
登录/注册后可看大图

4.6 接收数据状态转化图

空闲状态(idle):UART复位时,状态机自动到空闲状态。该状态不断检测RXD状态,一旦检测到RXD1跳变到0,则状态就转为检测有效起始位状态,否则状态保持。

检测有效起始位状态(DETECT):对RXD输入信号连续采样8次,若每次采样的接收都为1,则进入数据接收状态,若不全为1,则回到空闲状态。

数据接收状态(DATA):按规定格式从RXD一位一位的接收数据,直到最后一位数据位。接收模块根据接收数据格式控制字判断是否进入校验状态。若无,则进入到停止位状态,如有校验,则到校验位状态

校验状态(PARITY):当有奇偶校验时,状态机根据控制字,决定数据采样的是奇校验、偶校验或校验位固定。

停止位状态:状态机根据控制字,接收的停止位可以是1位,1.5位和2位。当停止位传输完成后,进入IDLE状态。

4.6本章小结

在本章中完成了基于Verilog语言的模块软核设计,并对各个模块的主要功能和设计思路进行了描述,实现后的模块图如下所示:


                               
登录/注册后可看大图

4.7 模块设计端口图

编译之后显示该模块共用的资源如下:


                               
登录/注册后可看大图

4.8 模块编译效果

从编译效果可以看出,该模块使用的资源很小,效率很高。在下一章将对该设计进行基于Modelsim的仿真测试。

5 仿真验证和结果分析

在本章中将对UART软核进行仿真测试,而仿真工具就是前面介绍的ModelSim-Altera 6.4a,由于其是altera公司推出的ModelSim版本,所以其有Quartus II有良好的兼容性,为实现联调测试提供了方便,这也是本设计选用ModelSim-Altera 6.4a作为仿真工具的主要原因。

仿真的主要工作时编写testbench和修改设计。testbench是一种验证的手段。首先,任何设计都是会有输入输出。仿真的时候由于没有硬件信号的输入,需要通过软件仿真出信号输入,相当于产生一种虚拟的平台。利用这个平台对你的设计进行功能分析和校验。这个就是testbench的含义。

testbench里面包含三部分内容

1、激励生成。英文么就是simulator,这个只用来生成输出,他自己没有输入,只是按照一定的规律去给你的设计激励,激励通过设计的输入端口送到你的设计中。其余的事情不管。这里的激励,都是预先设想好的,比如根据某个协议,或者某种通信方式传递。

2验证设计。英文可以叫做DUTdesign under testbench或者DUVdesign under verification。这个主要目标。

3、输出校验。英文叫markerboard,他所管的事情就是,接收你设计的输入,然后通过校验,找出对应的问题。然后报错,或者统计错误。

对于第三部分内容并不是每个testbench都要包括的[9],对于庞大的系统其是不可或缺的,用眼睛直接观察的方法去验证庞大的系统是不可实现了。但对于小系统而言,用人工方式检验验证结果可能效果更好,操作更方便,所以第三部分内容是可以灵活选择的,由于本设计系统不是很复杂所以本系统的testbench主要包含前两部分内容。

下面是模块的功能仿真。


                               
登录/注册后可看大图

5.1 串口发送一个字节的仿真时序

在APB总线时序中每一个读写操作时序都是由四部分构成的:

第一个pclk周期pselpensble都为低电平。

第二个pclk周期psel为高电平,penslbe仍为低电平,在这个周期paddr(地址)和pwdata(写数据)的信号开始给入。

第三个pclk周期,pselpensble都为高电平,在这个周期uart模块会将数据读入。

第四个pcl周期,pselpensble都为低电平,读写操作都结束。

读和写的时序周期是一样的,只不过是pwrite信号不同罢了,当pwrite为高电平是表示写数据,当其为低电平是表示读数据。在仿真的testbench中就是向发送寄存器的地址(0x10)写入数据(0xBD),这样表示发送数值0xBD。从上面图5.1可以看出在进行完这个写操作之后,txd_o的电平由高转低开始发送,随后将0xBD以串行的形式发送出。


                               
登录/注册后可看大图

5.2 串口接收一个字节的仿真时序

在做数据接收仿真的时候,为了创造输入信号(rxd_i)的时序,在仿真的testbench中将输出信号(txd_o)的值赋予输入信号,这样一来,在APB总线执行读接收缓存器的内容操作时就可以将接收到的数据通过prdata发送回去,完成数据接收操作。通过上面图5.2的观察可见,接收功能是正确的,模块顺利的准确的读出了从串口线接收到的0xBD。

发表于 2015-10-22 14:28:01 | 显示全部楼层
写得很好!感谢楼主经验分享!
发表于 2016-12-26 15:55:08 | 显示全部楼层
谢谢分享哈
发表于 2016-12-26 16:14:03 | 显示全部楼层
写的很好,最近正在学
发表于 2017-4-19 18:54:37 | 显示全部楼层
不错不错
发表于 2017-4-21 10:04:29 | 显示全部楼层
谢谢分享
发表于 2017-4-22 22:02:22 | 显示全部楼层
请问楼主有没有代码?
发表于 2017-5-18 14:15:02 | 显示全部楼层
很好,看起来很有用
发表于 2017-9-7 18:56:30 | 显示全部楼层
不错不错!
发表于 2017-9-7 21:32:39 | 显示全部楼层
多谢分享啊,楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /3 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-16 12:26 , Processed in 0.031368 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表