0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

解析常用串行总线——UART协议(下)

jf_78858299 来源:Cascatrix 作者:Carson 2023-01-21 16:53 次阅读

2. 接收模块 (uart_rx):

module uart_rx (

clk_40k, //clock signal, 40kHz

rst_n, //reset signal, active low

bit_in, //the input serial bit,

dout_vld,//the output valid signal, active high,the dout is valid when this signal is high.

dout //received data, 8 bit width

);

input bit_in;

input clk_40k;

input rst_n;

output reg dout_vld;

output reg [7:0] dout;

reg rx_flag;

reg [6:0] cnt;

reg [5:0] rx_cnt;

reg [7:0] dout_temp;

//rx_flag: 接收过程rx_flag始终拉高

always @ (posedge clk_40k)

begin

if(~rst_n)

rx_flag <= 1'b0;

else if(bit_in == 1'b0)

rx_flag <= 1'b1;

else if(rx_cnt == 6'd9)

rx_flag <= 1'b0;

end

//cnt: 接收数据计数,clk_40k分频至1k波特率对接收数据进行计数

always @ (posedge clk_40k)

begin

if(~rst_n)

cnt <= 7'b0;

else if(rx_flag == 1'b1 && cnt != 7'd39)

cnt <= cnt + 1'b1;

else if(rx_flag == 1'b0 || cnt == 7'd39)

cnt <= 7'b0;

end

always @ (posedge clk_40k)

begin

if(~rst_n)

rx_cnt <= 6'b0;

else if(rx_flag == 1'b1 && cnt == 7'd39)

rx_cnt <= rx_cnt + 1'b1;

else if(rx_flag == 1'b0)

rx_cnt <= 6'b0;

end

//dout_temp: 将串行接收数据转换还原为8bit数据

always @ (posedge clk_40k)

begin

if(~rst_n)

dout_temp <= 8'b0;

else if(rx_flag == 1'b1 && cnt == 7'd39)

begin

dout_temp[7] <= bit_in;

dout_temp[6:0] <= dout_temp[7:1];

end

end

//dout_vld: 传输完成标识,8bit数据传输结束拉高

always @ (posedge clk_40k)

begin

if(~rst_n)

dout_vld <= 1'b0;

else if(rx_cnt == 6'd9 && cnt == 7'b0)

begin

dout <= dout_temp;

dout_vld <= 1'b1;

end

else

dout_vld <= 1'b0;

end

endmodule

3. Testbench(tb):

`timescale 1us/1us

module tb();

reg clk_40k;

reg rst_n;

reg [7:0] din;

reg send_start;

wire bit_out;

wire bit_in;

wire dout_vld;

wire [7:0] dout;

assign bit_in = bit_out;

uart_tx i_uart_tx(

.clk_40k (clk_40k ),

.rst_n (rst_n ),

.din (din ),

.send_start (send_start),

.bit_out (bit_out )

);

uart_rx i_uart_rx(

.clk_40k (clk_40k ),

.rst_n (rst_n ),

.bit_in (bit_in ),

.dout_vld (dout_vld ),

.dout (dout )

);

initial

begin

rst_n = 1'b0;

#10

rst_n = 1'b1;

end

initial

begin

clk_40k = 1'b0;

forever

#1

clk_40k = ~clk_40k;

end

initial

begin

send_start = 1'b0;

din = 8'd0;

forever

begin

    #1000

    din = $random()%256;

    send_start = 1'b1;

    #2

    send_start = 1'b0;

end

end

endmodule

4. 仿真结果 :

按照testbench对UART收发端进行仿真,仿真结果如图:

图片

  1. 系统时钟和传输速率通常不一致,clk_40k为高频系统时钟,利用计数器分频实现1k波特率;
  2. 复位信号rst_n低电平有效,正常传输时始终处于高电平。
  3. 开始传输时send_start信号拉高,传输结束时dout_vld信号拉高;
  4. 输入数据din在传输结束后在输出数据dout体现出来,传输时延为1个数据长度。

04

UART的优缺点

4.1 UART协议优点

  1. 通信只需要两条数据线;
  2. 无需时钟信号;
  3. 有奇偶校验位,方便通信的差错检查;
  4. 只需要接收端和发送端设置好数据包结构,即可稳定通信。

4.2 UART协议缺点

  1. 数据帧最大支持9位数据;
  2. 不支持多主机或多从机的主从系统。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 串行
    +关注

    关注

    0

    文章

    237

    浏览量

    33788
  • uart
    +关注

    关注

    22

    文章

    1227

    浏览量

    101160
  • 通讯接口
    +关注

    关注

    2

    文章

    80

    浏览量

    16171
收藏 人收藏

    评论

    相关推荐

    常用的串口通信协议UART异步串行通信简析

    UART是异步串行通信口的总称。它所包含的RS232RS449RS423等等是对应各种异步串行通信口的接口标准和总线标准。他们规定了通信口的电气特性、传输速率、连接特性和机械特性等一系
    发表于 07-10 09:06 3133次阅读

    常用串行总线(一)——UART协议(Verilog实现)

    通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,
    发表于 01-05 09:48 3711次阅读

    UART串口通讯协议解析

    ,协议如下: 起始位 数据位 奇偶校验位 停止位 1bit 5-9bit 0-1bit 1-2bit 空闲位 :UART协议规定,当总线处于空闲状态时信号线的状态为‘1’即高电平,表示
    发表于 09-12 16:01

    SPI、I2C、UART三种串行总线协议的区别

    实现从设备,则只需输入口即可。I2C总线是双向、两线(SCL、SDA)、串行、多主控(multi-master)接口标准,具有总线仲裁机制,非常适合在器件之间进行近距离、非经常性的数据通信。在它的
    发表于 11-02 09:48

    UART串口通讯协议是什么

    UART串口通讯协议解析概述接口通信协议概述通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作
    发表于 07-29 08:07

    常用串行总线协议有哪些

    一、常用串行总线协议目前常用的微机与外设之间进行数据传输的串行
    发表于 11-03 07:14

    常用串行总线协议有哪些

    常用串行总线协议I2C总线、SPI总线、SCI总线
    发表于 11-19 06:46

    串行通信中的IIC总线工作原理是什么

    串行通信中的IIC总线工作原理51本身不带IIC总线 ,使用程序模拟IIC通信协议常用串行
    发表于 12-08 07:52

    SPI、I2C、UART串行总线协议

    串口通讯通信协议UART,以及常用外设通信协议 SPI、I2C的介绍与他们之间的区别
    发表于 11-30 11:28 95次下载

    SPI、I2C、UART三种串行总线协议的区别

    SPI、I2C、UART三种串行总线协议的区别
    发表于 07-17 17:23 0次下载

    解析常用串行总线——UART协议(上)

    通用异步收发传输器** (Universal Asynchronous Receiver/Transmitter),通常称作UART。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,
    的头像 发表于 01-21 16:50 1743次阅读
    <b class='flag-5'>解析</b><b class='flag-5'>常用</b><b class='flag-5'>串行</b><b class='flag-5'>总线</b>——<b class='flag-5'>UART</b><b class='flag-5'>协议</b>(上)

    常用串行总线——SPI协议()

    SPI(Serial Perripheral Interface, 串行外围设备接口)** 是 Motorola 公司推出的一种同步串行接口技术。SPI 总线在物理上是通过接在外围设备微控制器
    的头像 发表于 01-21 17:03 958次阅读
    <b class='flag-5'>常用</b><b class='flag-5'>串行</b><b class='flag-5'>总线</b>——SPI<b class='flag-5'>协议</b>(<b class='flag-5'>下</b>)

    讨论使用UART通信协议的基本原则

    UART,即通用异步接收器/发送器,是最常用的设备间通信协议之一,正确配置后,UART可以配合许多不同类型的涉及发送和接收串行数据的
    的头像 发表于 02-01 17:54 996次阅读

    UART协议的工作原理和应用场景

    UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)协议是一种广泛使用的串行通信协议,它允许计算机与外部设备之间通过
    的头像 发表于 08-25 17:15 2352次阅读

    UART通信协议介绍和数据传输工作流程

    UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可实现全双工传输和接收。UART常用
    的头像 发表于 10-24 14:20 351次阅读
    <b class='flag-5'>UART</b>通信<b class='flag-5'>协议</b>介绍和数据传输工作流程