UART串口通信协议的FPGA实现

UART串口通信协议的FPGA实现引言 UART 串口通信协议 全称叫做通用异步收发传输器 UniversalAsy Transmitter 通常称作 UART UART 是异步通信 它只需要一根线就可以进行数据的通信 1 基本概念波特率 指每秒传输的 bit 位数 bit 一般波特率都会有 9600 15200 等选项 起始位 先发出一个逻辑 0 信号 表示传输字符的开始 数据位 可以是 5 8 位逻辑 0 或 1 如 ASCII 码 7 位 扩展 BCD 码 8 位 一般情况下都选择 8 位而

引言

      UART串口通信协议,全称叫做通用异步收发器(Universal Asynchronous Receiver/Transmitter),通常称作UART。UART是异步通信,它只需要一根线就可以进行数据的通信。

1、基本概念

  • 波特率:指每秒传输的bit位数(bit)。一般波特率配置为4800,9600,等;
  • 起始位:先发出一个逻辑”0”信号,表示传输字符的开始;
  • 数据位:可以是5~8位逻辑”0”或”1”。一般情况下都选择8位而不选择7,因为这样能尽可能避免数据的丢失或者混乱。从数据低位开始传输(即从LSB端开始发送数据,而且是串行发送);
  • 校验位:当数据位加上校验位后,当1”的位数为偶数时,叫做偶校验,为奇数时,叫做奇校验,主要用于差错控制;
  • 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平;
  • 空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送。

   具体的时序图如下图所示:

在这里插入图片描述

2、Verilog实现代码

  • uart_tx.v
module uart_tx #( parameter BAUD_DIV = 14'd10416 //波特率时钟,9600bps,100Mhz/9600=10416,波特率可调,意为一位数据占用多少时钟周期 ) ( input clk, //100M时钟 input [7:0] uart_tx_data_i, //待发送数据 input uart_tx_en_i, //发送发送使能信号 output uart_tx_o, //串口输出 output uart_tx_done // 串口发送结束信号 1:正在发送 0:发送完成 ); parameter BAUD_DIV_CAP = BAUD_DIV / 2; //波特率时钟中间采样点,100Mhz/9600/2=5208,波特率可调 //-------------------------串口计数,中值采样---------------------- reg [13:0] baud_div=0; //波特率设置计数器 reg baud_bps=0; //数据发送点信号,高有效 reg uart_send_flag=0; //数据发送标志位 always@(posedge clk) begin if(baud_div==BAUD_DIV_CAP) //当波特率计数器计数到数据发送中点时,产生采样信号baud_bps,用来发送数据 begin baud_bps<=1'b1; baud_div<=baud_div+1'b1; end else if(baud_div 
  
  • uart_rx.v 
module uart_rx #( parameter [13:0] BAUD_DIV = 14'd10416 //波特率时钟,9600bps,100Mhz/9600=10416 ) ( input clk, input uart_rx_i, output [7:0] uart_rx_data_o, output uart_rx_done ); parameter BAUD_DIV_CAP = BAUD_DIV /2;//波特率时钟中间采样点,100Mhz/9600/2=5208 //------------------------计数控制------------------------------- reg [13:0] baud_div=0; //波特率设置计数器 reg baud_bps=0; //数据采样点信号 reg bps_start=0; //波特率启动标志 always@(posedge clk) begin if(baud_div==BAUD_DIV_CAP) //当波特率计数器计数到采样点时,产生采样信号baud_bps begin baud_bps<=1'b1; baud_div<=baud_div+1'b1; end else if(baud_div 
  
  •  uart_tb.v
`timescale 1ns/1ps module uart_tb (); reg clk; //100M时钟 reg [7:0] uart_tx_data_i; //待发送数据 reg uart_tx_en_i; //发送发送使能信号 wire uart_tx_o; //串口输出 wire uart_tx_done; // 串口发送结束信号 1:正在发送 0:发送结束 wire [7:0] uart_rx_data_o;//接受并行数据 wire uart_rx_done;//接收结束信号 reg [8:0] tx_data_r[0:39];//待发送数据寄存数组 reg [5:0] tx_icount;//发送计数 initial begin clk = 1'b1; //寄存器组赋初值 $readmemh("F:/PID/uart/tx_data.txt",tx_data_r); tx_icount = 6'd0; end always #5 clk = ~clk; //输入数据 always @ (posedge clk) begin if(!(uart_tx_done) && (!uart_tx_en_i))begin//控制上一数据传输完成然后输入下一数据 uart_tx_en_i <= 1'b1; uart_tx_data_i <= tx_data_r[tx_icount]; tx_icount <= tx_icount + 1'd1; if(tx_icount == 6'd40) tx_icount <= 6'd0; end else uart_tx_en_i <= 1'b0; end uart_tx tx_demo( .clk(clk), .uart_tx_data_i(uart_tx_data_i), .uart_tx_en_i(uart_tx_en_i), .uart_tx_o(uart_tx_o), .uart_tx_done(uart_tx_done) ); uart_rx rx_demo( .clk(clk), .uart_rx_i(uart_tx_o), .uart_rx_data_o(uart_rx_data_o), .uart_rx_done(uart_rx_done) ); endmodule 
  • 仿真波形

UART串口通信协议的FPGA实现

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214278.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午4:38
下一篇 2026年3月18日 下午4:38


相关推荐

  • 即梦,口型15秒以上的怎么制作

    即梦,口型15秒以上的怎么制作

    2026年3月12日
    2
  • MySQL安装配置教程(超详细!)

    MySQL安装配置教程(超详细!)Windows下有两种安装MySQL的方式:图形界面安装(.msi文件)免安装版(.zip压缩文件)MySQL下载官网:http://www.mysql.com也可前往百度网盘提取(两种安装方式文件都有):链接:https://pan.baidu.com/s/1NMRUu_E098h4ErzSXTUKgA提取码:3tfb一、MySQL免安装版配置教程http://c.biancheng.net/view/2412.html二、MySQL图形界面安装(一)安装MySQL1.打开安

    2022年5月31日
    40
  • MySql数据库约束

    关系型数据库系统和文件系统的一个不同点是,关系数据库本身能保证存储数据的完整性,不需要应用程序的控制,而文件系统一般需要在程序端进行控制。当前几乎所有的关系型数据库都提供了约束(constraits)

    2021年12月28日
    44
  • Effective C++:条款28:避免返回 handles 指向对象内部成员

    Effective C++:条款28:避免返回 handles 指向对象内部成员

    2021年12月16日
    99
  • css绝对定位的参照物是什么_css 清除上定位

    css绝对定位的参照物是什么_css 清除上定位css绝对定位的重新认知所谓的css绝对定位,就是position:absolute;这里记录一个我的错误认知,就是绝对定位的参照物是内容,还是内容+内边距,我一直以为参照物就是内容,但是实际上参照物是内容+内边距看看下面的事例<!DOCTYPEhtml><html><head><metachars…

    2025年7月28日
    4
  • 适配器的作用计算机网络,网络适配器的作用

    适配器的作用计算机网络,网络适配器的作用网络适配器是计算机用来联网的一种设备,也就是网卡。一般这种设备就在主板的插槽中插着,它的工作原理就是通过网络介质来传输一些数据,并转为其他的格式,使这种格式能够被其他的设备所识别。网络适配器的技术参数有很多,例如带宽、电气接口方式等。网络适配器又称网卡或网络接口卡(NIC),英文名NetworkInterfaceCard。它是使计算机联网的设备。平常所说的网卡就是将PC机和LAN连接的网络适配器。…

    2022年6月1日
    63

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号