《UART控制器设计技术学习》由会员分享,可在线阅读,更多相关《UART控制器设计技术学习(23页珍藏版)》请在金锄头文库上搜索。
1、西安电子科技大学可编程逻辑器件原理、应用与实验 课程实验报告实验名称UART控制器设计及验证成 绩 研究生院 学院 代培生 班姓名 学号 同作者 实验日期 2017 年 4 月 23 日指导教师评语: 指导教师: 年 月 日实验报告内容基本要求及参考格式一、实验目的二、实验所用仪器(或实验环境)三、实验基本原理及步骤(或方案设计及理论计算)四、实验数据记录(或仿真及软件设计)五、实验结果分析及回答问题(或测试环境及测试结果)互联网络目录一 任务简介11.1 实验目的11.2 开发工具平台1二 模块设计22.1输入模块设计22.1.1机械按键消抖22.1.2矩阵键盘扫描32.1.3参量输入及显示
2、输入52.2 显示模块62.3三态门控制模块82.4 UART通信协议帧格式及波特率设置92.5 UART通信模块10 2.5.1串口数据发送模块11 2.5.2串口数据接收模块12三 系统介绍133.1系统结构介绍133.2系统子模块介绍153.3 开发板实验结果17四 总结20互联网络一 任务简介1.1 实验目的 本次任务的目标为设计一个基于FPGA的串口通信控制器,具体技术要求如下: (1) 实现与PC的双向通信; (2) 可以通过输入模块在开发板上定义向PC发送的数据; (3) 数据帧长度可调(6/7/8位);(4) 通信波特率可调;(5) 在数码管上实现波特率、输入数据、接收数据的显
3、示。(6) 按键A用于接收模式和输入模式的选择,按键B用于选择输入模式为波特率设置 还是发送数据设置,按键C为发送确认键,按键D用于选择数据帧长度,矩阵键盘 (09)用于输入波特率因子和发送数据(十六进制显示);各种模式均有数码管显示相 应内容,其中数据帧长度由四个LED灯表示。 (7) 操作流程: 1. 通信参数设置:在开发板上选择数据帧长度、设置波特率、输入发送数据帧; 在PC端的串口通信助手中设置波特率和数据帧长度; 2. 数据发送:按下C键向PC发送数据,在PC端确认接收的数据; 3. 数据接收:由PC端向开发板发送数据,在开发板上选择数据接收模式即可显示; 4. 默认设置:UART控
4、制器默认波特率为9600,默认发送数据为8h18;(8) 以上内容均需在开发板上验证;实验截图在本文第三部分给出。1.2 开发工具平台(1) 基于CycloneII EP2C5Q208C8核心的MAGIC3200_EP2C5开发板,具有四位扫描式数码管,RS232串口等外设,时钟CLK为50MHz;(2) 开发软件为Quartus II 13sp;(3) 串口通信助手;(4) 基于LP2303的USB-UART转接线,用于与笔记本电脑进行串口通信。 MAGIC3200_EP2C5开发板 USB-UART转接线 RS232串口 串口通信助手图1.1 开发平台设备二 模块设计2.1 输入模块设计输
5、入模块采用了矩阵键盘和独立按键,独立按键用于模式选择和发送确认,矩阵键盘用于数据的输入。关于消抖部分,对于矩阵键盘来说只要设置合适的扫描频率就可以实现消抖的功能,而对于独立按键来说就必须设计相应的消抖模块。2.2.1 机械按键消抖模块简介 机械按键按下时的机械抖动会产生很多个下降沿,而在逻辑上希望机械按键按下一次只产生一个下降沿,因此要进行按键消抖。按键防抖动其实是通过延时判断来做的,因为这种毛刺持续时间都在ms级,当检测到按键状态有变化时,经过一定延时后再次进行确认。消抖模块如图2.1所示,din为机械按键输入,dout为消抖后的输出。图2.1 消抖模块图关键程序 图2.2为键盘消抖的状态转
6、移图,按键信号din按下时为低电平,平时为高电平。 (1) 状态S0:输入din信号产生跳变后,进入状态S0。如果din为0,进入S1状态。否则循环检测。(2) 状态S1:如果再次检测到输入信号为逻辑0信号,则表明有按键按下,dout为0。状态机结束。状态机激励时钟周期为0.1s,以此实现延时,即按键按下后0.1s检测按键信号,若按键信号为低电平,则输出低电平完成消抖。图2.2 消抖状态机消抖程序如下:always (posedge keyclk) /状态机激励beginif(RESET=0) pre_s=s0;else pre_s=next_s; endalways (pre_s,next_
7、s,din) /检查按键begin case(pre_s) s0: begin dout=1; if(din=0) next_s=s1; else next_s=s0; end s1: begin dout=1; if(din=0) dout=0; else next_s=s0; end default: next_s=s0; endcaseend2.2.2 矩阵键盘扫描简介及原理图 键盘扫描最大的优点就是能节约I/O口。如果使用普通的方法,那么16个按键就需要16个I/O口,但通过扫描的方式来完成,却只需要8个,按键越多它所显现的优势也就越明显。矩阵键盘原理电路如图2.3。键盘扫描将使用行扫
8、描法实现,即逐行扫描查询法。具体操作为:行线的初始状态输出都为0,只要有高电平出现,表明有按键被按下。在确认有按键被按下的情况下,需要确定具体哪个按键被按下。以一定的扫描频率依次将行线(key_out)电平拉高,并检测列线的输入(key_in),确定具体哪个按键被按下。 图2.3 矩阵键盘原理电路 图2.4 键盘扫描模块图图2.5 键盘扫描模块原理图键盘扫描模块如如图2.4所示,输入为reset信号,clk信号(50MHz时钟),模式切换开关swith,列扫描信号key_in;输出为行扫描信号key_out,波特率因子bote,键盘输入值输出Data0Data4,Data1、Data2、Dat
9、a3、Data4为输入模块向显示模块的输出,它们分别对应四位数码管千位、百位、十位、个位显示的内容。send_data为发送数据帧寄存器,图中给出的是8位模式下的键盘扫描模块,所以send_data位宽为8位,在7位和6位模式下扫描模块send_data的位宽分别为7位和6位,其余部分与8位模式下的键盘扫描模块基本一致。speaker为蜂鸣器信号,因为开发板设计上的一些问题,若不定义开发板的蜂鸣器管脚,蜂鸣器有时会响。关键程序其中扫描频率由键盘扫描模块内置的分频模块实现:always (posedge clk or negedge reset)beginif(reset=0) time10ms
10、=0; /最初设计扫描时钟周期为10ms,后来有改动else if(timecnt=1200000) /扫描频率为20Hz(20ms)begin time10ms=time10ms; timecnt=0; endelse timecnt=timecnt+1;end行轮扫的主要程序如下:key_out=scanvalue; /输出行扫描值cpy_scanvalue=scanvalue; /备份扫描值,用于进行列扫描case(scanvalue) /行轮扫4b0001:scanvalue=4b0010;4b0010:scanvalue=4b0100;4b0100:scanvalue=4b1000;
11、4b1000:scanvalue=4b0001;default: scanvalue=4b0001;endcase将键盘扫描与数据输入关联的程序如下: case(key_in,cpy_scanvalue) 8b00010001:begin Data0=1;counter=counter+1; end /对应键盘“1” 8b00100001:begin Data0=2;counter=counter+1; end /对应键盘“2” 8b01000001:begin Data0=3;counter=counter+1; end /对应键盘“3” 8b10000001:begin Data0=4;c
12、ounter=counter+1; end/未使用 8b00010010:begin Data0=4;counter=counter+1; end /对应键盘“4” 8b00100010:begin Data0=5;counter=counter+1; end /对应键盘“5” 8b01000010:begin Data0=6;counter=counter+1; end /对应键盘“6” 8b10000010:begin Data0=4;counter=counter+1; end /未使用 8b00010100:begin Data0=7;counter=counter+1; end /对
13、应键盘“7” 8b00100100:begin Data0=8;counter=counter+1; end /对应键盘“8” 8b01000100:begin Data0=9;counter=counter+1; end /对应键盘“9” 8b10000100:begin Data0=4;counter=counter+1; end /未使用 8b00011000:begin Data0=0;counter=counter+1; end /对应键盘“0” 8b00101000:begin Data0=2;counter=counter+1; end /未使用 8b01001000:begin Data0=3;counter=counter+1; end /未使用 8b10001000:begin Data0=4;counter=counter+1; end /未使用 default:; /无键盘按下 endcase如以上程序所示,每当按下键盘对应按键后,将有对应数值写入寄存器Data0中,寄存器counter为当前输入对