1.需求分析

关于uart协议实现这部分大家可以参考我上一篇的博客。《FPGA自学笔记--串口通信实现(vivado&verilog版)》。在上一篇博客中,主要实现了将单字节的数据,我们其实就是用上一篇博客的模块来实现多字节数据的发送。

在真实的数据传输过程中,我们不只是发送 6 7 8 位数据,也有可能发送12 16 20位的数据,所以我们需要调用多次串口发送模块来发送多字节数据。通过状态机实现,假设我们这次发送一个40位,5字节的数据,所以朴素的来讲,我们可以有6个状态,0状态是整个模块等待状态,1,2,3,4,5状态分别为5个字节数据的发送状态。

2.总体模块和状态转移图。

上一篇博客中,单字节的串口发送模块为uart_tx。实现的具体功能为,当send_go为高电平时,将data里的并行数据以串行数据发出,发送完成时 tx_done 产生一个单脉冲。我们需要在上层模块中调用这个模块。上层模块的框图如昨图。需要调用的uart_tx模块如右图所示。

所以,需要trans_go启动状态机,状态机内部产身send_go信号,传输一字节数据。发送完成后,uart_tx模块会产生tx_done信号,tx_done信号用来激活状态机的下一个状态,开始发送下一个数据,再次产生一个send_go脉冲,送入data数据,依次送完5字节数据,当最后一个字节发送完成成,最后一个状态5在tx_done下返回第一个状态,并产生五字节发送完成信号,trans_down.回到第一个状态后,等待发送下一个四十位,五字节数据的trans_go。

状态转移图如下。

当然,这个状态转移图也可以简化,由于我目前也是小白状态,只能写出这种比较好理解,简单的写法,大家以后也可以尝试比较高级的写法。即只用两个状态机实现,或者讲后面五个状态总结为一个大状态,

3.设计文件和testbench文件

在top文件中例化uart_byte_tx模块,这部分具体代码请参考上一个博客。代码参考了B站小梅哥的视频。新手强烈推荐。

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/04/30 20:20:59
// Design Name:
// Module Name: uart_tx_5byte
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
// 使用串口发送5个字节(40 bit)的数据到电脑module uart_tx_5byte(clk,reset,data40,trans_go,uart_tx,trans_done);input clk;input reset;input trans_go;input [39:0]data40;output uart_tx;output reg trans_done;reg [7:0]data;reg send_go;//reg tx_done;uart_byte_tx uart_byte_tx(.clk(clk),.reset(reset),.send_go(send_go),.data(data),.baud_set(4),.uart_tx(uart_tx),.tx_done(tx_done));reg [2:0]state;always@(posedge clk or negedge reset)if(!reset)beginstate <= 0;send_go <= 0;data <= 0;trans_done <= 0;endelse if(state == 0)begintrans_done <= 0;//if(tx_done)begin             // 当发完的时候  发新的if(trans_go)begin             //  由trans_go 点燃第一个状态  启动状态  用tx_done 是无法启动状态机的  tx_done 是 0状态结束标志data <= data40[7:0];send_go <= 1;state <= 1;endelse begindata <= data;send_go <= 0;state   <= 0;end        endelse if(state == 1)beginif(tx_done)begindata <= data40[15:8];send_go <= 1;state <= 2;endelse begindata <= data;send_go <= 0;state   <= 1;end        endelse if(state == 2)beginif(tx_done)begindata <= data40[23:16];send_go <= 1;state <= 3;endelse begindata <= data;send_go <= 0;state   <= 2;end        endelse if(state == 3)beginif(tx_done)begindata <= data40[31:24];send_go <= 1;state <= 4;endelse begindata <= data;send_go <= 0;state   <= 3;end        endelse if(state == 4)beginif(tx_done)begindata <= data40[39:32];send_go <= 1;state <= 5;endelse begindata <= data;send_go <= 0;state   <= 4;end        endelse if(state == 5)beginif(tx_done)begin               // 当发完的时候 回到初始状态send_go <= 0;state <= 0;trans_done <= 1;endelse begin                    // 当没发完的时候 等他发完data <= data;send_go <= 0;state   <= 5;end        end
endmodule

对应的testbench文件

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/04/30 21:51:02
// Design Name:
// Module Name: uart_tx_5byte_tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module uart_tx_5byte_tb();reg clk;reg reset;reg [39:0]data40;reg trans_go;wire trans_done;wire uart_tx;uart_tx_5byte uart_tx_5byte(.clk(clk),.reset(reset),.data40(data40),.trans_go(trans_go),.uart_tx(uart_tx),.trans_done(trans_done));initial clk = 1;always #10 clk = ~clk;initial beginreset = 0;data40 = 0;trans_go = 0;# 201;# 200;reset = 1;data40 = 40'h123456789a;trans_go = 1;# 20trans_go = 0;@(posedge trans_done);# 200000;data40 = 40'habc1234655;trans_go = 1;# 20trans_go = 0;@(posedge trans_done);# 200000;$stop;end
endmodule

