串口收发模块设计

作者:巩文宏 公众号:数字积木

该串口收发模块有串口发送模块,串口接收模块,波特率生成模块,发送数据fifo模块,接收数据的fifo模块组成。
默认配置下,要求输入的参考时钟为50MHz,输入输出的波特率默认配置为115200.该设置体现在波特率生成模块中。
整体的设计框架如下:

端口定义如下:端口名方向描述ClkInput主时钟,默认频率为50MHzRst_nInput复位信号,低有效RsRxInput串口接收端口RSTxOutput串口发送端口Tx_data_in[7:0]Inputtx端要发送的1字节数据Rx_data_out[7:0]outputrx端口接收到的1字节数据Tx_wenInput发送数据的写入使能信号Rx_renInput接收数据的读取使能信号Uart_irqoutput串口中断信号,为高时标志着rx接收到了有效的数据该模块的使用:发送数据
将要发送的数据放置到Tx_data_in[7:0]总线上,同时将Tx_wen置为高,下一个时钟时,该数据会写进tx_fifo中。如要发送多字节数据,则重复上述步骤,每个时钟向TX_FIFO中发送一个字节的数据,tx_fiof的默认深度为256,可以储存256个字节的数据,则一次最多可以发送256字节数据。接收数据
接收到一个字节的有效数据时,该字节立即在Rx_data_out[7:0]端口输出,此时中断信号Uart_irq为高时,读取输出端口的数据,同时将Rx_ren置一个时钟的高电平即可 。 。1,波特率计数模块在波特率生成模块中,生成发送和接收数据的采样时钟,该采样时钟为波特率的16倍频时钟。count_reg 是分频计数器。27为波特率设置为115200时的时钟分频参数。

设置一个可配置参数 Baud_rate,便可以再顶层例化模块中通过该参数来改变串口的波特率。参数值和对应的波特率如下表所示。默认情况下,配置参数为6,对应的波特率设置为115200.

分频计数器的参数计算如下:
分频参数 = 主时钟频率/(波特率*16)。
设置为其他常用波特率时,该参数的值为下表:波特率计算的分频参数实际的分频参数配置参数12002604.22604124001302.1130224800651.065139600325.532543840081.481511520027.1276 2,fifo模块 tx_fifo和rx_fifo 都是例化的自定义的fifo模块。该fifo模块预留有参数接口,可以通过改变该参数来改变fifo的深度和数据宽度。
fifo模块用于临时储存串口发送和接收的数据,进行跨时钟预的数据储存。若不使用fifo来暂存数据,由于串口发送数据相对缓慢,则要连续发送多个字节的数据时,必须等待上一个字节发送完成后才能发送下一个字节,则主模块便要不断等待。使用fifo后,便可以将连续多个字节的数据一次性发送到fifo中,发送模块便会自动读取fifo中的数据进行发送,主模块便可以空闲。
接收模块的fifo同理。将接收到的多个数据暂时储存在fifo中,在读取时便可以一次性连续读取多个字节的数据。
当往fifo中写入数据时,写入的第一个字节的数据就会在R_out[7:0]端口输出。将rd信号置高时,读指针指向下一个地址,在下一个时钟将输出下一个字节数据。fifo模块的配置参数和端口定义如下:

定义了一个名为array_reg的内存阵列,该内存阵列的储存深度由参数AWIDTH决定,储存的深度等于 2^AWIDTH.fifo的数据宽度等于DWIDTH。

在串口模块例化该fifo模块时,将AWIDTH配置为8,DWIDTH也配置为8。即例化了一个数据宽度为8,储存深度为256的fifo模块。

