当前位置:文档之家› FPGA的UART完整设计

FPGA的UART完整设计

第三章UART设计3、1 UART得帧格式在UART 中,数据位就是以字符为传送单位,数据得前、后要有起始位、停止位,另外可以在停止位得前面加上一个比特(bit)得校验位。

其帧格式如图所示。

文章通过分析UART得功能,利用有限状态机来描述UART核心控制逻辑得方法,将其核心功能集成,从而使整个设计更加稳定、可靠。

基本得UART通信只需要两条信号线就可以完成数据得相互通信。

UART得功能模块如图3_2所示。

3、2 UART模块在大规模电路得设计中,广泛采用层次化,结构化得设计方法。

它将一个完整得硬件设计任务从系统级开始,划分为若干个可操作得模块,编制出相应得模型并进行仿真验证,最后在系统级上进行组合。

这样在提高设计效率得同时又提高了设计质量,就是目前复杂数字系统实现得主要手段,也就是本文设计思想得基础。

其系统模块可划分为4个部分,如波特发生器,控制器,接收器,发送器,如图3-3所示:3Data_in:并行输入data_out:并行输出Cs:通知cpu接收数据位ks:通知cpu发送准备位Reset:重启输入state:uart状态输入Clk:48M时钟输入3、2、2UART主体程序`timescale 1ns/1nsmodule 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)); //接收数据moduletxd 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));//发送数据moduleclk_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//////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////3、3UART发送模块3、3、1UART得数据发送服务发送器实现得功能就是将输入得8位并行数据变为串行数据,同时在数据头部加起始位,在数据位尾部加奇偶校验位与停止位。

数据发送服务如表3、1表3、1数据发送其基本特点就是:①在信号线上共有两种状态,可分别用逻辑1与逻辑。

来区分。

在发送器空闲时,数据线应该保持在逻辑高电平状态。

②发送起始位:该位就是一个逻辑0,总就是加在每一帧得头部,提示接受器数据传输即将开始,在接收数据位过程中又被分离出去,占据一个数据位得时间。

③发送数据位:在起始位之后就就是数据位,一般为8位一个字节得数据,低位在前,高位在后。

如字母C在ASCII表中就是十进制67,二进制01000011,那么传输得将就是110000100。

并在数据发送过程当中,进行数据位奇偶校验。

④发送校验位:该位一般用来判断接收得数据位有无错误,常用得校验方法就是奇偶校验法。

将3过程当中奇偶校验得结果输入到数据线,并占一个数据位时钟。

⑤停止位:停止位总在每一帧得末尾,为逻辑1,用于标志一个字符传送得结束,占据一个数据位得时间。

⑥帧:从起始位到停止位之间得一组数据称为一帧。

3、3、2UART得数据发送操作如图3-4解释:采用9600波特率发送从cpu传入数据:就是指将data_in端口得数据存入寄存器中Cpu发送为检测:就是指将ks寄存器置位,即数据发送完毕3、3、3UART得数据发送模块程序module rxd(dat_out,cs,read,reset,clk_enable3,clk,read_enable,clear3,counters);//接收数据moduleinput read_enable;input read,reset,clk;//read为串行输入,read_control为时钟控制,reset为重启键input[7:0] counters;output cs,clear3,clk_enable3;//cs为通知cpu读取数据位output[7:0] dat_out;//wire clear3;reg cs,cs1,clk_enable3;reg[7:0] data_out;//移位寄存器regparity_check_result,parity_result,clear3,clear1;////////////////////////////////////////////////// ///////////////////////always(posedge clk)beginif(read_enable)//当read_enable为高电平时为发送操作状态beginclk_enable3<=1;clear3<=clear1;endelsebeginclear3<=1;endend//////////////////////////////////////////////////////////////////////////////always(negedge counters[0]) ///接收操作if(read_enable & !reset)beginif (counters==8'b00011000) //1begindata_out[7]<=read;parity_check_result<=parity_check_result + read;endelse if (counters==8'b00101000) //2begindata_out[6]<=read;parity_check_result<=parity_check_result + read;endelse if (counters==8'b00111000) //3begindata_out[5]<=read;parity_check_result<=parity_check_result + read;endelse if (counters==8'b01001000) //4begindata_out[4]<=read;parity_check_result<=parity_check_result + read;endelse if (counters==8'b01011000) //5begindata_out[3]<=read;parity_check_result<=parity_check_result + read;endelse if (counters==8'b01101000) //6begindata_out[2]<=read;parity_check_result<=parity_check_result + read;else if (counters==8'b01111000) //7begindata_out[1]<=read;parity_check_result<=parity_check_result + read;endelse if (counters==8'b10001000) //8begindata_out[0]<=read;parity_check_result<=parity_check_result + read;endelse if (counters==8'b10011000) //9进行奇偶校验检测beginparity_result<=read;parity_result<=#2 (parity_check_result == parity_result) ? 1:0;endelse if (counters==8'b10101000) //0进行帧检测begincs1<=(read) ? 1:0;endelse if (counters==8'b10101010) //01给cpu发送接收信号begincs<=(cs1 && parity_result) ? 1:0;//当奇偶校验结果与帧检测结果都为1时,cs置位clear1<=1;//clk_enable<=0;//clk_enable3<=0;endelse if(counters==8'b00001000)//检测就是否就是毛刺beginclear1<=(!read)?0:1;else clear1<=0;endelse clear1<=1;endmodule3、3、4UART得数据发送模块程序仿真图当reset为零时图3-5reset为零时仿真图如图为UART得数据发送模块得功能仿真图,为方便观察,其中得时钟就是直接给出来得,根据图中得数据判读,其功能为正确,UART得数据发送模块编译成功。

相关主题