首页 > 其他分享 >FPGA 串口发送

FPGA 串口发送

时间:2023-09-24 13:31:43浏览次数:27  
标签:Baud set tx FPGA Send 发送 en 串口 波特率

UART(通用异步收发传输器)

1.串口通信模块设计的目的是用来发送数据的,因此需要有一个数据输入端口;

2.串口通信,支持不同的波特率,所以需要有一个波特率设置端口;

3.串口通信的本质就是将8位的并行数据通过一根信号线,在不同的时刻传输并行数据的不同位,通过多个时刻,最终将8位并行数据全部传出;

4.串口通信以1位的低电平标志串行传输的开始,待8位数据传输完成之后,再以1位的高电平标志传输的结束;

5.控制信号,控制并转串模块什么时候开始工作?什么时候一个数据发送完成?须有一个发送开始信号,以及一个发送完成信号

代码内容如下:

module uart_byte_tx(
    Clk,
    Reset_n,
    Data,
    Send_en,
    Baud_set,
    uart_tx,
    Tx_done
);
    input Clk;
    input Reset_n;
    input [7:0]Data;
    input Send_en;
    input Baud_set;
    output reg uart_tx;
    output reg Tx_done;
    
    //Baud_set = 0   就让波特率 = 9600;
    //Baud_set = 1   就让波特率 = 19200
    //Baud_set = 2   就让波特率 = 38400;
    //Baud_set = 3   就让波特率 = 57600;   
    //Baud_set = 4   就让波特率 = 115200; 
    
    //计算每个波特率对应的时间周期
    reg [17: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 = 1000000/115200/20;
            default bps_DR = 1000000000/9600/20;
        endcase
    //设计基础计数器
    wire bps_clk;
    assign bps_clk =(div_cnt == 1);
    reg [17:0]div_cnt;
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        div_cnt <= 0;
    else if(Send_en)
        begin
            if(div_cnt == bps_DR - 1)
                div_cnt <= 0;
            else 
                div_cnt <= div_cnt + 1'b1;
        end
    else
        div_cnt <= 0;
    //设计传入信号的计数器 总共发送十位数据 包括一个起始位和一个停止位,还有八个数据位
    reg [3:0]bps_cnt;
    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 <= 1'b0;
        end
    else 
        begin
            case(bps_cnt)
                1:
                begin 
                uart_tx <= 0;
                Tx_done <= 0;
                end
                2:uart_tx <= Data[0]; 
                3:uart_tx <= Data[1];
                4:uart_tx <= Data[2];
                5:uart_tx <= Data[3];
                6:uart_tx <= Data[4];
                7:uart_tx <= Data[5];
                8:uart_tx <= Data[6];
                9:uart_tx <= Data[7]; 
                10:uart_tx <=1;
                11:begin
                uart_tx <=1;
                Tx_done <=1'b1;
                end
                default uart_tx <=1;
            endcase
        end
endmodule

仿真代码内容如下:

`timescale 1ns / 1ps
 
module uart_byte_tx_tb();   
    reg Clk;
    reg Reset_n;
    reg [7:0]Data;
    reg Send_en;
    reg [2:0]Baud_set;
    wire uart_tx;
    wire Tx_done; 
    
    uart_byte_tx uart_byte_tx(
        .Clk(Clk),
        .Reset_n(Reset_n),
        .Data(Data),
        .Send_en(Send_en),
        .Baud_set(Baud_set),
        .uart_tx(uart_tx),
        .Tx_done(Tx_done)
    );
    
    initial Clk = 1;
    always#10 Clk = ~Clk;
    
    initial begin
        Reset_n = 0;
        Data = 0;
        Send_en = 0;
        Baud_set = 4;
        #201;
        Reset_n = 1;
        #100;
        Data = 8'h57;
        Send_en = 1;
        #20;
        @(posedge Tx_done);
        Send_en = 0;
        #20000;
        Data = 8'h75;
        Send_en = 1;
        #20;
        @(posedge Tx_done);
        #20000;
        Send_en = 0;
        $stop;
    end
    
endmodule

FPGA 串口发送_Verilog

标签:Baud,set,tx,FPGA,Send,发送,en,串口,波特率
From: https://blog.51cto.com/u_16055951/7585621

相关文章

  • RocketMq发送消息之批量消息
    概述批量发送消息能显著提高传递小消息的性能。限制是这些批量消息应该有相同的topic,相同的waitStoreMsgOK,而且不能是延时消息。此外,这一批消息的总大小不应超过4MB发送批量消息如果您每次只发送不超过4MB的消息,则很容易使用批处理,样例如下:Stringtopic="BatchTest";List<M......
  • 基于FPGA数字频率计的设计(可测频率、占空比、相位差)
    设计一款数字频率计,可测量1hz-100Mhz频率,占空比,以及两路同频时钟信号的相位差。测量频率的方法:等精度测量。等精度测量原理:测量的实际门控时间不是一个固定值,它与被测时钟信号相关,是被测时钟信号周期的整数倍。在实际门控信号下,同时对标准时钟和被测时钟信号的时钟周期进行计......
  • RocketMq发送消息之延迟消息
    延迟消息比如电商里,提交了一个订单就可以发送一个延时消息,1h后去检查这个订单的状态,如果还是未付款就取消订单释放库存。使用限制对比于rabbitmq中的延迟消息来说,rockermq并不支持任意时间的延迟,需要设置几个固定的延时等级,从1s到2h分别对应着等级1到18级//org/apache/rocket......
  • RockerMq发送消息之顺序消息
    顺序消息        消息有序指的是可以按照消息的发送顺序来消费(FIFO)。RocketMQ可以严格的保证消息有序,可以分为分区有序或者全局有序。        顺序消费的原理解析,在默认的情况下消息发送会采取RoundRobin轮询方式把消息发送到不同的queue(分区队列);而消费消......
  • RocketMQ发送消息之同步异步单向
    官网教程:https://rocketmq.apache.org/zh/docs/quickStart/01quickstart基于双主双从异步方式开启的前提下,在maven项目中引入下列依赖<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>4.9.1&l......
  • SQL Server 发送邮件功能
    execsp_configure'showadvancedoptions',1RECONFIGUREWITHOVERRIDEgoexecsp_configure'databasemailxps',1RECONFIGUREWITHOVERRIDEgo--2.创建邮件帐户信息EXECmsdb..Sysmail_add_account_sp@ACCOUNT_NAME='OCTMamiETL'......
  • 基于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(单字节发送)模块选择使用以......