首页 > 其他分享 >4. 使用串口发送5个数据到电脑——基于FPGA的串口发送数据实验

4. 使用串口发送5个数据到电脑——基于FPGA的串口发送数据实验

时间:2023-09-25 09:46:20浏览次数:50  
标签:Reset FPGA Tx Uart Go Done 串口 发送数据 Trans

1. 使用串口发送5个数据到电脑

  • 对于变化的位数(原8)位进行的设计,5个数据即40位。
  • UART规定发送的数据位只能是6、7、8。

1.1 设计思路

  • 对于12位的数据,发送两个字节,高四位变0即可。例如12'h123,按照8'h23和8'h01发送。
  • 两种可能出现的情况:1. 空闲状态,还没有开始发送(上一次的发送已经完成,新的请求Trans_Go还没有出现);2. Trans_Go信号到来;3. 发送数据中。

1.2 设计方案

  1. 情况1时,等待传输信号的到来Trans_Go

  2. 情况2时,Data40 给到模块Uart_Byte_TxData,同时产生Send_Go信号,发送第一个8字节数据。

  3. 情况3时,需要等待Tx_Done信号发送下一个8位的数据。

    • 此时分为两种情况,根据40位发完了没有进行判断:1. 发完,回到情况1;2. 没发完,发送下一个8位。
  • 变量设置

    • Clk 时钟输入
    • Reset_N 复位
    • Data40 外部输入的40位数据
    • Trans_Go 发送信号
    • Uart_Tx 输出信号
    • state 状态信号(0的情况对应第一个字节)
    • Trans_Done 全部40位数据传输完毕信号
  • 通过对状态的控制来分阶段传输5次

  • 状态机思维代码

