FPGA入门学习笔记(十)Vivado设计状态机实现UART多字节数据发送

这篇具有很好参考价值的文章主要介绍了FPGA入门学习笔记(十)Vivado设计状态机实现UART多字节数据发送。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

任务要求

使用串口发送5个字节数据到电脑
1、ADC采样的结果为12位,如何使用串口发送
2、16位数据,如何通过串口发送
3、多个字节的数据,如何通过串口发送

UART规定,发送的数据位只能有6、7、8位,若直接修改发送位数,接收模块将不适配。

两种情况:
1、没有开始发送(上一次的发送已经完成,新的40位数据的发送请求没有出现)
2、40位数据的发送请求信号已出现
3、依次发送数据中

状态:
等待传输请求(Trans_Go);
Data <= Data40[7:0];
产生Send_Go,启动发送第一个字节;
接着等待Tx_Done;

判断Data40是否发送完成,若完成:回到状态一等待Trans_Go;
若未完成:启动下一个8位数据的发送;

任务:优化状态机,实现只要2个或3个状态实现发送的功能,并且易于修改为发送任意个字节的数据。

仿真波形

fpga发送多个字节,FPGA,fpga开发,学习

设计文件程序

Method_One

/*Method_One*/
/*该程序较冗余,建议参考Merthod_Two*/
module UART_PC(
    Clk,
    Reset_N,
    Data40,
    Trans_Go,
    UART_TX,
    Trans_Done
);
    input Clk;
    input Reset_N;
    input [39:0]Data40;
    input Trans_Go;
    output UART_TX;
    output reg Trans_Done;
    
    reg [7:0]Data;
    reg Send_Go;
    wire Tx_Done;

    UART UART(
            .Clk(Clk),
            .Reset_N(Reset_N),
            .Data(Data),
            .Send_Go(Send_Go),
            .Baud_Set(4),
            .UART_TX(UART_TX),
            .Tx_Done(Tx_Done)
        );
    
    reg [2:0]state;
    always@(posedge Clk or negedge Reset_N)
    if(!Reset_N)begin
        state <= 0;
        Data <= 0;
        Send_Go <= 0; 
        Trans_Done <= 0;
    end
    else if(state == 0)begin
        Trans_Done <= 0;
        if(Trans_Go)begin
        //产生Send_Go  启动发送第一个字节
            Data <= Data40[7:0];
            Send_Go <= 1; 
            state <= 1;     
        end
        else begin
        //等待传输请求_Trans_Go
            Data <= Data;
            Send_Go <= 0; 
            state <= 0;         
        end
   end
   else if(state == 1)begin
        if(Tx_Done)begin
            Data <= Data40[15:8];
            Send_Go <= 1;
            state <= 2;
        end
        else begin
        //等待该字节数据发送完成
            Data <= Data;
            Send_Go <= 0;
            state <= 1;
        end
    end
   else if(state == 2)begin
        if(Tx_Done)begin
            Data <= Data40[23:16];
            Send_Go <= 1;
            state <= 3;
        end
        else begin
        //等待该字节数据发送完成
            Data <= Data;
            Send_Go <= 0;
            state <= 2;
        end
    end   
    else if(state == 3)begin
        if(Tx_Done)begin
            Data <= Data40[31:24];
            Send_Go <= 1;
            state <= 4;
        end
        else begin
        //等待该字节数据发送完成
            Data <= Data;
            Send_Go <= 0;
            state <= 3;
        end
    end         
    else if(state == 4)begin
        if(Tx_Done)begin
            Data <= Data40[39:32];
            Send_Go <= 1;
            state <= 5;
        end
        else begin
        //等待该字节数据发送完成
            Data <= Data;
            Send_Go <= 0;
            state <= 4;
        end
    end             
    else if(state == 5)begin
        if(Tx_Done)begin
            Send_Go <= 0;
            Trans_Done <= 1;
            state <= 0;
        end
        else begin
        //等待该字节数据发送完成
            Data <= Data;
            Send_Go <= 0;
            state <= 5;
        end
    end
endmodule

Method_Two