4.仿真结果分析

显然,如图所示,一定要注意,多字节发送,每个字节还是存在起始位和终止位的,所以应该还是10位10位的发,看时序图的时候一定不要看错了,去除箭头所示的标志位后,对比数据,并行40位输入和串行输出,结果一致,从低位到高位,完全正确。有兴趣的同学可以直接下载我的vivado工程。

FPGA自学笔记--串口通信发送多字节数据(verilog版)相关推荐

  1. Python串口通信发送浮点型数据

    发送步骤 导入pyserial库--import serial 用于操作串口(详情见serial简介) 初始化串口--serial.Serial portx = "/dev/ttyUSB0& ...

  2. java串口发送16进制数据_MFC串口通信发送16进制数据的方法

    本文实例为大家分享了MFC串口通信发送16进制数据的具体代码,供大家参考,具体内容如下 MFC串口通信会使用m_mscomm控件. 发送数据一般是在edit control 里输入自己想发送的内容,然 ...

  3. 【FPGA】——UART串口通信

    UART串口简介   串行通信分为两种方式:同步串行通信和异步串行通信.同步串行通信要求通信双方使用同一时钟,异步则没有这个要求.UART是一种采用异步串行通信方式的通用异步收发传输器(univers ...

  4. C#解决串口通信中接收数据时延迟处理与缓存处理的方法

    转载连接: http://blog.csdn.net/yaoliang11/article/details/6885768 C#解决串口通信中接收数据时延迟处理与缓存处理的方法 时间:2011-1-2 ...

  5. 求android 中串口的发送接收数据代码

    RT,求高手帮忙! 就是 /dev/ttyS0 和/dev/ttyS1 两个设备的通信问题.. 同求~ 这个是不是需要串口驱动啊?最近正在搞这个串口通信的案子,头疼 同样也没有搞出来,老是报:不能扫描 ...

  6. delphi 串口通信发送_关于串口通信232、485、422和常见问题,就没见过能讲这么清楚的...

    先讲串口通信的一些基本概念,术语.如果对串口通信比较熟悉的,就当复习,如果哪里讲的不到位,欢迎及时指出. 这里并不对串口的编程作讲解,主要是从应用的角度去讲一讲.因为更多的时候,都是产品做好了,比如触 ...

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

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

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

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

  9. FPGA自学笔记(二)仿真文件tb

    FPGA自学笔记(二)仿真文件tb 一.创建文件 创建 simulation sources ,命名为 tb_模块名. 二.代码 1.定义reg,wire 因为要测试一个模块,所以该模块的input应 ...

最新文章

  1. RNA-seq技术之转录组从头组装介绍
  2. A problem occurred starting process 'command '/home/jason/Android/Sdk/build-tools/23.0.3/aapt
  3. 子函数的指针释放问题
  4. 【习题 5-8 UVA - 230】Borrowers
  5. d3 canvas_D3和Canvas分3个步骤
  6. Go单元测试--模拟服务请求和接口返回
  7. 2009年12月8号漕宝路电信机房真是电信封的吗?
  8. WCF,Net remoting,Web service
  9. qtvs添加qchart_如何使用Qt Designer在表单中插入QChartView?
  10. 通用权限系统快速开发框架
  11. 机器学习教程 之 随机森林: 算法及其特征选择原理
  12. 期货计算机撮合成交的原则,期货ABC之行情及基本术语:八、价格优先、时间优先及撮合成交价的确定...
  13. Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean
  14. FIL新一轮上涨:FIL算力通证迎来新热潮
  15. php实现成语小游戏,成语小秀才微信小程序源码-PHP代码类资_aqa7qj 源码采用php实现 - 下载 - 搜珍网...
  16. 基于QT的网络嗅探器实现(网络安全课程设计)
  17. CSS实现水波纹效果
  18. kaggle竞赛官网注册邮箱验证码收不到
  19. python unpacking_Python解包(Unpacking)
  20. 网桥VLAN GROUP组

热门文章

  1. TRY HACK ME | INTERNAL「渗透测试挑战02」
  2. windows10安装配置vim
  3. tplink查看上网记录_tp-link路由器如何查看连接人数 tp-link路由器查看连接人数方法【步骤】...
  4. Python漏洞验证自动化脚本 批量刷SRC
  5. React 全新文档上线!
  6. Hantek6022BE 虚拟示波器 (二)方波 采样率 带宽
  7. Robotstudio 获取机器人D-H参数
  8. Cesium学习笔记(六)粒子系统
  9. 关闭腾讯网迷你版(登录qq后的广告弹窗)
  10. 2021考研——浙江大学控制科学与工程专业考研经验贴(845自动控制原理)