fpga入门 串口定时1秒发送1字节

一、 程序说明

FPGA通过串口定时发送数据,每秒发送1字节,数据不断自增
参考小梅哥教程

二、 uart_tx.v

`timescale 1ns / 1ps

module uart_tx(
    input		wire 				    sclk,
	input		wire				    rst_n,
	output		reg	                   uart_tx
    );
    
parameter  		CLK_FREQ 	    = 50000000;	//时钟频率50M
parameter  		UART_BAUD 	    = 115200;	//时钟频率50M
parameter  		MAX_BIT_COUNT 	= 9;	//时钟频率50M
localparam 		MAX_BAUD_CNT 	= CLK_FREQ / UART_BAUD;//434

reg [7:0] write_data;   //发送数据

//运行计数器
reg [31:0] run_cnt;	//波特率计数器
always @(posedge sclk or negedge rst_n)
begin
    if(rst_n == 1'b0)
        run_cnt <= 32'd0;
    else if(run_cnt == CLK_FREQ)
         run_cnt <= 0;
    else
        run_cnt <= run_cnt + 1;
end

//波特率计数器
reg [8:0] baud_cnt;	//波特率计数器
reg en_baud_cnt;	//波特率计数器开关
always @(posedge sclk or negedge rst_n)
begin
    if(rst_n == 1'b0)
        baud_cnt <= 8'd0;
    else if(en_baud_cnt == 1'b1) begin
        if(baud_cnt == MAX_BAUD_CNT)
            baud_cnt <= 8'd0;
        else
            baud_cnt <= baud_cnt + 1;
    end
    else
        baud_cnt <= baud_cnt;
end

//发送位计数器
reg [4:0] bit_cnt = 0;	//波特率计数器
always @(posedge sclk or negedge rst_n)
begin
    if(rst_n == 1'b0)
        bit_cnt <= 4'd0;
    else if(baud_cnt == MAX_BAUD_CNT)
        begin
            if(bit_cnt ==  MAX_BIT_COUNT)
                bit_cnt <= 4'd0;
            else
                bit_cnt <= bit_cnt + 1;
        end
    else
        bit_cnt <= bit_cnt;
end 

//位发送逻辑
always @(posedge sclk or negedge rst_n)
begin
    if(rst_n == 1'b0)
        uart_tx <= 1'b0;
    else if(baud_cnt == MAX_BAUD_CNT/2)
        begin
            if(bit_cnt ==  0)
                uart_tx <= 1'b0;
            else if(bit_cnt == MAX_BIT_COUNT)
                uart_tx <= 1'b1;
            else
            begin
            case(bit_cnt)
                1:uart_tx <= write_data[0];
                2:uart_tx <= write_data[1];
                3:uart_tx <= write_data[2];
                4:uart_tx <= write_data[3];
                5:uart_tx <= write_data[4];
                6:uart_tx <= write_data[5];
                7:uart_tx <= write_data[6];
                8:uart_tx <= write_data[7];
                default:uart_tx <= uart_tx;
            endcase
            end
            //uart_tx <= write_data[bit_cnt-1];
        end
    else
        uart_tx <= uart_tx;
end

always @(posedge sclk or negedge rst_n)
begin
    if(rst_n == 1'b0)
        en_baud_cnt <= 1'b0;
    else if(run_cnt == 0) begin
        en_baud_cnt <= 1'b1;
    end
    else if(bit_cnt ==  MAX_BIT_COUNT && baud_cnt == MAX_BAUD_CNT)
        en_baud_cnt <= 1'b0;
    else
        en_baud_cnt <= en_baud_cnt;
end

always @(posedge sclk or negedge rst_n)
begin
    if(rst_n == 1'b0)
        write_data <= 8'd0;
    else if(run_cnt == 0)
        write_data <= write_data + 1;
    else
        write_data <= write_data;
end

endmodule

三、 运行截图

在这里插入图片描述

相关推荐

  1. 1. FPGA概述

    2024-06-06 15:56:03       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-06 15:56:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-06 15:56:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-06 15:56:03       82 阅读
  4. Python语言-面向对象

    2024-06-06 15:56:03       91 阅读

热门阅读

  1. 【SAP HANA 34】HANA查找函数LOCATE的使用

    2024-06-06 15:56:03       27 阅读
  2. Mybatis学习之Spring boot整合Mybatis示例

    2024-06-06 15:56:03       24 阅读
  3. 什么是HTTPS协议,与HTTP协议有什么区别

    2024-06-06 15:56:03       29 阅读
  4. 【杂记-webshell恶意脚本木马】

    2024-06-06 15:56:03       31 阅读
  5. PTA R6-1 寻找链表元素的前驱结点

    2024-06-06 15:56:03       30 阅读
  6. 逆序数求解算法

    2024-06-06 15:56:03       29 阅读
  7. CSRF 令牌的生成过程和检查过程

    2024-06-06 15:56:03       27 阅读
  8. Xilinx FPGA 管脚的默认电平配置方法 XDC约束

    2024-06-06 15:56:03       29 阅读
  9. shell 支持多线程

    2024-06-06 15:56:03       24 阅读