




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
通用资串口编实欢迎验实验目的:1、掌握QuartusII软件的基本使用;2、 熟悉VHDL硬件描述语言编程及其调试方法;3、 学习用FPGA实现接口电路设计;4、 学习MCS-51单片机程序设计方法;5、 学习液晶显示器的编程。实验内容:设计一个通用串行接口,要求与PC的串口连接后,可以接受PC发来的数据,并能在液晶显示屏上显示,实验板上的键盘输入的数据可以传送到PC,并在PC的显示器上显示,串口传送速率为9600波特,8位数据位,1位停止位,不校验。进一步实现波特率可设置,设置范围为1200bps、2400bps、9600bps1、UART简介UART(UniversalAsynchronousReceiverTransmitter通用异步收发器)是一种应用广泛的短距离串行传输接口。常常用于短距离、低速、低成本的通讯中。8250、8251、NS16450等芯片都是常见的UART器件。基本的UART通信只需要两条信号线(RXD、TXD)就可以完成数据的相互通信,接收与发送是全双工形式。TXD是UART发送端,为输出;RXD是UART接收端,为输入。UART的基本特点是:(1) 在信号线上共有两种状态,可分别用逻辑1(高电平)和逻辑0(低电平)来区分。在发送器空闲时,数据线应该保持在逻辑高电平状态。 (2) 起始位(StartBit):发送器是通过发送起始位而开始一个字符传送,起始位使数据线处于逻辑0状态,提示接受器数据传输即将开始。(3) 数据位(DataBits):起始位之后就是传送数据位。数据位一般为8位一个字节的数据(也有6位、7位的情况),低位(LSB)在前,高位(MSB)在后。(4) 校验位(parityBit):可以认为是一个特殊的数据位。校验位一般用来判断接收的数据位有无错误,一般是奇偶校验。在使用中,该位常常取消。(5) 停止位:停止位在最后,用以标志一个字符传送的结束,它对应于逻辑1状态。(6) 位时间:即每个位的时间宽度。起始位、数据位、校验位的位宽度是一致的,停止位有0.5位、1位、1.5位格式,一般为1位。(7) 帧:从起始位开始到停止位结束的时间间隔称之为一帧。(8)波特率:UART的传送速率,用于说明数据传送的快慢。在串行通信中,数据是按位进行传送的,因此传送速率用每秒钟传送数据位的数目来表示,称之为波特率。如波特率9600=9600bps(位/秒)。UART的数据帧格式为:STARTD0D1D2D3D4D5D6D7PSTOP起始位数 据 位校验位停止位本实验8位数据位,1位停止位,不校验。FPGAUART系统组成:如下图所示,FPGAUART由三个子模块组成:波特率发生器;接收模块;发送模块;word专业资料-可复制编辑-欢迎下载2、VHDL模块设计:系统由四部部分组成:顶层模块;波特率发生器;UART接收器;UART发送器1) 顶层模块异步收发器的顶层模块由波特率发生器、UART接收器和UART发送器构成。UART发送器的用途是将准备输出的并行数据按照基本UART帧格式转为TXD信号串行输出。UART接收器接收RXD串行信号,并将其转化为并行数据。波特率发生器就是专门产生一个远远高于波特率的本地时钟信号对输入RXD不断采样,使接收器与发送器保持同步。2) 波特率发生器波特率发生器实际上就是一个分频器。可以根据给定的系统时钟频率(晶振时钟)和要求的波特率算出波特率分频因子,算出的波特率分频因子作为分频器的分频数。 波特率分频因子可以根据不同的应用需要更改。3) UART接收器由于串行数据帧和接收时钟是异步的,由逻辑1转为逻辑0可以被视为一个数据帧的起始位。然而,为了避免毛刺影响,能够得到正确的起始位信号,必须要求接收到的起始位在波特率时钟采样的过程中至少有一半都是属于逻辑0才可认定接收到的是起始位。由于内部采样时钟bclk周期(由波特率发生器产生)是发送或接收波特率时钟频率的16倍,所以起始位需要至少8个连续bclk周期的逻辑0被接收到,才认为起始位接收到,接着数据位和停止位将每隔16个bclk周期被采样一次(即每一个波特率时钟被采样一次))如果起始位的确是16个bclk周期长,那么接下来的数据将在每个位的中点处被采样。UART接收器的接收状态机接收状态机接收状态机一共有5个状态:R_START(等待起始位);R_CENTER(求中点);R_WAIT(等待采样);R_SAMPLE(采样);R_STOP(停止位接收)。R_START状态当UART接收器复位后,接收状态机将处于这一个状态。在此状态,状态机一直在等待RXD的电平跳转,从逻辑1变为逻辑0,即起始位,这意味着新的一帧UART数据帧的开始,一旦起始位被确定,状态机将转入R_CENTER状态。状态图中的RXD_SYNC信号是RXD的同步信号,因为在进行逻辑1或逻辑0判断时,不希望检测的信号是不稳定的,所以不直接检测RXD信号,而是检测经过同步后的RXD_SYNC信号。R_CENTER状态对于异步串行信号,为了使每一次都检测到正确的位信号,而且在较后的数据位检测时累计误差较小,显然在每位的中点检测是最为理想的。在本状态,就是由起始位求出每位的中点,通过对bclk的个数进行计数(RCNT16),但计数值不是想当然的“1000”要考虑经过一个状态,也即经过了一个bclk周期,所希望得到的是在采样时1/2位。另外,可能在R_START状态检测到的起始位不是真正的起始位,可能是一个偶然出现的干扰尖脉冲(负脉冲)。这种干扰脉冲的周期是很短的,所以可以认为保持逻辑0超过1/4个位时间的信号一定是起始位。R_WAIT状态当状态机处于这一状态,等待计满15个bclk,在第16个bclk是进入R_SAMPLE状态进行数据位的采样检测,同时也判断是否采集的数据位长度已达到数据帧的长度(FRAMELEN),如果到来,就说明停止位来临了。FRAMELEN在设计时是可更改的(使用了Generic),在本设计中默认为8,即对应的UART工作在8位数据位、无校验位格式。R_SAMPLE状态即数据位采样检测,完成后无条件状态机转入R_WAIT状态,等待下次数据位的到来。R_STOP状态无论停止位是1还是1.5位,或是2位,状态机在R_STOP不具体检测RXD,只是输出帧接收完毕word专业资料-可复制编辑-欢迎下载信号(REC_DONE<=T),停止位后状态机转回到R_START状态,等待下一个帧的起始位。4)UART发送器发送器只要每隔16个bclk周期输出1个数据即可,次序遵循第1位是起始位,第8位是停止位。在本设计中没有校验位,但只要改变Generic参数FrameLen,也可以加入校验位,停止位是固定的1位格式。发送状态机一共有5个状态:X_IDLE(空闲);X_START(起始位);X_WAIT(移位等待);X_SHIFT(移位);X_STOP(停止位)。X_IDLE状态:当UART被复位信号复位后,状态机将立刻进入这一状态。在这个状态下,UART的发送器一直在等待一个数据帧发送命令XMIT_CMD。XMIT_CMD_P信号是对XMIT_CMD的处理,XMIT_CMD_P是一个短脉冲信号。这时由于XMIT_CMD是一个外加信号,在FPGA之外,不可能对XMIT_CMD的脉冲宽度进行限制,如果XMIT_CMD有效在UART发完一个数据帧后仍然有效,那么就会错误地被认为,一个新的数据发送命令又到来了,UART发送器就会再次启动UART帧的发送,显然该帧的发送是错误的。在此对XMIT_CMD进行了脉冲宽度的限定,XMIT_CMD_P就是一个处理后的信号。当XMIT_CMD_P=T,状态机转入X_START,准备发送起始位。X_START状态:在这个状态下,UART的发送器一个位时间宽度的逻辑0信号至TXD,即起始位。紧接着状态机转入X_WAIT状态。XCNT16是bclk的计数器X_WAIT状态同UART接收状态机中的R_WAIT状态类似。X_SHIFT状态当状态机处于这一状态时,实现待发数据的并串转换。转换完成立即回到X_WAIT状态。X_STOPword专业资料-可复制编辑-欢迎下载停止位发送状态,当数据帧发送完毕,状态机转入该状态,并发送16个bclk周期的逻辑1信号,即1位停止位。状态机送完停止位后回到X_IDLE状态,并等待另一个数据帧的发送命令。3、液晶显示模块设计为了使接收器的输出端的数据能够在液晶屏上显示,需要使用MCS-51单片机,将接收器的输出端进行管脚锁定到P1口,程序扫描P1口即能显示接收器输出端的数据。实验程序:1、波特率发生器--功能:本实验想要实现的波特率为:9600、2400>1200,EDA实验箱上晶振频率为:6MHZ,--波特率发生器的分频数计算如下式:--6000000/(16*9600)=39--6000000/(16*2400)=156--6000000/(16*1200)=312libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitybaudisPort(clk,resetb:instd_logic;bclk:outstd_logic);endbaud;architecturebehavioralofbaudisbeginprocess(clk,resetb)variablecnt:integer;beginifresetb=Tthen --resetb=T时复位cnt:=0;bclk<='0';elsifrising_edge(clk)thenifcnt>=38thencnt:=0;bclkv=T; --设置分频系数9600pbselsecnt:=cnt+1;bclkv='0';endif;endif;endprocess;endbehavioral;波形仿真:word专业资料-可复制编辑-欢迎下载word专业资料-可复制编辑-欢迎下载word专业资料-可复制编辑-欢迎下载word专业资料-可复制编辑-欢迎下载Vain.0E.72■Vain.0E.72■:.04TLS结果分析:图上可以观察到输出端bckl等间隔的有脉冲信号输出,通过标尺可以计算出它的脉冲输出频率及其与elk输入信号的关系。该程序实现的是波特率发生器,输出频率为时钟输入频率的1/39o生成符号文件:re&Etbelktalk2、UART发送器libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitytransferisgeneric(framlent:integer:=8);Port(bclkt,resett,xmit_cmd_p:instd_logic;--定义输入输出信号txdbuf:instd_logic_vector(7downto0);txd:outstd_logic;txd_done:outstd_logic);endtransfer;architecturebehavioraloftransferistypestatesis(x_idle,x_start,x_wait,x_shift,x_stop);--定义个子状态signalstate:states:=x_idle;signaltcnt:integer:=0;beginprocess(bclkt,resett,xmit_cmd_p,txdbuf) --主控时序、组合进程variablexcnt16:std_logic_vector(4downto0):="00000";--定义中间变量variablexbitcnt:integer:=0;variabletxds:std_logic;beginifresett=Tthen --复位statev=x_idle;txd_done<='0';txds:=T;elsifrising_edge(bclkt)thencasestateiswhenx_idle=>ifxmit_cmd_p=Tthenstatev=x_start;txd_donev='0';elsestatev=x_idle;--状态1,等待数据帧发送命令endif;whenx_start=>ifxcnt16>="01110"thenstatev=x_wait;xcnt16:="01110";elsexcnt16:=xcnt16+1;txds:='0';statev=x_start;endif;--状态2,发送信号至起始位whenx_wait=>ifxcnt16>="01110"thenifxbitcnt=framlentthenstatev=x_stop;xbitcnt:=0;elsestatev=x_shift;endif;xcnt16:="00000";elsexcnt16:=xcnt16+1;statev=x_wait;endif;--状态3,等待状态whenx_shift=>txds:=txdbuf(xbitcnt);xbitcnt:=xbitcnt+1;statev=x_wait;--状态4,将待发数据进行并串转换whenx_stop=>ifxcnt16>="01111"thenifxmit_cmd_p='0'thenstatev=x_idle;xcnt16:="00000";elsexcnt16:=xcnt16;statev=x_stop;endif;txd_donev=T;elsexcnt16:=xcnt16+1;txds:='1';statev=x_stop;endif;--状态5,停止位发送状态whenothers=>statev=x_idle;endcase;endif;txdv=txds;endprocess;endbehavioral;仿真波形:
说明:resett:为复位信号,高电平复位,初始时刻需要手动设置一段时间的高电平Bclkt为波特率发生信号。xmit_cmd_p:为发送控制信号,开始时刻设置一段高电平txdbuf:为要发送的八位数据txd:为发送器发出的串行信号txd_done:为发送结束信号,高电平有效生成符号文件:3、UART接收器libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityrecieverisgeneric(framlenr:integer:=8);Port(bclkr,resetr,rxdr:instd_logic;--定义输入输出信号r_ready:outstd_logic;rbuf:outstd_logic_vector(7downto0));endreciever;word专业资料-可复制编辑-欢迎下载architecturebehavioralofrecieveristypestatesis(r_start,r_center,r_wait,r_sample,r_stop);--定义各子状态signalstate:states:=r_start;signalrxd_sync:std_logic;beginpro1:process(rxdr)beginifrxdr='0'thenrxd_sync<='0';elserxd_syncv=T;endif;endprocess;pro2:process(bclkr,resetr,rxd_sync)--主控时序、组合进程variablecount:std_logic_vector(3downto0);--定义中间变量variablercnt:integer:=0;variablerbufs:std_logic_vector(7downto0);beginifresetr=Tthen --复位statev=r_start;count:="0000";elsifrising_edge(bclkr)thencasestateiswhenr_start=>ifrxd_sync='0'thenstatev=r_center;r_readyv='0';rcnt:=0;elsestatev=r_start;r_readyv='0';endif;--状态1,等待起始位whenr_center=>ifrxd_sync='0'thenifcount="0100"thenstatev=r_wait;count:="0000";elsecount:=count+1;statev=r_center;endif;elsestatev=r_start;endif;--状态2,求出每位的中点whenr_wait=>ifcount>="1110"thenifrcnt=framlenrthenstatev=r_stop;elsestatev=r_sample;endif;count:="0000";--状态3,等待状态elsecount:=count+1;statev=r_wait;endif;whenr_sample=>rbufs(rcnt):=rxd_sync;rcnt:=rcnt+1;statev=r_wait; --状态4,数据位采样检测whenr_stop=>r_readyv='1';rbufv=rbufs;statev=r_start; --状态4,输出帧接收完毕信号whenothers=>statev=r_start;endcase;endif;word专业资料-可复制编辑-欢迎下载word专业资料-可复制编辑-欢迎下载word专业资料-可复制编辑-欢迎下载word专业资料-可复制编辑-欢迎下载endprocess;endbehavioral;仿真波形:说明:resett:为复位信号,高电平复位,初始时刻需要手动设置一段时间的高电平Bclkt为波特率发生信号rxdr:为预接收的串行信号rbuf:为接收到的八位数据rxd_ready:为接收器接收满8位数据后发出的结束信号,高电平有效生成符号文件:4、分频器模块实验箱提供的晶振频率为:6Mhz,实验中需要较低的频率信号驱动计数器计数和提供给发送器触发信号(xmit_cmd_p),本实验分频器设置分频数为1000000,得到6hz脉冲输出。分频器程序:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityclock_divisgeneric(framlenr:integer:=1000000);Port(clk,resetb:instd_logic;bclk: inoutstd_logic);endclock_div;architectureBehavioralofclockdivisbegin
process(clk,resetb)variablecnt:integer;beginifresetb='l'thencnt:=0;bclk<='0';elsifrising_edge(clk)thenifcnt>=framlenrthencnt:=0;bclk<='0';elsifcnt>=framlenr/2thencnt:=cnt+1;bclkv='1';elsecnt:=cnt+l;bclk<='0';endif;endif;endprocess;endBehavioral;生成的模块:5、液晶显示功能模块将接收器的rbuf输出端数据以十进制形式输出到液晶显示屏幕上。#include<reg52.H>#include<ctype.h>#include<string.h>#include<stdlib.h>#include<stdio.h>#include<math.h>#includevINTRINS.H>/ I//显示开指令//显示开指令〃//显示关指令////定位到第0列指令////定位到第0页指令////定位从DDROM中的第0行开始往屏幕上显示/// IsbitCS1=P2A3;sbitCS2=P2A4;sbitCS1=P2A3;sbitCS2=P2A4;sbitE=P2A0;sbitRS=P2A2;sbitRW=P2A1;//左屏使能////使能端////数据或指令寄存器选择端////读写控制端//TOC\o"1-5"\h\z/* 字模 */charcodeling[]={/*数字08x16 */0,240,8,4,4,8,240,0,0,7,8,16,16,8,7,0};charcodeyi[]={/*数字18x16 */0,0,8,8,252,0,0,0,0,0,16,16,31,16,16,0};charcodeer[]={/*数字28x16 */0,48,8,4,132,72,48,0,0,28,18,17,16,24,4,0};charcodesan[]={/*数字38x16 */0,48,8,132,132,72,48,0,0,4,8,16,16,9,6,0};charcodesi[]={/*数字48x16 */0,0,192,48,12,252,0,0,0,3,2,2,18,31,18,2};charcodewu[]={/*数字58x16 */0,252,68,68,68,132,4,0,0,4,8,16,16,8,7,0};charcodeliu[]={/*数字68x16 */0,240,136,68,68,136,48,0,0,7,8,16,16,8,7,0};charcodeqi[]={/*数字78x16 */16,12,4,4,132,100,28,0,0,0,0,30,1,0,0,0};charcodeba[]={/*数字88x16 */0,48,72,132,132,72,48,0,0,6,9,16,16,9,6,0};charcodejiu[]={/*数字98x16 */0,112,136,4,4,136,240,0,0,4,8,17,17,8,7,0};/* 延时程序 */voiddelay(unsignedchart){while(t--)}voiddelays(unsignedchara){unsignedchari;while(--a!=0){for(i=0;i<125;i++); 〃一个;表示空语句,CPU空转。} //i从0加到125,CPU大概就耗时1毫秒}/* 检查状态 */voidcheck_busy(){RS=0;RW=1; 〃数据读到db7-db0,rs=0表示在e下降元指令写到irE=1;wordword专业资料-可复制编辑-欢迎下载delay(1);while((bit)P0&0x80);E=0;}/* 写命令至ULCD */voidwrite_command(unsignedcharcmdcode){check_busy();//delay(1);RS=0;RW=0;//P1=cmdcode;//P0=cmdcode;delay(1);E=1;delay(1);E=0;delay(1);}/* 写数据到LCD */voidwrite_data(unsignedcharDispdata){check_busy();//delay(1);RS=1;RW=0;//P1=Dispdata;//P0=Dispdata;delay(1);E=1;delay(1);E=0;delay(1);}/* 清显示屏 */voidClr_Scr(){unsignedcharj,k;wordword专业资料-可复制编辑-欢迎下载//清左半屏〃CS2=0;CS1=1;{for(k=0;k<8;k++){write_command(Page_Add+k);write_command(Col_Add+0);for(j=0;jv64;j++)write_data(0x00);}}CS2=1;CS1=0;{for(k=0;k<8;k++){write_command(Page_Add+k);write_command(Col_Add+0);for(j=0;j<64;j++)write_data(0x00);}}}/* 指定位置显示数字8*16 */voidsz_disp16(unsignedcharpag,unsignedcharcol,unsignedcharshu){unsignedcharcode*szk;unsignedchari,j;switch(shu){case0:szk=ling;break;case1:szk=yi;break;case2:szk=er;break;case3:szk=san;break;case4:szk=si;break;case5:szk=wu;break;case6:szk=liu;break;case7:szk=qi;break;case8:szk=ba;break;case9:szk=jiu;break;}for(j=0;j<2;j++){write_command(Page_Add+pag+j);write_command(Col_Add+col);for(i=0;iv8;i++)write_data(szk[8*j+i]);}}/* 指定位置显示汉字16*16 */voidhz_disp16(unsignedcharpag,unsignedcharcol,unsignedcharcode*hzk){unsignedcharj=0,i=0;for(j=0;j<2;j++){write_command(Page_Add+pag+j);write_command(Col_Add+col);for(i=0;iv16;i++)write_data(hzk[16*j+i]);}}/* 初始化LCD屏 */voidinit_lcd(){CS2=1;CS1=0;delay(100);write_command(Disp_Off);write_command(Page_Add+0);write_command(Start_Line+0);write_command(Col_Add+0);write_command(Disp_On);word专业资料-可复制编辑-欢迎下载word专业资料-可复制编辑-欢迎下载word专业资料-可复制编辑-欢迎下载word专业资料-可复制编辑-欢迎下载CS2=0;CS1=1;delay(100);write_command(Disp_Off);write_command(Page_Add+0);write_command(Start_Line+0);write_command(Col_Add+0);write_command(Disp_On);}/* 显示数据(右边) */voidlcd_data(unsignedchardata0){unsignedchara,b,c,temp;Clr_Scr(); //先清屏〃 a=0;b=0;c=0;temp=data0;〃其中a表示输入的第一个数,bc为第二,三
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园活动方案-玩具交易会
- 25年公司、项目部、各个班组安全培训考试试题答案可打印
- 2025年新员工入职安全培训考试试题附参考答案【考试直接用】
- 2025购销合同范本模板
- 2025年版个人住房公积金借款合同样本
- 2025装修合同书附加协议
- 2025第三次结构混凝土工程合同
- 2025年地震前兆观测仪器合作协议书
- 2025年个体司机劳务合同
- 2025外卖配送服务合同模板
- 小脑梗死的护理查房
- 水产养殖公司合伙人股权分配协议
- 特殊教育导论 课件 第一章 特殊教育的基本概念
- 急救医疗资源整合优化研究
- 《局域网组建》课件
- 牛津译林7A-Unit3、4单元复习
- 专题四“挺膺担当”主题团课
- 国家义务教育质量监测初中美术试题
- 超声波探伤作业指导书
- 课程思政视域下小学音乐教学策略初探 论文
- 智能高速铁路概论-课件-第一章-世界智能铁路发展-
评论
0/150
提交评论