从零开始的FPGA学习10-UART串口/HC-05蓝牙模块接收数据

基本原理

在这里插入图片描述

协议简介

协议简介:

UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。

其中每一位(Bit)的意义如下:

起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。

数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。

奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。

停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送。

工作原理

发送数据过程:空闲状态,线路处于高电位;当收到发送数据指令后,拉低线路一个数据位的时间T,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位(停止位为高电位),一帧数据发送结束。

接收数据过程:空闲状态,线路处于高电位;当检测到线路的下降沿(线路电位由高电位变为低电位)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备准备接收数据或存入缓存。

由于UART是异步传输,没有传输同步时钟。为了能保证数据传输的正确性,UART采用16倍数据波特率的时钟进行采样。每个数据有16个时钟采样,取中间的采样值,以保证采样不会滑码或误码。一般UART一帧的数据位数为8,这样数据即使有一个时钟的误差,接收端也能正确地采到数据。

本文采用的比特率是9600bps,也就是1s传输9600bit的数据

源代码


module UART_Ctrl(
    input i_clk,
    input i_rx,
    output reg[1:0]LED
    );
    
    reg [1:0]ack_o_buff=0;
    wire [7:0]o_rx_data;
    wire o_rx_rq;
    
    //实例化UART
    Driver_UART UART0(
        .i_clk(i_clk),
        .i_rst(1),
        .i_en_rx(1'b1),
        .i_set_baudrate(1'b1),
        .i_baudrate(31'd9600),
        .i_rx(i_rx),
        .o_rx_data(o_rx_data),
        .o_rx_rq(o_rx_rq)
    );
    always@(posedge i_clk)begin
        ack_o_buff<={
   ack_o_buff[0],o_rx_rq};
        if(ack_o_buff==2'b01)
            LED<=o_rx_data[1:0];
        else LED<=LED;
    end
endmodule

module Driver_UART(
    input i_clk,
    input i_rst,
    input i_en_rx,
    input i_set_baudrate,
    input [30:0]i_baudrate
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值