文章目录
一.串口通信
什么是串口?
LSB:低位 MSB:高位
二.串口发送模块
①文件方式保存常量
常用波特率新建一个文件保存
uart_parameter.v
`define CLOCK 50_000_000
`define BAUD_9600 `CLOCK/9600 - 1 //发送1比特的时间
`define BAUD_19200 `CLOCK/19200 - 1
`define BAUD_38400 `CLOCK/38400 - 1
`define BAUD_57600 `CLOCK/57600 - 1
`define BAUD_115200 `CLOCK/115200 - 1
②串口发送模块
该模块实现接收8位并行数据处理后串行输出。
该模块使用了uart_parameter.v文件的内容,使用语句`include "XXX.v"引用。
uart_tx.v
`include "uart_parameter.v"
module uart_tx(
input wire clk ,//时钟信号
input wire rst_n ,//复位信号
input wire [2:0] baud_set,//波特率选择
input wire [7:0] data_in ,//接收的并行数据
input wire rx_done ,//接收方,信息处理完毕信号
output reg data_tx //将并行数据处理为串行并输出
);
reg [12:0] baud_rate;//波特率
reg [12:0] cnt_baud ;//波特率计数寄存器
reg [3 :0] cnt_bit ;//比特计数寄存器 一帧有10bit,1位起始位,8位数据位,1位结束位
reg work_en ;//工作使能 1:工作状态 0:非工作状态
reg bit_flag ;//数据采集信号 1:采集 0:不采集
wire bit_done;//10bit数据采集结束
wire end_bit;//bit结束
wire start_bit;//bit开始
//波特率设置
always@(*)begin
case(baud_set)
3'd0 : baud_rate = `BAUD_9600;
3'd1 : baud_rate = `BAUD_19200;
3'd2 : baud_rate = `BAUD_38400;
3'd3 : baud_rate = `BAUD_57600;
3'd4 : baud_rate = `BAUD_115200;
default: baud_rate = `BAUD_9600;
endcase
end
//工作使能信号处理
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
work_en <= 1'b0;
end
else if(bit_done)begin//10bit数据采集结束,工作使能设置为非工作状态
work_en <= 1'b0;
end
else if(rx_done)begin//接收方信息处理完毕,工作使能设置为工作状态,继续发送数据
work_en <= 1'b1;
end
else begin
work_en <= work_en;
end
end
assign bit_done = cnt_bit == 4'd9 && cnt_baud == 13'd1;//当比特计数从0达到9 且波特率计数器数到1 最后一个bit数据采集完毕
//波特率计数器
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt_baud <= 13'd0;
end
else if(cnt_baud == baud_rate || work_en == 1'b0)begin//当波特率计数器数到波特率最大值,或非工作状态 波特率计数器清零
cnt_baud <= 13'd0;
end
else if(work_en == 1'b1)begin//处于工作状态,波特率计数器累加1
cnt_baud <= cnt_baud + 1'd1