基于verilog实现的UART

UART介绍

通用异步收发器(Univeral Asynchronous Receiver/Transmitter,UART)。UART相关特点的总结如下表所示。

特点 UART 解释
信号线 RX TX RX负责接收、TX负责发送。
通信方式 全双工通信 通信允许数据在两个方向上同时传输,即RX接收数据时,TX可以发送数据。
通信特征 异步串行 数据以帧为单位串行传输,一帧可以包含5/6/7/8位数据。由于UART为异步通信协议,不含同步时钟,收发双方通过约定相同的波特率来传输数据,波特率的单位为bit/s(位/秒),常用的波特率为115200 bit/s或9600 bit/s。
传输单位 UART以帧为单位传输数据,一个帧由4部分组成,分别是起始位数据位奇偶校验位停止位。起始位表示一帧数据的开始,一般为1 bit的0;数据位保存需要传递的数据,一般为5/6/7/8 bit数据;奇偶检验位负责对传输的数据进行检查,用于检验数据在传输时是否出错;停止位表示一帧数据的结束,一般为1 bit、1.5 bit或2 bit的1。

UART实现

约定UART的帧格式和波特率。

  • 帧格式
    • 起始位:1 bit,0有效。
    • 数据位:8 bit。
    • 奇偶校验位:0 bit
    • 停止位:1 bit,1有效。
  • 波特率
    • 9600 bit/s

传输模块

`timescale 1ns / 1ps
module uart_tx (
input wire clk_i,
input wire rst_i,

input wire [7:0] data_i,
input wire tx_en_i,

output reg tx_data_o
);
// 波特率 9600
parameter BPS = 9600;
// 时钟频率 50MHz
parameter CLK_FREQ = 50000000;

localparam BPS_CNT = CLK_FREQ / BPS;

localparam IDLE = 0;
localparam START = 1;
localparam SEND = 2;
localparam STOP = 3;

// 分频计数
reg [31:0] count;
// 已传输的bit数
reg [31:0] send_count;

reg [1:0] cur_state;
reg [1:0] next_state;
// 三段式状态机
// cur_state
always @ (posedge clk_i) begin
    if(rst_i == 1'b1) begin
        cur_state <= IDLE;
    end else begin
        cur_state <= next_state;
    end
end
// next_state
always @ (*) begin
case(cur_state)
    IDLE : begin
        if(tx_en_i == 1'b1) begin
            next_state = START;
        end else begin
            next_state = IDLE;
        end
    end
    START : begin
        if(count == BPS_CNT - 1) begin
            next_state = SEND;
        end else begin
            next_state = START;
        end
    end
    SEND : begin
        if(send_count == 8 - 1 && count == BPS_CNT - 1) begin
            next_state = STOP;
        end else begin
            next_state = SEND;
        end
    end
    STOP : begin
        if(count == BPS_CNT - 1) begin
            next_state = IDLE;
        end else begin
            next_state = STOP;
        end
    end
    default : next_state = IDLE;
endcase
end
// count
always @ (posedge clk_i) begin
    if(rst_i == 1'b1) begin
        count <= 0<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值