完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
波特率发生器的功能是产生和RS-232通信所采用的波特率同步的时钟,这样才能方便地按照RS-232串行通信的时序要求进行数据接收或者发送。图5-9表示了波特率时钟和RS-232接收端信号RxD之间的时序关系,波特率时钟的频率就是波特率。比如,波特率为9600,即每秒传输9600位数据,则同步的波特率时钟频率为9600,周期为1/9600=0.10417毫秒。 图5-9波特率时钟与RxD时序图实现上述的波特率时钟的基本思路就是设计一个计数器,该计数器工作在速度很高的系统时钟下,当计数到某数值时将输出置高,再计数一定数值后再将输出置低,如此反复便能够得到所需的波特率时钟。假如FPGA的系统时钟为50MHz,RS-232通信的波特率为9600,则波特率时钟的每个周期相当于 个系统时钟的周期。假如要得到占空比为50%的波特率时钟,只要使得计数器在计数到5208x50%=1604时将输出置高,之后在计数到5208时将输出置低并且重新计数,就能够实现和9600波特率同步的时钟,原理图如图5-10所示。 图5-10波特率时钟实现原理 波特率发生器的端口定义如表5-6所示。 波特率发生器在复位后,将内部计数器置为“0”,如果使能信号有效,则在每个系统时钟的上升沿工作,将计数器计数增加一。当输出一个完整的波特率时钟脉冲后,波特率发生器会自动将内部计数器置为零,同时开始进行下一个脉冲的计数。还有一个indicator信号,每产生一个完整的波特率时钟周期,indicator信号会输出一个宽度的高电平。indicator信号用于表示产生了一个完整的波特率时钟周期,UART通过此信号来了解波特率发生器已输出的脉冲个数。 波特率发生器的实现代码如下,其中在实体声明中声明了两个类属参数,FULL_PULSE_COUNT表示一个波特率时钟完整的周期所对应的计数器计数,RISE_PULSE_COUNT表示波特率时钟信号上升时刻所对应的计数器计数,这样波特率时钟的占空比可以表示为
以上代码中的BD_COUNT是在UART_PACKAGE库中定义的,它代表范围从0~65535的整数(即16位整数);BD9600_FPC代表波特率时钟完整周期对应的计数,而BD9600_HFC代表的是波特率时钟半周期对应的计数,它们也是在UART_PACKAGE库中定义的,如下所示:
下面介绍一下波特率发生器的仿真测试过程。由于9600波特率对应的参数数值比较大,所以为了便于观察仿真的波形,可以首先选用数值较小的测试数据。比如,可以在UART_PACKAGE库中定义完整波特率时钟周期对应计数为10,半周期对应计数为5,代码如下:
在测试平台文件中,声明波特率发生器实例时应该将其类属参数设置为测试参数,如下所示:
完整的波特率发生器测试平台请参考UART工程源代码中的baudrate_generator_tb.vhd文件,使用测试参数仿真得到的波形如图5-11所示。观察波形可以看到波特率发生器每经过10个时钟周期输出一个完整的波特率时钟周期,占空比为1/2,并且在每次输出完整脉冲后输出一个系统时钟脉宽的提示信号,可见波特率发生器的工作完全满足设计的要求。 |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
2893 浏览 3 评论
27693 浏览 2 评论
3467 浏览 2 评论
3981 浏览 4 评论
基于采用FPGA控制MV-D1024E系列相机的图像采集系统设计
2331 浏览 3 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 09:42 , Processed in 0.668056 second(s), Total 55, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号