前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UART接口控制器

UART接口控制器

作者头像
全栈程序员站长
发布2022-10-05 10:38:46
6520
发布2022-10-05 10:38:46
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

主设备与从设备通过总线来进行数据通信,是一个数字系统不可或缺的一部分,本篇讲述一种常见的总线控制器UART串行数据接口,也称为串口。 串口的标准一般有,RS-232、RS-422与RS-485标准,我们讲述的是RS-232接口信号。

1、接口信号定义

RS-232最常见的是9脚接口 表1-1:RS-232接口定义

在这里插入图片描述
在这里插入图片描述

在实际的应用中,我们只需要关注两个接口,数据接收(RXD)和数据发送(TXD),而其他的接口不需要理会。 串口的时序如图1-1所示:

在这里插入图片描述
在这里插入图片描述

结合时序图我们说明以下,串口收发数据的过程。在没有需要发送的数据时,接口的电平为高。在需发送的数据到达之前,先会有一个低电平的起始位。而后开始发送数据,而后会发送校验位,最后是停止位。结束后恢复高电平,等待下一个传送周期的起始位出现。 所以我们可以画出一个简单的收发结构图,如图1-2所示:

在这里插入图片描述
在这里插入图片描述

2、发送模块的设计

当数据准备好时,start信号为高电平,数据并行输入内部寄存器中,等时钟周期来了之后由低位到高位串行发送,代码如下:

代码语言:javascript
复制
module UART (clk,rst,start,data_in,TXD);
parameter fst_bit=1'b0; //开始位为低电平
parameter last_bit=1'b0; //传输结束信号
input clk,rst;
input start; //数据传输高电平有效
input [7:0]data_in;
output TXD;
reg [9:0]shift;   //内部寄存器
always@(posedge clk or negedge rst)
begin
if (!rst) shift<=10'b1111111111;
else if (start) shift<={ 
1'b1,data_in,1'b0};
else shift<={ 
1'b1,shift[9:1]};
end
assign TXD=shift[0];
endmodule

3、接收模块

接收模块的设计采用状态机设计,在无接收数据时,状态为初始状态init_s 开始接收时为接收状态rec_s,当状态在接收状态时内部计数器开始计数,当计数器达到8时输出数据状态复位。代码如下:

代码语言:javascript
复制
module UART_re2(clk,rst,data_out,XRD);
parameter init_s=2'b00;//初始状态
parameter rec_s=2'b01;//数据接收状态
input clk,rst;
input XRD;
output [7:0]data_out;
reg [7:0] data_out;
reg [3:0] count;//数据接收计数器
reg [7:0]data_reg;//数据寄存器
reg [1:0] state,next_state;
always@(posedge clk or negedge rst)
begin
if (!rst)
begin
state<=init_s;
data_out<=8'b0;
count <=4'b0;//初始化
end
else begin
state<=next_state; //状态转换
if (state==rec_s) begin
data_reg<={ 
XRD,data_reg[7:1]};//数据位移
count<=count+1'b1; //计数器计数
end
end
end
always@(state or XRD or count )
begin
next_state<=state; //激励
case(state)
init_s:if (!XRD) next_state<=rec_s;
rec_s: begin
if (count==4'b1000) begin
data_out<=data_reg;//数据输出
state<=init_s;
count<=4'b0000;
end 
else next_state<=state;
end
default:state<=init_s;
endcase
end	
endmodule 

仿真结果

测试代码如下:

代码语言:javascript
复制
module UART_t;
reg clk,rst;
reg [7:0]data_in;
reg start;
wire [7:0]data_out;
wire serial;
initial 
begin
clk=1'b0;
rst=1'b1;
start=1'b0;
data_in=8'b11110000;
#20 rst=1'b0;
#40 rst=1'b1; start=1'b1;
#100 start=1'b0;
end
always #50 clk=~clk;
UART U1(.clk(clk),.rst(rst),.start(start),.data_in(data_in),.TXD(serial));
UART_re2 U2(.clk(clk),.rst(rst),.data_out(data_out),.XRD(serial));
endmodule 
在这里插入图片描述
在这里插入图片描述

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月14日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、接口信号定义
  • 2、发送模块的设计
  • 3、接收模块
  • 仿真结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档