发送数据fifo:
要通过tx端口向其他串口设备发送数据,首先将要发送的数据放置到Tx_data_in[7:0]总线上,同时将Tx_wen置为高,下一个时钟时,该数据会写进tx_fifo中。如要发送多字节数据,则重复上述步骤,每个时钟向TX_FIFO中发送一个字节的数据,tx_fiof的默认深度为64,可以储存64个字节的数据,则一次最多可以发送64字节数据。当数据储存到TX_FIFO中后,fifo的空标志位(empty)不等于零,令发送模块的开发发送标志位(tx_start)等于 ~empty,则当fifo内储存有要发送的数据时,tx_start信号为1,此时,发送模块从TX_FIFO中读取一字节的数据。待这一字节的数据发送完成后,继续读取fifo内储存的下一个发送数据。直至将fifo内储存的数据全部读取完后,empty等于1,tx_start等于0,发送模块不再发送数据。 接收数据fifo:
当接收到rx端口的有效数据时,接收到的数据会临时储存在rx_fifo中,第一个字节的数据就会在Rx_data_out[7:0]端口输出。中断信号 uart_irq 时rx_fifo的空标志位的取反,此时中断信号 uart_irq 为高,标志这接收到了有效的数据。此时将Rx_ren置为高,读指针指向下一个数据的地址,在下一个时钟将输出下一个字节数据。连续将Rx_ren置为高,则可读出储存在rx_fifo中的接收到的数据,并从Rx_data_out[7:0]端口输出,直到fifo中的数据被读完。
故当tx_fifo里每接收到一个数据时,中断信号为高即标志着接收到了数据,同时在接收到的数据就在Rx_data_out[7:0]端口输出。如果每接收到一个有效数据就立即读取,则必须同时发送一个周期的Rx_ren高信号,使得读地址指针指向下一个读地址,以便当接收到新的数据时,也能立即输出。
如果等待接收多个字节的数据才读取的话,此时输出端口直接输出第一个字节的地址,当将Rx_ren信号置高时,每一个时钟输出一个接收到的数据,直到fifo中的数据被读完。3,发送模块
发送模块的端口如下:

当 信号 tx_start 为高时,该模块将此时端口 d_in[7:0]输入的数据按照预定的波特率将该字节的数据从端口tx发送出去, 波特率时钟 b_tick 指定了该模块的波特率。等到该字节数据发送完成后,tx_done信号被置为一个时钟的高电平。tx_done信号连接到tx_fifo的读端口,当tx_done为高时,fifo的读指针指向下一个地址,如果下一个地址还储存有数据,输出端口输出储存在下一个地址中的数据,同时empty信号为0,串口发送模块将继续发送数据。当下一个地址还没有数据时,empty输出为高,数据发送停止。4,接收模块接收模块的端口如下:

当该模块从rx端口接收到一个有效的字节数据后,rx_done会置高一个时钟,同时接收到的数据从端口dout[7:0]输出。rx_done连接到rx_fifo的写使能端口,接收到的数据将写入到rx_fifo中。5,模块测试通过电脑端串口向FPGA发送数据,FPGA端RX模块接收到数据后再将该数据通过串口在发送到电脑端。
我们连续发送了字符串“123”,在接收端也同样接收到了字符串“123”。

这是接收到的三个字符采样得到的时序图。

如下图,当接收到一个字节数据后,uart_irq信号会置高,同时接收到的数据就立刻在rx_data_out[7:0]端口输出。然后将rx_ren信号置高一个时钟,让读地址指针指向下一个地址,则当再次接收到一个新的数据时,该数据也能马上输出。

关注公众号:“数字积木”,获取更多精彩内容,技术干货。

