欢迎来到天天文库
浏览记录
ID:9217639
大小:1.53 MB
页数:32页
时间:2018-04-23
《小梅哥和你一起深入学习fpga之串口调试(一)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、小梅哥和你一起深入学习FPGA之串口调试(一)大家好,这几天在各个论坛上,经常就有人在向我咨询基于FPGA的串口通信代码,大部分都是在网上下载一个现成的代码,但是在使用中就遇到了各种问题,于是就发到了论坛上来求助。在阅读了他们的代码之后,我发现几乎出自同一个版本(目前确定为特权同学的基于EPM240入门实验的代码)。他们在调试这个代码的时候,经常存在这样几个问题:1、部分人对该串口通讯模块完全不理解,对每句话,甚至每个模块的功能都不理解;2、部分人采用最原始的画波形的方式来对该模块进行仿真,结果无法得到仿真结果;3、部分人不会使用mode
2、lsim对该设计进行仿真;4、绝大部分人不会编写testbench;5、下板测试无法进行正确的字符串收发。在公司内部,我将这种现象和几位老师交流之后,夏宇闻老师建议我专门针对该代码写一个由原理到代码,由仿真到板级的调试笔记。争取用最通俗,也是最笨的办法,手把手的教会大家来调试这个代码。本调试笔记主要由五个部分组成:原始代码分析;原始代码验证;对原始代码进行修改;对修改后的代码进行验证;对修改后的设计进行板级验证。每个部分,小梅哥都会用图文结合的方式,教大家一步一步的来进行。一、原始代码分析该代码来自小梅哥最崇拜的大神,特权同学。当时小梅哥
3、也是看着特权同学的书和视频教程一步一步走过来的。特权同学的代码实现了单字节的收发测试,没有对连续字节的收发进行测试。特权同学当时也说过,这个只是一个简单的实验,离实际工业应用还有一定的距离。考虑到论坛上很多小伙伴都希望能够实现连续字节的收发功能,因此小梅哥就在特权同学的代码上进行了修改。修改后的代码,输入时钟可以在一定范围内选择任意频率,目前已经支持5种波特率选择(9600、19200、38400、57600、115200),实际小梅哥还做过更高波特率的测试,目前实测在115200波特率的速率下可以实现超过9999999次连续无间断的收发
4、。这里,小梅哥首先将特权同学设计架构在这里列出来,以给读者一个直观的印象。clkclkrs232_txrst_nrst_nclkrx_intmy_uarrst_nmy_uarx_datat_txrs232_rxrt_rxclkclk_bps1clk_bps2rst_nspeed_rbps_start1xclkrst_nspeed_tbps_start2x由上图可知,特权同学的UART串口设计主要包含了四个模块:串口发送模块(my_uart_tx)、串口接收模块(my_uart_rx)、串口接收波特率发生器(speed_rx)和串口发送波特
5、率发生器(speed_tx),其中,串口发送波特率发生器主要用来产生串口发送模块发送数据时所需的波特率时钟,串口接收波特率发生器主要用来产生串口接收模块接收数据时的波特率时钟,串口发送模块主要负责在指定波特率的速率下将待发送字节发送出去,串口接收模块则主要负责接收来自其他设备发送过来的串口数据。my_uart_top模块即串口收发顶层模块实现了各个模块间的信号连接功能,通过该顶层模块的连接,实现了将串口接收到的数据再发送出去的功能,即我们测试串口通信最常用的一种方式——回环测试。特权同学该实验的各个端口和内部信号的意义如表1所示:所属模块
6、端口/信号名端口/信号意义clk系统时钟,本设计中,固定为50M频率的时钟rst_n系统复位,低电平复位顶层模块my_uart_toprs232_rx串口接收端口rs232_tx串口发送端口clk系统时钟,本设计中,固定为50M频率的时钟rst_n系统复位,低电平复位rs232_rx串口接收端口rx_data串口接收模块接收到的字节数据接收模块my_uart_rxrx_int串口接收成功中断请求信号,为一表示正在接收数据clk_bps波特率时钟bps_start波特率发生模块使能信号clk系统时钟,本设计中,固定为50M频率的时钟rst_
7、n系统复位,低电平复位rx_data待发送的字节数据,来自串口接收模块发送模块rx_int串口接收成功中断请求信号my_uart_txrs232_tx串口发送端口clk_bps波特率时钟bps_start波特率发生模块使能信号clk系统时钟,本设计中,固定为50M频率的时钟收发波特率发生模rst_n系统复位,低电平复位块speed_tx/speed_rxclk_bps波特率时钟bps_start波特率发生模块使能信号该实验的内容为,串口接收模块在检测到发送设备发送过来的数据起始位时,接收中断信号置1,该信号则作为启动串口接收波特率发送器的
8、控制信号,然后在每个波特率时钟上升沿到来时读取串口接收端口(rs232_rx)上的数据。一帧(字节)数据接收完成后,接收中断信号拉低,停止波特率发生器工作,接收完成,系统进入等待状态,等待下一
此文档下载收益归作者所有