UART串口通信

一. 串口通信

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;
                  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值