近期调试FPGA,用到串口模块,之前没写过串口发送16位数的实验,最近调试通了,上来分享一下。
主要思想其实和正常的串口发送模块差不多,就是多定义几个状态变量,设置好时序就行。本模块实现的功能是:时钟来之后开始计数,计到一定值之后启动串口发送模块,将数发送出去。就是很简单的串口发送模块,主要提供给初学者参考。
module UART_Tx(
input clk,
input rst_n,
output reg txd
);
parameter S_IDLE = 5'd0; //空闲状态
parameter S_START_L = 5'd1; //发送低八位起始位
parameter S_BIT0_L = 5'd2; //发送低八位数据位
parameter S_BIT1_L = 5'd3;
parameter S_BIT2_L = 5'd4;
parameter S_BIT3_L = 5'd5;
parameter S_BIT4_L = 5'd6;
parameter S_BIT5_L = 5'd7;
parameter S_BIT6_L = 5'd8;
parameter S_BIT7_L = 5'd9;
parameter S_STOP_L = 5'd10; //发送低八位停止位
parameter S_WAIT = 5'd11; //等待一个串口时钟周期
parameter S_START_H = 5'd12; //发送高八位起始位
parameter S_BIT0_H = 5'd13; //发送高八位数据位
parameter S_BIT1_H = 5'd14;
parameter S_BIT2_H = 5'd15;
parameter S_BIT3_H = 5'd16;
parameter S_BIT4_H = 5'd17;
parameter S_BIT5_H = 5'd18;
parameter S_BIT6_H = 5'd19;
parameter S_BIT7_H = 5'd20;
parameter S_STOP_H = 5'd21; //发送高八位停止位
parameter CLK_F = 125000000; //system clock frequency
parameter UART_BPS = 9600; //串口波特率
localparam BPS_CNT = CLK_F/UART_BPS; //相应波特率分频计数器
parameter cnt=60000; //计数器记到cnt值后串口输出该值
reg [4:0] state;
reg[15:0] bit_timer; //用于控制波特率的计数器如果波特率是115200,每个数据位50000000/115200个时钟周期
reg[15:0] tx_data; //串口发送接口
reg[7:0] tx_data_h; //串口发送的高八位数据
reg[7:0] tx_data_l; //串口发送的低八位数据
always&#