您当前的位置: 首页 >  ar

FPGA硅农

暂无认证

  • 0浏览

    0关注

    282博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【数字IC/FPGA】UART的Verilog实现

FPGA硅农 发布时间:2022-03-16 08:58:43 ,浏览量:0

UART

通用异步收发器(Universal Asynchronous Receiver/Transmitter,UART)可以和各种标准串行接口,如RS 232和RS 485等进行全双工异步通信,具有传输距离远、成本低、可靠性高等优点。一般UART由专用芯片如8250,16450来实现,但专用芯片引脚都较多,内含许多辅助功能,在实际使用时往往只需要用到UART的基本功能,使用专用芯片会造成资源浪费和成本提高。 UART只需要两条信号线:RXD和TXD,其中RXD是UART的接收端,TXD是UART的发送端,接收与发送是全双工形式。下图为UART的工作原理如下 在这里插入图片描述 如上图所示,uart是将传输数据的每个字符一位接一位地传输。 其中每一位(Bit)的意义如下: 空闲位:高电平,表明当前无传输事务。 起始位:一位低电平信号,标志着数据传输的开始。 数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。 奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。 停止位:一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。 uart数据传输的速率用波特率表示,其含义为从一设备发到另一设备,每秒钟可以通信的数据比特个数。典型的波特率有300, 1200, 2400, 9600, 19200, 115200等。一般通信两端设备都要设为相同的波特率,但有些设备也可设置为自动检测波特率。

UART的Verilog实现

uart的设计分为两个部分,一部分为发送模块,另一部分为接收模块。程序设计主要通过状态机实现,在本设计中,我们略去了奇偶校验位,每次传输8bit数据,且停止位为1位。 我们共设置了如下几个状态: IDLE:空闲状态,电平恒为1; START:起始位,电平为0,1位; DATA:数据位,共8位,先发送低比特; STOP:停止位,高电平,共1位。 其中,发送模块在上一状态向下一状态切换时,改变电平,而接收模块,则在状态的中间位置进行采样,如下图所示: 在这里插入图片描述

代码实现 发送模块
`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/02/26 15:27:26
// Design Name: 
// Module Name: uart_tx_sim
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module uart_tx_sim
#(parameter BPS=5208)
(
input clk,
input rst_n,
input start,
input [7:0] send_data,
output reg rs232_tx
    );

//
// parameter BPS=5208;          //计算传输一次的计数时间:
//                              //计数时间 = 1000000000ns/9600 = 104166.7ns
//                              //50MHz的时钟周期为20ns,所以计数传输一个比特的次数为104166.7 / 20 = 5208
parameter IDLE = 0;
parameter START = 1;      //起始位
parameter SEND = 2;       //8bit数据发送,最低位开始传送,靠时钟定位。
parameter STOP =3;        //停止位
reg [2:0] cur_state;
reg [2:0] next_state;
reg [31:0] count;         //计数器
reg [31:0] send_cnt;      //发送bit计数器
//三段式状态机
always@(posedge clk,negedge rst_n)
if(~rst_n)
    cur_state            
关注
打赏
1658642721
查看更多评论
0.0385s