好文档 - 专业文书写作范文服务资料分享网站

实验四串口接收模块电路设计

天下 分享 时间: 加入收藏 我要投稿 点赞

实验四 串口接收模块电 路设计

一、实验目的:

1、熟练使用 ISE 设计工具。

2、理解串口传输协议。理解采用“自顶向下”设计思路,分解模 块的方法。 3、在ISE使用Verilog HDL设计串口接收模块,完成仿真、下载。

二、原理分析

(一)串口传输协议概述 设计完成异步串口通信通用异步收发是一种典型的异步串口通

信, 简 称UART串口通信时序如图1所示。

图 1 通用异步收发时序图

由图 1 可以看出,在没有数据传送时,通信线会一直处于高电平,即逻 辑 1 状态;当有数据传送时,数据帧以起始位开始,以停止位结束。起始位 为低电平,即逻辑 0 状态;停止位为高电平,即逻辑 1 状态,其持续时间可 选为 1 位、位或 2 位( 本次设计选择持续时间 1 位)。接收端在接收到停止 位后,知道一帧数据已经传完,转为等待数据接收状态;只要再接收到 0 状 态,即为新一帧数据的起始状态。

数据帧的数据位低位(LSB在前,高位(MSB在后,根据不同的编码规 则,数据位可能为 5 位、 6位、 7 位或者 8 位(本次设计数据位定位 8 位)。 校验位也可根据需要选择奇校验、偶校验或者不要校验 (本次设计不要校验 位)。

(二) 串口时序分析

串口通讯常用“波特率”表述串口传输速率, 常用的参数有 9600 bps 和

115200 bps等。在硬件传输角度看,波特率表征了传输一位数据所需要的时 间。例如:

波特率是9600 bps,传输一位数据的时间是1/9600二秒。如果FPGA

系统时钟是20MHZ则一位数据传输时间相当于(1/9600)/(1/20M ) =2083个 20MHZ寸钟周期。

设一帧数据位数 =1(开始位) +8(数据位) +1(校验位) +1(结束位) =11 位,所以传输一帧数据的时间是 11*1/9600=秒。

为了稳定采集串口数据帧的数据, 需要在每位数据的“中间时刻”采样, 由此,需要在每位数据开始时刻对时钟进行计数,若系统时钟是 20MHZ则 在计数至 2083/2=1042 时采样此时刻的数值。 三、系统分析:

为实现串口接收电路,FPGA应该完成:

1、 及时发现数据传输的开始,并判断每一位的开始。 2、 按照“在数据位中间采样”的要求,确认采样时刻。 3、 将采样得到串行数据转换为并行数据。 4、

将并行数据显示在下载板上。

本次实验参数:串口传输数据率9600bps,每帧数据11位。按照“自 顶向下”设计思想,系统分为以下五个子模块:

1 、帧开始监测模块( detect_module )

输入端口:串行输入数据 RX_Pin_ln,系统时钟CLK,复位信号RSTn RSTn=C时系统复位。

输出端口: H2L_Sig 参考代码:

module detect_module( CLK, RSTn,RX_Pin_ln, H2L_Sig); input CLK; input RSTn; input RX_Pin_In; output H2L_Sig;

其中当

reg H2L_F1; reg H2L_F2;

always @ ( posedge CLK or negedge RSTn ) if( !RSTn ) begin

H2L_F1 <= 1'b1; H2L_F2 <= 1'b1; end else begin

H2L_F1 <= RX_Pin_In;

H2L_F2 <= H2L_F1; end assign H2L_Sig = H2L_F2 & !H2L_F1; endmodule

2、数据位中心定位模块( rx_bps_module ) 输入端口:系统时钟 CLK;

复位信号RSTn,当RSTn=0系统复位;

数据位有效信号 Count_Sig, 当 Count_Sig=1 ,表示有效位传输。

输出端口: BPS_CL,当计数至每一位的中间位置,BPS_CLK二,提示信号采

集时间到,否则不进行信号采集。

设系统时钟20MHZ则参考代码如下:

module rx_bps_module(CLK, RSTn,Count_Sig,BPS_CLK ); input CLK; input RSTn; input Count_Sig;

output BPS_CLK; reg [11:0]Count_BPS;

always @ ( posedge CLK or negedge RSTn ) if( !RSTn ) Count_BPS <= 12'd0;

else if( Count_BPS == 12'd2082 ) Count_BPS <= 12'd0; else if( Count_Sig )

Count_BPS <= Count_BPS + 1'b1; else

Count_BPS <= 12'd0;

assign BPS_CLK = ( Count_BPS == 12'd1041 ) ? 1'b1 : 1'b0; endmodule 3、数据装载模块( rx_control_module ) 输入端口:系统时钟 CLK,

复位信号RSTn,当RSTn二时,系统复位

帧开始信号H2L_Sig,当H2L_Sig=1,表示一帧信号开始; 串口数据输入信号: RX_Pin_In, 位中心定位信号: BPS_CLK,

串口接收使能信号RX_En_Sig,当RX_En_Sig=1,系统正常工作。

反正不接收数据。

输出端口:串口数据帧开始确认信号: Count_Sig, 当 Count_Sig=1 ,表示串 开始时刻,持续一个系统时钟周期。 装载好的串口数据:RX_Data位宽为8bits 串口数据接收结束信号:

RX_Done_Sig,当RX_Done_Sig=1表

口输入帧

示一帧串口数据接收完毕。

参考代码:

module rx_control_module(CLK, RSTn, H2L_Sig, RX_Pin_In, BPS_CLK, RX_En_Sig,

Count_Sig, RX_Data, RX_Done_Sig); input CLK; input RSTn; input H2L_Sig; input RX_En_Sig; input RX_Pin_In; input BPS_CLK; output Count_Sig; output [7:0]RX_Data; output RX_Done_Sig; reg [3:0]i; reg [7:0]rData; reg isCount; reg isDone;

always @ ( posedge CLK or negedge RSTn ) if( !RSTn ) begin i <= 4'd0; rData <= 8'd0;

31k367k0ev58u602x74s2b61z97lf1017mh
领取福利

微信扫码领取福利

微信扫码分享