FPGA的UART完整设计说明
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章UART设计
3.1 UART的帧格式
在UART 中,数据位是以字符为传送单位,数据的前、后要有起始位、停止位,另外可以在停止位的前面加上一个比特(bit)的校验位。其帧格式如图所示。
数据位
起始位D0 D1 D2 D3 ——————D7 校验位停止位
以9600波特率接收或发送,每一位时间为
1/9600秒,或48MHZ晶振5000次计数
图3_1数据帧格式
文章通过分析UART的功能,利用有限状态机来描述UART核心控制逻辑的方法,将其核心功能集成,从而使整个设计更加稳定、可靠。基本的UART 通信只需要两条信号线就可以完成数据的相互通信。UART的功能模块如图3_2所示。
波特发生器
Uart控制器
接收模块发送模块
对象模块
图3_2UART的功能模块图
3.2 UART模块
在大规模电路的设计中,广泛采用层次化,结构化的设计方法。它将一个完整的硬件设计任务从系统级开始,划分为若干个可操作的模块,编制出相应的模型并进行仿真验证,最后在系统级上进行组合。这样在提高设计效率的同时又提高了设计质量,是目前复杂数字系统实现的主要手段,也是本文设计思想的基础。
其系统模块可划分为4个部分,如波特发生器,控制器,接收器,发送器,如图3-3所示:
read send
clear_check
read send
Clr3 clr4 ks cs Data_in Data_out clear
Read_enable send_enable
counters counters
reset Counters(control)
state
T1 clk_enable
Clk_clear
Clk(波特发生器)
clk
图3-3uart结构图
3.2.1主要引脚功能介绍
Read:串行输入send:串行输出
Data_in:并行输入data_out:并行输出Cs:通知cpu接收数据位ks:通知cpu发送准备位Reset:重启输入state:uart状态输入Clk:48M时钟输入
3.2.2UART主体程序
`timescale 1ns/1ns
module gs_opt(
input wire read,
input wire clk,
input wire reset,
input wire state,
input wire [7:0] dat_in,
output wire send,
output wire cs,
output wire ks,
output wire [7:0] dat_out
);
wire send_enable;
wire read_enable;
wire clk_enable3;
wire clk_enable4;
wire clear3 ;
wire clear4 ;
wire clk_enable;
wire [7:0] counters;
wire clear ;
wire t1;
/*
read,send,cs,ks,reset,state,clk,dat_in,dat_out);
//module uart(read,send,cs,ks,reset,state,clk,dat_in,dat_out); input read,clk,reset,state;
//read为串行输入,clk为时钟输入50MHZ,reset为重启键input[7:0] dat_in;//并行数据输入
output send,cs,ks;
//send为串行输出,cs为通知cpu接收数据位,ks为发送准备位output[7:0] dat_out;//并行数据输出
wire clear,clk_enable,read_enable,clear3,send_enable,clear4,t1; wire[7:0] counters,dat_in;*/
rxd u1 (
.dat_out (dat_out) ,
.cs (cs) ,
.read (read) ,
.reset (reset) ,
.clk_enable3 (clk_enable3) ,
.clk (clk) ,
.read_enable (read_enable) ,
.clear3 (clear3) ,
.counters (counters)
); //接收数据module
txd u2 (
.dat_in (dat_in),
.ks (ks),
.send (send),
.reset (reset),
.clk_enable4 (clk_enable4),
.clk (clk),
.send_enable (send_enable),
.clear4 (clear4),
.counters( counters)
);//发送数据module
clk_bau u3 (
.clk(clk) ,
.t1 (t1),
.clk_enable (clk_enable)
); //时钟计数器模块
ctrl u4(
.read_enable (read_enable) ,
.send_enable (send_enable),
.clk (clk),
.state (state),
.t1 (t1),
.read (read ),
.counters (counters),
.reset (reset ),
.clear (clear)
);
check_cle u5 (
.state (state),
.clear3 (clear3),
.clear4 (clear4),
.clear (clear),
.clk_enable3 (clk_enable3),
.clk_enable4 (clk_enable4),
.clk_enable (clk_enable)
);
endmodule////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////