您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 可编程逻辑设计课程报告
可编程逻辑设计课程报告串行通用收发器设计与实现姓名:W.Dragon学号:2013210XXX班级:201321120X班内序号:1X专业:电子科学与技术学院:电子工程学院2016年6月可编程逻辑设计课程设计报告W.Dragon2013210XXX1目录1.概念简介.........................................................21.1串行数据接口.................................................21.2串口通信协议.................................................22.串口接收模块设计.................................................42.1接收模块原理.................................................42.2接收模块代码设计.............................................53.串口发送模块设计................................................103.1发送模块原理................................................103.2发送模块代码设计............................................104.仿真及结论......................................................14可编程逻辑设计课程设计报告W.Dragon2013210XXX2串行通用收发器设计与实现【摘要】串行通信接口是一种应用广泛的通信接口。目前,大部分处理器都集成了支持RS-232接口的通用异步收发器UART,本报告设计了一个串口通用收发器,用Quarts软件进行仿真并给出结果,分别验证各个模块的正确性。1.概念简介1.1串行数据接口串口即串行数据接口,是一种常用的数据接口。在PC一般都有两个串行口,其形状如图所示,是典型的9针D形接口,也称为DB9。由于串口多采用RS-232-C传输协议并长达数十年,因此也常被称为RS-232接口。串口主要用于网管控制或主业务数据的传输,支持数据的双向传输,速率9600-115200bps,即可以完成和PC的通信,也可以完成与带有标准串口的外设相连,其典型的连接方式如图1-2所示。其中串口接口分为带插孔和带插针的两种,其中插针端称为DCE,插孔端称为DTE。1.2串口通信协议RS-232全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”,该标准规定采用25个脚的串口连接器(DB25),不仅对连接器的每个引脚的信号内容加以规定,还规定了各种信号的电平。标准的RS-232-C协议具有25根信号线,其中有4根为数据线、11根控制线、3根定可编程逻辑设计课程设计报告W.Dragon2013210XXX3时线和7根备用线。通常情况下,使用其中的9根线就可以实现RS-232串口通信。通常DB-25也可以像DB-9那样使用,但是它们的针号和针孔之间的连接关系是不一样的,下面给出常用的25针DB-25和DB-9的对照表以及管脚说明,如下表所示。RS-232-C的串行总线在空闲的时候保持为逻辑“1”状态,即串行连接线上的电平为-3至+15V。当需要传送一个字符时,首先会发送一个逻辑为“0”的起始位,表示开始发送数据;之后就逐个发送数据位、奇偶校验位和停止位(逻辑“1”),每一次传输1个字符(8个比特)。由于任意两个字符对应瞬间的时间间隔是可变的,因此也被称为异步格式。典型的传输时序如图1-3所示。在RS-232-C协议中,可以设置数据的传输速率。除此之外,字符的位宽、奇偶校验位、停止位都可以被设置。字符可以被设置成5~8比特,奇偶校验位可以被去除;停止位可以设置成1位、2位甚至1.5位。每秒传输的比特数也被称为二进制波特率,即位周期的倒数,简称为比特率,用于衡量RS-232的传输速率。RS-232-C有一系列波特率标准:110bps、300bps、600bps、1200bps、1800bps、2400bps、4800bps、9600bps、14.4kbps、19.2kbps、28.8kbps、33.6kbps和可编程逻辑设计课程设计报告W.Dragon2013210XXX456kbps等。有两点注意的是:首先,在设置波特率时,必须同时通知通信双方;其次,波特率的计算包括了起始位、字符、校验位、停止位在内所有的比特,而不是仅针对字符。发送数据过程:空闲状态,线路处于高电位;拉低线路一个数据位的时间T,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位(停止位为高电位),一帧资料发送结束。接收数据过程:空闲状态,线路处于高电位;当检测到线路的下降沿(线路电位由高电位变为低电位)时说明线路有数据传输,按照约定的波特率从低电位到高电位接收数据,数据发送完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备准备接收数据或存入缓存。由于UART是异步传输,没有传输同步时钟。为了能保证数据传输的正确性,UART采用16倍数据波特率的时钟进行采样。每个数据有16个时钟采样,取中间采样值,以保证采样不会发生误码。一般UART一帧的数据位数为8,这样即使每个数据有一个时钟的误差,接收端也能正确地采样到数据。2.串口接收模块设计2.1接收模块原理串口接收的基本原理就是定时采样,因为发送端的数据是定时发送的,那么只要接收端和发送端的保持一致,按照一定时间间隔进行采样就可恢复数据。虽然接收模块只要定时采样就可以了,但是采样的时机很重要。如上图所示,采集的最佳时机是发送端的数据的中间时刻,这个时候的数据是最稳定的。串口一帧数据有很多位,不一定每一个位都要接收,例如起始位不需要接收,我们采取忽略的态度。实际上只需要采集8位数据即可。值得注意的是,串口数据最开始发送的是数据的最低位,最后发送的才是最高位。可编程逻辑设计课程设计报告W.Dragon2013210XXX5上图就是接收模块原理图,电平检测模块用于检测起始位,发出信号表明串口传送开始。波特率定时模块用于产生恒定波特率,用来定时采集数据。接受控制模块用于控制接收的过程。2.2接收模块代码设计以下即为接收模块的实现代码。Detect_module.vmoduledetect_module(CLK,RSTn,RX_Pin_In,H2L_Sig);inputCLK;inputRSTn;inputRX_Pin_In;outputH2L_Sig;/******************************/regH2L_F1;regH2L_F2;always@(posedgeCLKornegedgeRSTn)if(!RSTn)beginH2L_F1=1'b1;H2L_F2=1'b1;endelsebeginH2L_F1=RX_Pin_In;可编程逻辑设计课程设计报告W.Dragon2013210XXX6H2L_F2=H2L_F1;end/***************************************/assignH2L_Sig=H2L_F2&!H2L_F1;/***************************************/endmoduleRx_bps_module.vmodulerx_bps_module(CLK,RSTn,Count_Sig,BPS_CLK);inputCLK;inputRSTn;inputCount_Sig;outputBPS_CLK;/***************************/reg[12:0]Count_BPS;always@(posedgeCLKornegedgeRSTn)if(!RSTn)Count_BPS=13'd0;elseif(Count_BPS==13'd5000)Count_BPS=13'd0;elseif(Count_Sig)Count_BPS=Count_BPS+1'b1;elseCount_BPS=13'd0;/********************************/assignBPS_CLK=(Count_BPS==13'd2500)?1'b1:1'b0;/*********************************/可编程逻辑设计课程设计报告W.Dragon2013210XXX7endmoduleRx_control_module.vmodulerx_control_module(CLK,RSTn,H2L_Sig,RX_Pin_In,BPS_CLK,RX_En_Sig,Count_Sig,RX_Data,RX_Done_Sig);inputCLK;inputRSTn;inputH2L_Sig;inputRX_En_Sig;inputRX_Pin_In;inputBPS_CLK;outputCount_Sig;output[7:0]RX_Data;outputRX_Done_Sig;/********************************************************/reg[3:0]i;reg[7:0]rData;regisCount;regisDone;always@(posedgeCLKornegedgeRSTn)if(!RSTn)begini=4'd0;rData=8'd0;isCount=1'b0;isDone=1'b0;endelseif(RX_En_Sig)case(i)4'd0:if(H2L_Sig)begini=i+1'b1;isCount=1'b1;end可编程逻辑设计课程设计报告W.Dragon2013210XXX84'd1:if(BPS_CLK)begini=i+1'b1;end4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8,4'd9:if(BPS_CLK)begini=i+1'b1;rData[i-2]=RX_Pin_In;end4'd10:if(BPS_CLK)begini=i+1'b1;end4'd11:if(BPS_CLK)begini=i+1'b1;end4'd12:begini=i+1'b1;isDone=1'b1;isCount=1'b0;end4'd13:begini=4'd0;isDone=1'b0;endendcase/********************************************************/assignCount_Sig=isCount;assignRX_Data=rData;assignRX_Done_Sig=isDone;/*********************************************************/endmoduleRx_module.vmodulerx_module(CLK,RSTn,RX_Pin_In,RX_En_Sig,RX_Done_Sig,RX_Data);inputCLK;inputRSTn;inputRX_Pin_In;可编程逻辑设计课程设计报告W.Dragon2013210XXX9inputRX_En_Sig;output[7:0]RX_Data;outputRX_Done_Sig;/**********************************/wireH2L_Sig;detect_moduleU1(.CLK(CLK),.RSTn(RSTn),.RX_Pin_In(RX_Pin_In),//input-fromtop.H2L_Sig
本文标题:可编程逻辑设计课程报告
链接地址:https://www.777doc.com/doc-3575679 .html