module UART_PC_Better(
    Clk,
    Reset_N,
    Data40,
    Trans_Go,
    UART_TX,
    Trans_Done
);
    input Clk;
    input Reset_N;
    input [39:0]Data40;
    input Trans_Go;
    output UART_TX;
    output reg Trans_Done;
    
    reg [7:0]Data;
    reg Send_Go;
    wire Tx_Done;

    UART UART(
            .Clk(Clk),
            .Reset_N(Reset_N),
            .Data(Data),
            .Send_Go(Send_Go),
            .Baud_Set(4),
            .UART_TX(UART_TX),
            .Tx_Done(Tx_Done)
        );
    
    reg [2:0]state;
    always@(posedge Clk or negedge Reset_N)
    if(!Reset_N)begin
        state <= 0;
        Data <= 0;
        Send_Go <= 0; 
        Trans_Done <= 0;
    end
    else begin
        case(state)
            0:  begin
                    Trans_Done <= 0;
                    if(Trans_Go)begin
                    //产生Send_Go  启动发送第一个字节
                        Data <= Data40[7:0];
                        Send_Go <= 1; 
                        state <= 1;     
                    end
                    else begin
                    //等待传输请求_Trans_Go
                        Data <= Data;
                        Send_Go <= 0; 
                        state <= 0;         
                    end
               end
           1:  begin
                    if(Tx_Done)begin
                        Data <= Data40[15:8];
                        Send_Go <= 1;
                        state <= 2;
                    end
                    else begin
                    //等待该字节数据发送完成
                        Data <= Data;
                        Send_Go <= 0;
                        state <= 1;
                    end
                end
            2:  begin
                    if(Tx_Done)begin
                        Data <= Data40[23:16];
                        Send_Go <= 1;
                        state <= 3;
                    end
                    else begin
                    //等待该字节数据发送完成
                        Data <= Data;
                        Send_Go <= 0;
                        state <= 2;
                    end
                end   
            3:  begin
                    if(Tx_Done)begin
                        Data <= Data40[31:24];
                        Send_Go <= 1;
                        state <= 4;
                    end
                    else begin
                    //等待该字节数据发送完成
                        Data <= Data;
                        Send_Go <= 0;
                        state <= 3;
                    end
                end         
            4:  begin
                    if(Tx_Done)begin
                        Data <= Data40[39:32];
                        Send_Go <= 1;
                        state <= 5;
                    end
                    else begin
                    //等待该字节数据发送完成
                        Data <= Data;
                        Send_Go <= 0;
                        state <= 4;
                    end
                end             
            5:  begin
                    if(Tx_Done)begin
                        Send_Go <= 0;
                        Trans_Done <= 1;
                        state <= 0;
                    end
                    else begin
                    //等待该字节数据发送完成
                        Data <= Data;
                        Send_Go <= 0;
                        state <= 5;
                    end
                end
            default:
                begin
                        Data <= Data;
                        Send_Go <= 0;
                        state <= 0;
                end
           endcase
       end
endmodule

仿真文件程序

