FPGA串口收发(一):串口发送 - 源代码与仿真测试

串口发送的数据:0 -> A (1010) -> C (1100) ->0
时钟40MHz,波特率115200

1、源文件

uart_tx.v
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: Myminieye
// Engineer: Nill
//
// Create Date:  2020-05-29
// Design Name:
// Module Name:  uart_tx
// Project Name:
// Target Devices:
// Tool Versions:
// Description: 串口发送
// 三段式状态机,发送8位数据。波特率指定 115200
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
/////////////////////////////////////////////////////////////////////////////////
`define UD #1
module uart_tx #(
   parameter   BPS_NUM =  16'd347  // 时钟/波特率,用时钟周期构造波特率周期
    //  BPS_NUM = 40_000_000/115200 = 347.22 = 16'd347
    //  1 bit位宽所需时钟周期的个数。最长的波特率计数,10417,二进制有14位,取16位
    //  parameter BPS_4800: 40MHz set 8333 ; 50MHz set 10417  
    //  parameter BPS_9600: 40MHz set 4167 ; 50MHz set 5208  
    //  parameter BPS_115200: 40MHz set 347; 50MHz set 434    
)
(
    input clk,              //clock
    input [7:0]    tx_data, //等待发送的字节数据 uart tx data signal byte;
    

    input tx_pulse,         //外部传入,触发串口发送
    //input rx_finish,    //接收应答,表示接收完成(自发自收)
    output reg uart_tx,   // 发送模块串口发送信号线 uart tx transmit data line
    output tx_busy,        // 发送模块忙状态指示 uart tx module work states,high is busy;
    
    //仿真信号
    output reg tx_finish = 1'b0 //串口发送数据结束标志,8位数据发完,拉高一个BPS

);
//==========================================================================
//wire and reg 定义:信号与参数
//==========================================================================
    

    //parameter BPS_NUM_MID  = (BPS_NUM + 2'd1) / 2'd2 - 2'd1; //波特率周期的中间点
    reg [3:0] tx_cur_st    = 0;         //发送 当前状态
    reg [3:0] tx_nxt_st    = 0;         //发送 下一状态
    reg       tx_pulse_reg = 0;         //发送触发信号缓存
    reg [3:0] pulse_delay_cnt = 0;      //触发延时
    reg       tx_en = 0;                //开启串口发送,整个发送周期都拉高
    //data_gen模块 ,产生数据后,就开启串口发送  (write_en)->tx_en
    reg [2:0] tx_bit_cnt   = 0;         //发送位数,计数
    reg [15:0]clk_div_cnt  = 0;         //波特周期计数,计到一个波特周期
    reg [7:0] tx_data_reg  = 0;         //发送数据缓冲寄存器

//=================================================
// FSM Statement:状态声明
// 发送状态机4个状态:等待、发送起始位、发送数据、发送结束
//=================================================
    //one hot with zero idle
    localparam  [3:0] IDLE  = 4'b0000,  //tx state machine's state.空闲状态
                SEND_START  = 4'b0001,  //tx state machine's state.发送start状态
                SEND_DATA   = 4'b0010,  //tx state machine's state.发送数据状态
                SEND_STOP   = 4'b0100,  //tx state machine's state.发送stop状态
                SEN
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值