cubemx串口的发送与接收_串口收发模块设计相关推荐

  1. 串口接收标志位语句_如何获取串口的发送和接收的标志位?

    我用C#写了一个小的串口调试软件,并在51的板子上调试成功了,但是换到STM32F103上不行了,由于刚学STM32,还很不熟悉,所以还请各位能否告诉我如何获取串口的发送和接收的标志位.或是帮我把下面 ...

  2. 【HAL库】STM32F407ZGT6实现串口中断发送和接收

    ** [HAL库]STM32F407ZGT6实现串口中断发送和接收 (保姆级教写代码1) ** 前言 根据近期所做的项目,想给大家分享一些有关STM32的各类通信方式的代码教程,都是基于STM32HA ...

  3. 51单片机串口通信发送以及接收代码详解1

    #include <reg51.h> //实验现象:单片接收电脑发送的字符串,并发回给PC端的代码.//函数声明 void uart_init(void); void uart_seng_ ...

  4. 51单片机串口通信发送以及接收代码详解2

    #include <reg51.h> //实验现象:在电脑端没按下发送的时候,单片一直给电脑发送aaa字符串: //实验现象:在电脑端按下发送的时候,结束字符串aaa的发送代码,执行单片接 ...

  5. FPGA 串口中断_一个严谨的STM32串口DMA发送amp;接收(1.5Mbps波特率)机制

    昨天分享的<嵌入式大杂烩读者福利:第一期>大家有去抽奖吗,没抽的可参与抽奖,碰碰运气.我最喜欢抽奖了,还记得前几个月疫情严重时期连抽中了3包口罩,真刺激,哈哈.之后多多安排抽奖,敬请期待. ...

  6. 利用STM32 的串口来发送和接收数据实验

    0目标 1 STM32 串口简介 2 硬件设计 3 软件设计 4 下载验证 0.目标 利用串口  1.STM32 串口简介 串口设置的一般步骤可以总结为如下几个步骤: 1) 串口时钟使能, GPIO  ...

  7. 51单片机stc15w204s串口通信发数据接收数据串口中断发中文字符串完美运行软件延时发送一字节函数全注释

    这里写自定义目录标题 KEIL自己先调试通了然后再说下面的事 51单片机stc15w204s串口通信直接上文件 KEIL自己先调试通了然后再说下面的自己看看就可 KEIL自己先调试通了然后再说下面的事 ...

  8. 串口通信——发送和接收数据(8位和16位数据之间的转换)

    1. 实验目的 1.发送两个字节数据,就是16位的数据,每一次发送8位,发送两次,这里要进行数据的拆分,如发送一个0XFF56,接收得到的也是FF56(16进制显示); 2.接收两个字节的数据(这里通 ...

  9. 不同串口通信速率超时时间_串口知识详解 串口功能及电路介绍

    一.串口的概念 串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口.串行接口(SerialInterface)是指数据一位一位地顺序传送,其特点是通信线 ...

最新文章

  1. tomcat 热部署 生产环境_屋顶隔热改善舍内热环境及生产性能
  2. 收藏!一篇文章搞懂项目管理
  3. android relativelayout 点击事件,Android Relativelayout点击背景行为
  4. A first successfully deployed Java application in HCP
  5. 终于我还是放手了, 但是只想说,暂别 Aptana Studio 3,Phpstorm来吧!(附:个人遇到的小问题的解决方法)...
  6. USACO / Factorials (简单模拟)
  7. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_4 mybatis中使用unpooled配置连接池的原理分析...
  8. 网站推广效率最高的20种办法
  9. ARM开发5.3.4 基础实训( 1 ) 蜂鸣器输出控制--LPC21XX
  10. vba随机抽取人名不重复_excel启用宏,通过vba实现从数字数组里随机获取N个不重复的数字...
  11. php 获取手机信息
  12. 拼接大屏数据展示_大屏拼接可视化
  13. ARM与RISC-V的恩爱情仇
  14. SNN综述(1):深度脉冲神经网络
  15. codelite开发php,CodeLite环境搭建
  16. 微商铺php,帮助中心-微商铺的功能详解
  17. #发现你#小说的交互——交互故事性
  18. 关于小米 Mi4 手机的评测
  19. RabbitMQ和fegin补充
  20. 把时间当作朋友——第1章 醒悟

热门文章

  1. MyEclipse配置Tomcat 6
  2. PHP环境安全性能检查
  3. 如何从操作系统安装文件提取驱动文件/ How to extract driver files from setup files (win 7)...
  4. 哀悼地震遇难者--5月19至21日为全国哀悼日
  5. vue-day03-vue组件化开发
  6. 数据库高级知识——主从复制
  7. 神经网络-损失函数:
  8. C语言定义外部变量或函数使得另一个C文件可以调用
  9. CSAPP--信息的表示与处理
  10. 安卓逆向_21 --- Java层和so层的反调试( IDA 动态调试 JNI_OnLoad、init_array下断)