版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、EDA课程设计 课程设计报告课 程 EDA技术与应用 题 目 UART串口数据接收器 院 系 物理与电子工程学院 年 级 专 业 电子信息工程 班 级 3班 学 号 学生姓名 指导教师 设计时间 2010.12 摘 要UART(Universal Asynchronous Receiver Transmitter通用异步收发器)是广泛使用的串行数据传输协议。UART允许在串行链路上进行全双工的通信。通过应用 EDA技术,基于 CPLD/ FPGA器件设计与实现 UART的波特率产生器、UART发送器和接收器及其整合电路,目的是熟练运用 VHDL语言,掌握FPGA芯片的使用。波特率发生器、接收器
2、和发送器是UART的三个核心功能模块,利用VHDL语言对这三个功能模块进行描述并加以整合,通过MaxPlusII仿真,用C+编写串口调试程序进行验证,其结果完全符合UART协议的要求和预期的结果。关键词:UART;串行通讯;VHDL语言;CPLD;仿真目录第一章 课题概述- 3 -1.1 课题背景- 3 -1.2 课题目的与意义- 3 -第二章 相关理论与技术- 4 -2.1 UART相关内容简介- 4 -2.1.1复杂可编程逻辑器件FPGA简介- 4 -2.1.2 RS-232介绍- 4 -2.1.3 VHDL简介- 5 -2.2 UART协议介绍- 6 -2.3硬件结构设计- 7 -2.4
3、软件设计- 7 -2.5开发板介绍- 8 -第三章 课题详细设计与实现- 9 -3.1 UART的整体设计- 9 -3.2 波特率发生器- 11 -3.2.1波特率介绍- 11 -3.2.2波特率的分频计算- 11 -3.3 接收模块设计- 12 -3.3.1接收模块原理- 12 -3.3.2接收模块仿真图- 12 -3.4 串口调试软件- 13 -3.5功能测试- 14 -总 结- 16 -参考文献- 18 -第一章 课题概述1.1 课题背景UART协议是数据通信及控制系统中广泛使用的一种全双工串行数据传输协议。波特率发生器、接收器和发送器是UART的三个核心功能模块,利用VHDL语言对这三
4、个功能模块进行描述并加以整合UART(即Universal AsynchronousReceiver Transmitter 通用异步收发器)是广泛使用的串行数据传输协议。UART允许在串行链路上进行全双工的通信。串行外设用到RS232-C异步串行接口,一般采用专用的集成电路即UART实现。如8250、8251、NS16450等芯片都是常见的UART器件,这类芯片已经相当复杂,有的含有许多辅助的模块(如FIFO),有时我们不需要使用完整的UART的功能和这些辅助功能。或者设计上用到了FPGA/CPLD器件,那么我们就可以将所需要的UART功能集成到FPGA内部。使用VHDL或Veriolog
5、-HDL将UART的核心功能集成,从而使整个设计更加紧凑、稳定且可靠。本文应用EDA技术,基于FPGA/CPLD器件设计与实现UART。1.2 课题目的与意义实际应用上,有时我们不需要使用完整的UART的功能和这些辅助功能。使用VHDL将所需要的UART的核心功能集成到FPGACPLD内部,就可以实现紧凑、稳定且可靠的UART数据传输。这样,既可以满足实际的应用,实现所要求的简单的通信和控制,又能够去除更多不需要的繁杂复杂的功能实现。第二章 相关理论与技术2.1 UART相关内容简介2.1.1复杂可编程逻辑器件FPGA简介FPGA(FieldProgrammable Gate Array),即
6、现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。FPGA是由存放在片内RAM中的程序来设置其工作状态
7、的,因此,工作时需要对片内的RAM进行编程。用户可以根据不同的配置模式,采用不同的编程方式。2.1.2 RS-232介绍RS232接口,就是普通电脑后面那个串口。一般为9针的,也有25针的。是1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”(RS-232C,其中C表示此标准修改了三次).标准中包括了电气和机械方面的规定.该标准规定采用一个25个脚的 DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定.后来
8、随着设备的不断改进,成了目前大家普遍见到的9脚。在不使用传输控制信号的情况下,用3根线就可以传输了,9芯的是2收3发5地,25芯的是2发3收7地。两设备用RS232相连的时候为收发,发收,地地。2.1.3 VHDL简介VHDL语言是一种用于电路设计的高级语言。它在80年代的后期出现。最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言 。 VHDL的英文全写是:VHSIC(Very High Speed Integrated Circuit)Hardware Description Language.翻译成中文就是超高速集成电路硬件描述语言。因此它的应
9、用主要是应用在数字电路的设计中。目前,它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。当然在一些实力较为雄厚的单位,它也被用来设计ASIC。 VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式、描述风格以及语法是十分类似于一般的计算机高级语言。 VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视 部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种
10、将设计 实体分成内外部分的概念是VHDL系统设计的基本点。2.2 UART协议介绍基本的UART通信只需要两条信号线(RxD,TxD)就可以完成数据的全双工通信任务。TxD是UART发送端,为输出;RxD是UART接收端,为输入。UART的基本特点是:在信号线上共有两种状态,分别用逻辑1(高电平)和逻辑O(低电平)来区分。例如,在发送器空闲时,数据线保持在逻辑高电平状态,发送器是通过发送起始位来开始一个数据帧的传送,起始位使数据线处于逻辑O状态,提示接收器数据传输即将开始。接着发送数据位,数据位一般为8位一个字节的数据(也有5位、6位或7位的情况),低位(LSB)在前,高位(MSB)在后。然后
11、发送校验位,校验位一般用来判断传输的数据位有无错误,一般是奇偶校验。在使用中,该位常取消。停止位在最后,用以标识数据传送的结束,它对应于逻辑1状态。UART的帧格式包括起始位(start bit,低电平)、58位数据位(data bits)、校验位(parity bit,可选)和停止位(stop bit,位数可为1、15、2位)。这种格式是由起始位和停止位来实现字符的同步H1,如图l所示。2.3 硬件结构设计UART处理的是并行数据转为串行信号和串行数据转为并行,但并不是简单的转换。分析UART的结构,可以看出UART主要由数据总线接口、控制逻辑接口、波特率发生器、发送逻辑和结束逻辑等部分组成
12、,各部分间的关系如图2所示。图2 UART通信接口结构图2.4软件设计软件采用 Altera公司的 MAX+PLUS设计逻辑结构,设计的内容包括通用 I/O地址译码器、各个寄存器以及 UART核。UART核主要包括 3个部分:波特率发生器、数据发送部分和数据接收部分。 I/O地址译码器和 UART核使用硬件描述语言VHDL来编写实现。2.5开发板介绍本课程设计使用了Mars-EP1C3-S Altera Cyclone FPGA开发板(增强版),该开发板的主芯片采用Altera公司Cyclone系列FPGA芯片EP1C3T144;配置芯片:EPCS1;支持JTAG和AS下载模式;有源晶振:40
13、MHZ ;复位芯片:stc811。 开发板结构如图3所示:图3 Mars-EP1C3-S Altera Cyclone FPGA开发板结构图第三章 课题详细设计与实现3.1 UART的整体设计一般UART通信通过两条信号线完成数据的全双工通信任务。其中,TxD是UART发送端,为输出;RxD是UART接收端,为输入。波特率发生器、接收器和发送器是UART的三个核心功能模块。我们所做的设计主要为数据接收模块。如图4所示的即为接收器的硬件连接示意图,数据从计算机的串口TxD端传送给FPGA的RxD端,最后由LED显示出数据。时钟LED计算机的串口 TxDCLKD1
14、1D0FPGARxD图4硬件连接示意图我们采用状态机的方式来实现串口通讯功能,用一个接收状态寄存器state_rec来表示当前状态。空闲时state_rec=0,此时不断监测接收端口的电平,如果低电平连续保持两个时隙,则转向接受数据状态,state_rec的值从1-8跳转,接受8bit数据。如果低电平没有保持两个时隙,则重新回到空闲状态,state_rec=0。 当八位数据接收完毕,则跳转到停止状态,state_rec=9,此时无论接收端口电平高低,均在下一个状态周期跳转回空闲状态,准备接受下一位数据。若在较复杂的环境下通讯,则可以考虑增加一个通讯失败状态,若检测到停止位为低电平,或者校验位不
15、满足要求,则跳转到失败状态。图5为状态转换图。图5 状态转换图图5 UART状态机示意图3.2 波特率发生器3.2.1波特率介绍 波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变的次数来表示,其单位是波特(Baud)。波特率与比特率的关系是比特率=波特率X单个调制状态对应的二进制位数。模拟线路信号的速率,也称调制速率,以波形每秒的振荡数来衡量。如果数据不压缩,波特率等于每秒钟传输的数据位数,如果数据进行了压缩,那么每秒钟传输的数据位数通常大于调制速率,使得交换使用波特和比特/秒偶尔会产生错误。波特率发生器不是产生波特率时钟的,波特率时钟频率/波特率因子=波特率。波特率发生器的
16、作用是从输入时钟转换出需要的波特率clk。3.2.2波特率的分频计算产生波特率的主信号频率是越高越好,这样才可产生较高且精确的波特率。若是以 40MHz主频率要产生 9600 波特率则必须将此clock= 40MHz除以分频因子520,得到比特率的8倍频,每个接收位将被分为8个时隙数进行同步。因此,实际波特率为40MHZ/520/8=9615.38,其误差率为0.16 %。3.3 接收模块设计3.3.1接收模块原理接收不是由本机启动,而是由一个外部事件触发的。在空闲状态时,若接收线上出现一个下降沿,即视为一个可能的起始位,应该对其再次采样加以确定。一个真实的起始位,其低电平维持时间为104.3
17、ns。我们在起始位下降沿后,以波特率的8倍频对接收线采样两次,若均为低电平,则表示该信号确实为低电平。否则,表明是一个干扰信号,UART仍回到空闲状态。若确认接收线的状态为低,则这个起始位得到确认,UART开始接收后续数据。UART核心在八倍波特率的时钟下工作,因此每个接收状态被分成八个时隙,仅检测其中一个时隙的高低电平状态来作为该数据位的电平,从而避开传输过程中可能出现的噪音。UART对数据接收的时序图参见图6,接收完毕UART又回到空闲状态。3.3.2接收模块仿真图设计所做的接收模块为10位异步串口接收,即每接收一个字节的数据都要经过起始位,8位数据位以及停止位。如图6所示的接收模块时序仿
18、真图,空闲时,数据线保持逻辑高电平,接收到数据时起始位出现逻辑低电平,表示数据传输的开始。随后接收8位数据位,通常采用ASCII码,从最低位开始传送。停止位标志着一个字节传输的结束,之后跳转到空闲状态,等待下一个数据的接收。 UART设计在八倍波特率的时钟下工作,因此为了减少噪声干扰,我们将每个状态分为8个时隙。接收数据时,只需对数据位的其中一个时隙的高低电平进行采样,本设计中为第5个时隙,如图7所示。图6 接收模块的时序仿真图 图7 接收模块各状态时序仿真图3.4 串口调试软件 利用C+编写了一个PC端串口发送调试软件,其界面如图8所示。通过串行通讯接口RS-232将PC机和开发板连接,设置
19、好对应的端口,则可以自动建立连接,实现数据传输。图8 串口调试软件界面3.5功能测试本课题中设计的所有模块均采用VHDL硬件描述语言进行描述,在Altera公司的MAXPLUS II开发环境下进行程序的编译、逻辑综合和仿真以及管脚分配,在Mars-EP1C3-S Altera Cyclone FPGA开发板(增强版)上进行验证。 将开发板接上电源,输入端跟电脑主机接口相连。在电脑上打开串口调试软件,将串口改成COM1,会显示串口成功打开,点一下图上的LED灯,这时会有一个串行数据从电脑接口发出,发送到开发板上,经过开发板上的芯片处理,我们会发现与电脑图上相同位置的开发板上的LED灯会亮。一切与
20、预期结果一样,测试成功。图8 功能测试图总 结这次EDA课程设计历时一个多星期,在这段日子里,可以说是苦多于甜,但是可以学的到很多很多的东西,同时不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。我们的课题是UART串口数据接收器,以前从来没有听说过这个器件,但当每一个子模块编写调试成功时,心里特别的开心。但是在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气。在连接各个模块的
21、时候一定要注意各个输入、输出引脚的线宽,因为每个线宽是不一样的,只要让各个线宽互相匹配,才能得出正确的结果,否则,出现任何一点小的误差就会导致整个文件系统的编译出现错误提示,在器件的选择上也有一定的技巧,只有选择了合适当前电路所适合的器件,编译才能得到完满成功。 通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中现了自己的不足之处,对以前所
22、学过的知识理解得不够深刻,掌握得不够牢固。 总的来说,这次设计的结果还是比较成功的,在设计中遇到了很多问题,最后在华老师的辛勤的指导下,终于游逆而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。 知识是无穷无尽的,知识的获取需要一颗上进的心,老师将我们领进了门,下面的路就应该我们自己出去去走,即使充满荆棘,也要努力奋斗向前冲。最后,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!参考文献【1】EDA技术与应用(第二版) 西安电子科技大学出版
23、社【2】FPGA/CPLD应用设计200例 北京航空航天大学出版【3】基于FPGA的URAT设计,聂涛,许世宏 现代电子技术2006年第二期总第217期附录:接收模块的源程序library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY UART IS PORT ( clk : IN std_logic; rst : IN std_logic; rxd : IN std_logic; -串行数据接收端 seg_data : OUT std_
24、logic_vector(11 DOWNTO 0) -数码管数据 ); END UART;ARCHITECTURE arch OF UART IS -/inner reg/ SIGNAL div_reg : std_logic_vector(15 DOWNTO 0);-分频计数器,分频值由波特率决定。分频后得到频率8倍波特率的时钟 SIGNAL div8_rec_reg : std_logic_vector(2 DOWNTO 0); -寄存器的计数值对应接收时当前位于的时隙数 SIGNAL state_rec : std_logic_vector(3 DOWNTO 0); - 接受状态寄存器
25、SIGNAL clkbaud_rec : std_logic; -以波特率为频率的接受使能信号 SIGNAL clkbaud8x : std_logic; -以8倍波特率为频率的时钟,它的作用是将发送或接受一个bit的时钟周期分为8个时隙 SIGNAL recstart : std_logic; - 开始发送标志 SIGNAL recstart_tmp : std_logic; -开始接受标志 SIGNAL rxd_reg1 : std_logic; -接收寄存器1 SIGNAL rxd_reg2 : std_logic; -接收寄存器2,因为接收数据为异步信号,故用两级缓存 SIGNAL r
26、xd_buf : std_logic_vector(7 DOWNTO 0);-接受数据缓存 -/ CONSTANT div_par : std_logic_vector(15 DOWNTO 0) := "0000000100000100" -分频参数,其值由对应的波特率计算而得,按此参数分频的时钟频率是波倍特率的8倍,此处值对应9600的波特率,即分频出的时钟频率是9600*8 SIGNAL txd_xhdl3 : std_logic; -SIGNAL en : std_logic; - 成功接收标志BEGIN PROCESS(clk,rst) BEGIN IF (NOT
27、rst = '1') THEN div_reg <= "0000000000000000" ELSIF(clk'EVENT AND clk='1')THEN IF (div_reg = div_par - "0000000000000001") THEN div_reg <= "0000000000000000" ELSE div_reg <= div_reg + "0000000000000001" END IF; END IF; END PROCESS;
28、 -分频得到8倍波特率的时钟 PROCESS(clk,rst) BEGIN IF (NOT rst = '1') THEN clkbaud8x <= '0' ELSIF(clk'EVENT AND clk='1')THEN IF (div_reg = div_par - "0000000000000001") THEN clkbaud8x <= NOT clkbaud8x; END IF; END IF; END PROCESS; - PROCESS(clkbaud8x,rst) BEGIN IF (NOT
29、 rst = '1') THEN div8_rec_reg <= "000" ELSE IF(clkbaud8x'EVENT AND clkbaud8x = '1') THEN IF (recstart = '1') THEN -接收开始标志 div8_rec_reg <= div8_rec_reg + "001"-接收开始后,时隙数在8倍波特率的时钟下加1循环 END IF; END IF; END IF; END PROCESS; PROCESS(div8_rec_reg) BEGI
30、N IF (div8_rec_reg = "111") THEN clkbaud_rec <= '1' -在第7个时隙,接收使能信号有效,将数据打入 ELSE clkbaud_rec <= '0' END IF; END PROCESS; PROCESS(clkbaud8x,rst) -接受PC机的数据 BEGIN IF (NOT rst = '1') THEN rxd_reg1 <= '0' rxd_reg2 <= '0' rxd_buf <= "000
31、00000" state_rec <= "0000" recstart <= '0' recstart_tmp <= '0' ELSE IF(clkbaud8x'EVENT AND clkbaud8x = '1') THEN rxd_reg1 <= rxd; rxd_reg2 <= rxd_reg1; IF (state_rec = "0000") THEN IF (recstart_tmp = '1') THEN recstart <=
32、 '1' recstart_tmp <= '0' state_rec <= state_rec + "0001"-(第2个8xbaud) ELSE IF (NOT rxd_reg1 AND rxd_reg2) = '1') THEN -检测到起始位的下降沿,进入接受状态(第1个8xbaud) recstart_tmp <= '1' END IF; END IF; ELSE IF (state_rec >= "0001" AND state_rec<="
33、1000") THEN IF (clkbaud_rec = '1') THEN rxd_buf(7) <= rxd_reg2; rxd_buf(6 DOWNTO 0) <= rxd_buf(7 DOWNTO 1); state_rec <= state_rec + "0001" END IF; ELSE IF (state_rec = "1001") THEN IF (clkbaud_rec = '1') THEN state_rec <= "0000" recstart <= '0' END IF; END IF; END IF; END IF; END IF;END IF; END PROCESS; PROCESS(rxd_buf) -LED译码 BEGIN IF
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论