一. 串口通信
1.串口概念
2.串口时序
这里大多使用的是8bit数据位
注意:LSB是低位,MSB为高位,UART串口通信是一个低位先发的协议
串口的常用波特率有:9600,19200,38400,57600,115200
二.串口模块
1.串口接收模块
该模块的设计思路是,通过状态机来完成数据的起始位,数据位,奇偶校验位,以及停止的接收,来模拟整个数据的接收流程,之后再通过寄存器将数据位寄存,发送给其他模块。
/**************************************功能介绍***********************************
Date :
Author : WZY.
Version :
Description: 串口接收模块()
*********************************************************************************/
//模块例化
// uart_rx#
// (
// .BPS (115200),
// .CLK_FRE (50_000_000),
// .CHECK_BIT ("NONE")//NONE 不校验 DDO奇校验 EVEN偶校验
// ) uart_rx_inst
// (
// /*input wire */ .clk (clk),
// /*input wire */ .rst_n (rst_n),
// /*input wire */ .rx (),
// /*output wire */ .ready (),
// /*output wire [7:0]*/ .rx_data (),
// /*output wire */ .rx_data_vld ()
// );
//---------<模块及端口声名>------------------------------------------------------
module uart_rx#
(
parameter BPS = 115200,
parameter CLK_FRE = 50_000_000,
parameter CHECK_BIT = "NONE"//NONE 不校验 DDO奇校验 EVEN偶校验
)
(
input wire clk ,
input wire rst_n ,
input wire rx ,
output wire ready ,//表示rx已经准备好接收数据了
output wire [7:0] rx_data ,//rx的接收数据
output wire rx_data_vld//rx数据发送信号
);
//---------<参数定义>---------------------------------------------------------
parameter MAX_1bit = CLK_FRE/BPS;
//状态机参数定义
localparam IDLE = 5'b00001,//空闲状态等待数据输入
START = 5'b00010,//开始标志位接收状态
DATA = 5'b00100,//数据接收状态
CHECK = 5'b01000,//奇偶校验位接收
STOP = 5'b10000;//停止标志位接收状态
//---------<内部信号定义>-----------------------------------------------------
reg [4:0] cstate ;//现态
reg [4:0] nstate ;//次态
wire idle2start;
wire start2data;
wire data2stop ;
wire data2check;
wire check2stop;
wire stop2idle ;
reg [7:0] rx_data_r;
reg temp;//校验位接收
reg flag;//数据有效使能
//下降沿检测参数
reg rx_0;
reg rx_1;
wire nege;
//计数器参数
reg [3:0] num ;
reg [8:0] cnt_start ;
wire add_cnt_start ;
wire end_cnt_start ;
reg [11:0] cnt_data ;
wire add_cnt_data ;
wire end_cnt_data ;
reg [2:0] cnt_num ;
wire add_cnt_num ;
wire end_cnt_num ;
reg [8:0] cnt_stop ;
wire add_cnt_stop ;
wire end_cnt_stop ;
//****************************************************************
// rx控制状态机
//****************************************************************
//第一段:时序逻辑描述状态转移
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cstate <= IDLE;
end
else begin
cstate <= nstate;
end
end
//第二段:组合逻辑描述状态转移规律和状态转移条件
always @(*) begin
case(cstate)
IDLE : begin
if (idle2start) begin
nstate = START;
end
else begin
nstate = cstate;
end
end
START : begin
if (start2data) begin
nstate = DATA;
end
else begin
nstate = cstate;
end
end
DATA : begin
if (data2stop) begin
nstate = STOP;
end
else if (data2check) begin
nstate = CHECK;
end
else begin
nstate = cstate;
end
end
CHECK : begin
if (check2stop) begin
nstate = STOP;
end
else begin
nstate = cstate;
end
end
STOP : begin
if (stop2idle) begin
nstate = IDLE;
end
else begin
nstate = cstate;