串口发送的数据: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

最低0.47元/天 解锁文章
1217

被折叠的 条评论
为什么被折叠?