module Uart_Tx_Data(
    Clk,
    Reset_N,
    Data40,
    Trans_Go,
    Trans_Done,
    Uart_Tx
    );
    
    input Clk;
    input Reset_N;
    input [39:0]Data40;
    input Trans_Go;
    output reg Trans_Done;
    output Uart_Tx;
    reg [7:0]Data;
    reg Send_Go;
    wire Tx_Done;
    
    Uart_Byte_Tx Uart_Byte_Tx(
        .Clk(Clk),
        .Reset_N(Reset_N),
        .Data(Data),
        .Send_Go(Send_Go),
        .Baud_Set(3'd4),
        .Uart_Tx(Uart_Tx),
        .Tx_Done(Tx_Done)
    );
    
    reg [3:0]state;
    always@(posedge Clk or negedge Reset_N)
        if(!Reset_N)begin
            Data <= 0;
            Send_Go <= 0;
            state <= 0;
        end
        else if(state == 0)begin
            Trans_Done <= 0;
            if(Trans_Go)begin
                Data <= Data40[7:0];
                Send_Go <= 1'b1;
                state <= 1'b1;
            end
            else begin
                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'b1;
                state <= 2'd2;
            end
            else begin
                Data <= Data;
                Send_Go <= 0;
                state <= 1'b1;
            end
         end
         else if(state == 2)begin
            if(Tx_Done)begin
                Data <= Data40[23:16];
                Send_Go <= 1'b1;
                state <= 2'd3;
            end
            else begin
                Data <= Data;
                Send_Go <= 0;
                state <= 2'd2;
            end
         end
         else if(state == 3)begin
            if(Tx_Done)begin
                Data <= Data40[31:24];
                Send_Go <= 1'b1;
                state <= 3'd4;
            end
            else begin
                Data <= Data;
                Send_Go <= 0;
                state <= 2'd3;
            end
         end
         else if(state == 4)begin
            if(Tx_Done)begin
                Data <= Data40[39:32];
                Send_Go <= 1'b1;
                state <= 3'd5;
            end
            else begin
                Data <= Data;
                Send_Go <= 0;
                state <= 3'd4;
            end
         end
         else if(state == 5)begin
            if(Tx_Done)begin
                Send_Go <= 0;
                state <= 0;
                Trans_Done <= 1;
            end
            else begin
                Data <= Data;
                Send_Go <= 0;
                state <= 3'd5;
            end
         end
endmodule

1.3 第二种设计(使用case)

代码

module Uart_Tx_Data2(
    Clk,
    Reset_N,
    Data40,
    Trans_Go,
    Trans_Done,
    Uart_Tx
    );
    
    input Clk;
    input Reset_N;
    input [39:0]Data40;
    input Trans_Go;
    output reg Trans_Done;
    output Uart_Tx;
    reg [7:0]Data;
    reg Send_Go;
    wire Tx_Done;
    
    Uart_Byte_Tx Uart_Byte_Tx(
        .Clk(Clk),
        .Reset_N(Reset_N),
        .Data(Data),
        .Send_Go(Send_Go),
        .Baud_Set(3'd4),
        .Uart_Tx(Uart_Tx),
        .Tx_Done(Tx_Done)
    );
    
    reg [3:0]state;
    always@(posedge Clk or negedge Reset_N)
        if(!Reset_N)begin
            Data <= 0;
            Send_Go <= 0;
            state <= 0;
        end
        else 
        case(state)
            0:begin
                    Trans_Done <= 0;
                    if(Trans_Go)begin
                        Data <= Data40[7:0];
                        Send_Go <= 1'b1;
                        state <= 1'b1;
                    end
                    else begin
                        Data <= Data;
                        Send_Go <= 0;
                        state <= 0;
                    end
                end
             1:begin
                    if(Tx_Done)begin
                        Data <= Data40[15:8];
                        Send_Go <= 1'b1;
                        state <= 2'd2;
                    end
                    else begin
                        Data <= Data;
                        Send_Go <= 0;
                        state <= 1'b1;
                    end
             end
             2:begin
                    if(Tx_Done)begin
                        Data <= Data40[23:16];
                        Send_Go <= 1'b1;
                        state <= 2'd3;
                    end
                    else begin
                        Data <= Data;
                        Send_Go <= 0;
                        state <= 2'd2;
                    end
             end
             3:begin
                    if(Tx_Done)begin
                        Data <= Data40[31:24];
                        Send_Go <= 1'b1;
                        state <= 3'd4;
                    end
                    else begin
                        Data <= Data;
                        Send_Go <= 0;
                        state <= 2'd3;
                    end
             end
             4:begin
                    if(Tx_Done)begin
                        Data <= Data40[39:32];
                        Send_Go <= 1'b1;
                        state <= 3'd5;
                    end
                    else begin
                        Data <= Data;
                        Send_Go <= 0;
                        state <= 3'd4;
                    end
             end
             5:begin
                    if(Tx_Done)begin
        //                Data <= Data40[39:32];
                        Send_Go <= 0;
                        state <= 0;
                        Trans_Done <= 1;
                    end
                    else begin
                        Data <= Data;
                        Send_Go <= 0;
                        state <= 3'd5;
                    end
             end
             default:begin
                        Data <= Data;
                        Send_Go <= 0;
                        state <= 0;
                    end
        endcase
endmodule

1.4 后续任务

  • 优化状态机,实现只要2个或3个状态实现发送的功能,并且易于修改为发送任意字节的数据。
  • 征集不适用状态机的思想来实现本任务的方案。

标签:Reset,FPGA,Tx,Uart,Go,Done,串口,发送数据,Trans
From: https://www.cnblogs.com/CppsLi/p/17727178.html

相关文章

  • 阿波罗H743开发板串口下载0KB出错,使用STLINK解决方法
    导师那边的博后给了一块正点原子的阿波罗H743(非常不好意思地花了人家600+,我还以为是实验室那边本来就有的开发板给我学习呢,结果给我买了全新的还带一个wifi模块,越发觉得任重道远今天尝试连电脑使用,并按照原子那边的教程用flyMCU下载hex文件,反正就是用它一下载,第一遍烧录可以,第二......
  • FPGA 串口发送
    UART(通用异步收发传输器)1.串口通信模块设计的目的是用来发送数据的,因此需要有一个数据输入端口;2.串口通信,支持不同的波特率,所以需要有一个波特率设置端口;3.串口通信的本质就是将8位的并行数据通过一根信号线,在不同的时刻传输并行数据的不同位,通过多个时刻,最终将8位并行数据全部传出......
  • 基于FPGA数字频率计的设计(可测频率、占空比、相位差)
    设计一款数字频率计,可测量1hz-100Mhz频率,占空比,以及两路同频时钟信号的相位差。测量频率的方法:等精度测量。等精度测量原理:测量的实际门控时间不是一个固定值,它与被测时钟信号相关,是被测时钟信号周期的整数倍。在实际门控信号下,同时对标准时钟和被测时钟信号的时钟周期进行计......
  • 基于FPGA 的SDRAM控制器
    SDRAM基本信息储存能力计算4X16X4=256(Mbit),注意不是MByteSDRAM控制sdram包含两个部分:sdram_ctrl、fifo_ctrl。sdram_ctrl:其顶层为SDRAM的控制模块内部实例化了5个模块,有初始化、自刷新、写和读模块,还有一个仲裁模块对这四个不同操作进行分配;fifo_ctrl:其顶层为SDRAM的数据......
  • Android开发笔记[4]-串口控制esp32及使用摄像头
    摘要无需root权限,Android使用串口与esp32通信控制小灯开关;开启Android摄像头预览.平台信息AndroidStudio:ElectricEel|2022.1.1Patch2Gradle:distributionUrl=https://services.gradle.org/distributions/gradle-7.5-bin.zipjvmTarget='1.8'minSdk21targetSdk......
  • 3. 设计数据采集模块——基于FPGA的串口发送数据实验
    1.设计数据采集模块基于Send_en的可控设计。使得使用外部信号Data_done来启动数据发送成为可能。放弃使用Tx_done控制的做法。因此把控制Send_en的逻辑放到内部去完成。这样设计更加符合应用。1.1设计要求把Send_en的控制部分放到模块内部去,使用Send_Go作为输入信号可能......
  • 2. 串口发送数据任务——基于FPGA的串口发送数据实验
    1.串口发送数据任务任务要求:使用上一节课设计的串口发送模块,设计一个数据发送器,每10ms以115200的波特率发送一个比特,每次发送的数据比前一个数据大1(计数器)1.1设计思路模块化设计,使用上一节课设计好的发送模块1.2设计开始设计Uart_Byte_Tx(单字节发送)模块选择使用以......
  • ESP8266串口WiFi模块的四大创新型应用领域分析
    ESP8266串口WiFi模块顾名思义,这是一款基于ESP8266方案的串口WiFi模块,可将用户的物理设备连接到WiFi无线网络上,进行互联网或局域网通信,实现联网功能。ESP8266串口WiFi模块是一种适用性强、应用范围广泛的WiFi模块。 ESP8266串口WiFi模块根据当前物联网市场发展趋势,ESP8266串口WiFi......
  • C#串口开发
    C#串口开发主要使用的是System.IO.Ports.SerialPort类,其中详细成员介绍可参考MSDN文档。由于本机没有串口,需要使用VSPD虚拟串口工具创建2个虚拟串口,如下图中的COM1、COM2 使用winform创建如下界面,发送端COM1发送数据,接收端COM2接收数据,发送端和接收端的波特率、数据位、校验......
  • stm32笔记[9]-串口控制云台
    摘要基于stm32的云台控制程序,使用串口接收云台移动指令对云台进行控制.使用软件实现的PWM波发生方式.平台信息ArduinoIDEstm32f103c8t6接口S3:servo_bottom_pin:PA2S4:servo_top_pin:PA3S5:laser_pin:PB4S21:sl_in_pin:PA8S22:sr_out_pin:PB14S23:sl_out_pin:PB1......