`timescale 1ns / 1ns

module UART_PC_tb();
    reg Clk;
    reg Reset_N;
    reg [39:0]Data40;
    reg Trans_Go;
    wire UART_TX;

//隐实例化
 UART_PC_Better UART_PC(
        Clk,
        Reset_N,
        Data40,
        Trans_Go,
        UART_TX,
        Trans_Done
    );

    initial Clk = 1;
    always #10 Clk = !Clk;
    initial begin
        Reset_N = 0;
        Data40 = 0;
        Trans_Go = 0;
        #201;
        Reset_N = 1;
        #200;
        Data40 = 40'h123456789a;
        Trans_Go = 1;
        #20;
        Trans_Go = 0;
        @(posedge Trans_Done);
        #200000;
        Data40 = 40'ha987654321;
        Trans_Go = 1;
        #20;
        Trans_Go = 0;
        @(posedge Trans_Done);
        #200000;
        $stop;
    end
endmodule

任务_板级验证结果

fpga发送多个字节,FPGA,fpga开发,学习文章来源地址https://www.toymoban.com/news/detail-658976.html

到了这里,关于FPGA入门学习笔记(十)Vivado设计状态机实现UART多字节数据发送的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA零基础学习之旅#10】按键消抖模块设计与验证(一段式状态机实现)

    🎉欢迎来到FPGA专栏~按键消抖模块设计与验证 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 🥝 模块设计: 🥝 按键消

    2024年02月12日
    浏览(24)
  • FPGA 学习笔记:Vivado 工程管理技巧

    当前使用 Xilinx 的 FPGA,所以需要熟悉 Xilinx FPGA 的 开发利器 Vivado 的工程管理方法 这里初步列举一些实际 Xilinx FPGA 开发基于 Vivado 的项目使用到的工程的管理技巧 做过嵌入式软件或者其他软件开发的工程技术人员,都会想到使用代码管理工具,如 SVN 、Git 等对代码进行管理

    2024年02月09日
    浏览(18)
  • FPGA 学习笔记:Vivado 2018.2 MicroBlaze 启动 SDK

    Vivado 2018.2,配置好 MicroBlaze Uartlite等Block Design后,生成了 bin、bin文件,此时烧写到FPGA板子上,发现没有任何动静,所以需要 SDK的支持 这里使用的Vivado 2018.2,最新的 Vivado版本,如 Vivado 2020.2,启动的SDK 是 :Vitis,启动方式稍微有点不同,后面补充 Vivado 2020.2版本的操作方法

    2024年02月12日
    浏览(29)
  • FPGA vivado IP核学习笔记——单端口RAM

    1. 新建IP 在IP Catalog中找到Block Memory Generator 2. 基本配置 ①在 Component Name 位置可以修改IP名字 ② Interface Type 选择接口类型,有Native(常规)和AXI4两种,AXI4常用于软核控制FPGA或ZYNQ中PS端控制FPGA时使用 ③ Generate address interface with 31 bits ,将地址深度固定在32bit ④ Memory Type : 有一

    2024年04月29日
    浏览(19)
  • FPGA 学习笔记:Vivado simulation 仿真波形二进制显示

    最近在学习FPGA,发现除了烧写到FPGA上验证功能,最有效的方式就是软件仿真 软件仿真:simulation,就像是模拟器一样,写好测试用例,然后看是否可以输出想要的结果,用于验证FPGA逻辑的准确性 当前仿真成功后,还是需要真机实测验证 当前安装了好几个版本的Vivado ,当然

    2024年02月12日
    浏览(26)
  • Vivado增量编译:加速FPGA设计实现的利器

    随着FPGA设计的复杂度不断提高,设计人员需要选择更为高效的设计流程来保证开发效率和减少开发成本。其中,Vivado增量编译是一种非常重要的设计流程。本文将介绍Vivado增量编译的基本概念、优点、使用方法以及注意事项。 通过阅读本文可以了解: 增量编译是什么?有什

    2024年02月09日
    浏览(37)
  • FPGA 学习笔记:Vivado 生成的 Bitstream bit 文件 超大的解决方法

    最近学习FPGA,使用Vivado,照着开发板例程,写了个流水灯的Verilog程序,配置好引脚约束后,下载到开发板,发现下载的速度有点慢,我一查看 生成的 bit文件,发现竟然接近11MB。 开始以为是 Vivado 版本出了问题,我先后更换为 Vivado 2018.2 Vivado 2019.2 Vivado 2022.2,生成的 bit 文件

    2024年02月13日
    浏览(37)
  • 设计模式学习笔记 - 设计模式与范式 -行为型:8.状态模式:游戏、工作流引擎中常用的状态机是如何实现的?

    本章学习状态模式。在实际的开发中,状态模式并不是很常用,但是在能够用到的场景里,它可以发挥很大的作用。从这一点上看,它有点像我们之前讲到的组合模式。 状态模式一般用来实现状态机,而状态机常用在游戏、工作流引擎等系统开发中。不过,状态机的实现方式

    2024年04月10日
    浏览(23)
  • 【设计模式——学习笔记】23种设计模式——状态模式State(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    请编写程序完成APP抽奖活动具体要求如下: 假如每参加一次这个活动要扣除用户50积分,中奖概率是10% 奖品数量固定,抽完就不能抽奖 活动有四个状态: 可以抽奖、不能抽奖、发放奖品和奖品领完,活动的四个状态转换关系图如下 一开始的状态为“不能抽奖”,当扣除50积分

    2024年02月12日
    浏览(25)
  • FPGA入门 —— FPGA UART 串口通信

    UART 通用异步收发传输器( Universal Asynchronous Receiver/Transmitter) ,通常称作 UART。 UART 是一种通用的数据通信协议,也是异步串行通信口(串口)的总称,它在发送数据时将并行数据转换成串行数据来传输,在接收数据时将接收到的串行数据转换成并行数据。 它包括了ch340、 RS232、

    2024年02月09日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包