首页 > 其他分享 >3. 设计数据采集模块——基于FPGA的串口发送数据实验

3. 设计数据采集模块——基于FPGA的串口发送数据实验

时间:2023-09-22 20:45:46浏览次数:40  
标签:Reset FPGA Tx Uart Send Go 串口 发送数据 reg

1. 设计数据采集模块

  • 基于Send_en的可控设计。使得使用外部信号Data_done来启动数据发送成为可能。放弃使用Tx_done控制的做法。因此把控制Send_en的逻辑放到内部去完成。这样设计更加符合应用。

1.1 设计要求

  1. Send_en的控制部分放到模块内部去,使用Send_Go作为输入信号
  2. 可能会出现端口的值出现变化,要确保发送的是当Send_Go出现的时刻时,端口中的数据。

1.2 设计思路

1.2.1 针对要求1的设计

  1. Send_en受到Send_Go的控制部分放到模块Uart_Byte_Tx当中,并把Uart_Byte_Tx中的参数Send_en改为Send_Go
  2. 在模块Uart_Tx中每10ms持续产生Send_Go信号,且Send_Go不受Tx_Done信号控制。

1.2.1 针对要求2的设计

  1. 每当接收到Send_Go信号时,缓存Data到变量r_Data当中。

2. 仿真结果

图2-1

  • 可以观察到数据正常发送

3. 最终代码

  • Uart_Byte_Tx代码
module Uart_Byte_Tx(
    Clk,
    Reset_N,
    Data,
    Send_Go,
    Baud_Set,
    Uart_Tx,
    Tx_Done
);

    input Clk;
    input Reset_N;
    input [7:0]Data;
    input Send_Go;
    input [2:0]Baud_Set;
    reg Send_En;
    output reg Uart_Tx;
    output reg Tx_Done;
    
    reg [12:0]Bps_Dr;
    always@(*)
        case(Baud_Set)
            0: Bps_Dr <= 1000000000 / 9600 / 20;
            1: Bps_Dr <= 1000000000 / 19200 / 20;
            2: Bps_Dr <= 1000000000 / 38400 / 20;
            3: Bps_Dr <= 1000000000 / 57600 / 20;
            4: Bps_Dr <= 1000000000 / 115200 / 20;
            default: Bps_Dr <= 1000000000 / 9600 / 20;
        endcase
    
    always@(posedge Clk or negedge Reset_N)
        if(!Reset_N)
            Send_En <= 0;
        else if(Send_Go)
            Send_En <= 1'b1;
        else if(Tx_Done)
            Send_En <= 0;

    reg [7:0]r_Data;
    always@(posedge Clk or negedge Reset_N)
        if(!Reset_N)
            r_Data <= 0;
        else if(Send_Go)
            r_Data <= Data;
        else
            r_Data <= r_Data;
    
    reg [12:0]Div_cnt;
    always@(posedge Clk or negedge Reset_N)
        if(!Reset_N)
            Div_cnt <= 0;
        else if(Send_En)
            if(Div_cnt == Bps_Dr - 1)
                Div_cnt <= 0;
            else
                Div_cnt <= Div_cnt + 1'b1;
        else
            Div_cnt <= 0;
    
    reg [3:0]Bps_cnt;
    wire Bps_Clk;
    assign Bps_Clk = (Div_cnt == 1);
    always@(posedge Clk or negedge Reset_N)
        if(!Reset_N)
            Bps_cnt <= 0;
        else if(Send_En)begin
            if(Bps_Clk)begin
                if(Bps_cnt == 11)
                    Bps_cnt <= 0;
                else
                    Bps_cnt <= Bps_cnt + 1'b1;
            end
        end
        else
            Bps_cnt <= 0;
    
    always@(posedge Clk or negedge Reset_N)
        if(!Reset_N)begin
            Uart_Tx <= 1'b1;
            Tx_Done <= 0;
        end
        else
        case(Bps_cnt)
            1: Uart_Tx <= 0;
            2: Uart_Tx <= r_Data[0];
            3: Uart_Tx <= r_Data[1];
            4: Uart_Tx <= r_Data[2];
            5: Uart_Tx <= r_Data[3];
            6: Uart_Tx <= r_Data[4];
            7: Uart_Tx <= r_Data[5];
            8: Uart_Tx <= r_Data[6];
            9: Uart_Tx <= r_Data[7];
            10: Uart_Tx <= 1'b1;
            11: Uart_Tx <= 1'b1;
            default: Uart_Tx <= 1'b1;
        endcase
            
    always@(posedge Clk or negedge Reset_N)
        if(!Reset_N)
            Tx_Done <= 0;
        else if((Bps_cnt == 10) && Bps_Clk)
            Tx_Done <= 1'b1;
        else
            Tx_Done <= 0;
endmodule
  • Uart_Tx代码
module Uart_Tx(
    Clk,
    Reset_N,
    Uart_Tx
    );
    
    input Clk;
    input Reset_N;
    reg Send_Go;
    output Uart_Tx;
    reg [7:0]Data;
    reg Send_En;
    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 [18:0]cnt;
    always@(posedge Clk or negedge Reset_N)
        if(!Reset_N)
            cnt <= 0;
        else if(cnt == 499999)
            cnt <= 0;
        else
            cnt <= cnt + 1'b1;

    always@(posedge Clk or negedge Reset_N)
        if(!Reset_N)
            Send_Go <= 0;
        else if(cnt == 1)
            Send_Go <= 1;
        else
            Send_Go <= 0;

    always@(posedge Clk or negedge Reset_N)
        if(!Reset_N)
            Data <= 0;
        else if(Tx_Done)
            Data <= Data + 1'b1;
        else
            Data <= Data;
endmodule

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

相关文章

  • 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......
  • 串口通信介绍
    串口通信简介串口通信(SerialCommunications)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并......
  • Gowin_9K FPGA开发板介绍
    一板卡简介高云半导体GW1NR系列FPGA产品是高云半导体小蜜蜂®(LittleBee®)家族第一代产品,是一款系统级封装芯片,在GW1N基础上集成了丰富容量的存储芯片,同时具有低功耗、瞬时启动、低成本、非易失性、高安全性、封装类型丰富、使用方便灵活等特点。Gowin_9KFPGA板采......
  • FPGA 让2个LED灯按照设置的模式各自在一个变化循环内独立亮灭变化
    代码如下://让多个LED灯按照设置的模式各自在一个变化循环内独立亮灭变化。modulecounter_led_5(Clk,Reset_n,CtrlA,CtrlB,Time,Led);inputClk;inputReset_n;input[7:0]CtrlA;input[7:0]CtrlB;input[31:0]Time;......
  • FPGA 让LED灯按照指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定
    代码内容如下:modulecounter_led_3(Clk,Reset_n,Ctrl_n,Led);inputClk;inputReset_n;input[7:0]Ctrl_n;outputregLed;reg[26:0]counter;parameterMCNT=100000000;always@(posedgeClkornegedgeRe......
  • FPGA开发板实验目录
     数字逻辑基础实验   实验文件夹名称   实验说明   lab1   4位并入串出移位寄存器   lab2   4位串入串出移位寄存器   lab3   5位串入并出移位寄存器   lab4   8线-3线编码器   lab5   8线-3线优先编码器   lab6   38......
  • 04_串口打印print函数
    串口打印print函数intfputc(intch,FILE*f){ HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1000); returnch;}......