首页 基于FPGA的RS-232串口通信控制器设计

基于FPGA的RS-232串口通信控制器设计

举报
开通vip

基于FPGA的RS-232串口通信控制器设计基于FPGA的RS-232串口通信控制器设计 基于FPGA的RS-232串口通信控制器 设计 摘要 串口是可以在使用一根线发送数据的同时用另一根线接收数据。串口通信协议也可以用于获取远程采集设备的数据。通过RS,232以实现计算机之间、计算机与设备之间相互通信,目前仍是通讯领域广泛使用的方法之一。几乎每台计算机都有一两个串行接口,用来与调制解调器、实验室设备、工控设备、POS终端等进行数据传输。RS-232以其方便、经济的实现特点,一直深受工程界的青睐。不论是在电力、工控还是电信、金融交通等诸多行业都有广泛的...

基于FPGA的RS-232串口通信控制器设计
基于FPGA的RS-232串口通信控制器设计 基于FPGA的RS-232串口通信控制器 设计 摘要 串口是可以在使用一根线发送数据的同时用另一根线接收数据。串口通信协议也可以用于获取远程采集设备的数据。通过RS,232以实现计算机之间、计算机与设备之间相互通信,目前仍是通讯领域广泛使用的方法之一。几乎每台计算机都有一两个串行接口,用来与调制解调器、实验室设备、工控设备、POS终端等进行数据传输。RS-232以其方便、经济的实现特点,一直深受工程界的青睐。不论是在电力、工控还是电信、金融交通等诸多行业都有广泛的应用。 系统主芯片采用RS-232串口通信控制器,由基本时钟发生电路模块,复位电路模块,波特率选择模块,数据帧格式选择模块,串并转换模块组成。经编译和仿真所设计的程序,在可编程逻辑器件上下载验证,结合FPGA技术高度灵活性与模块化的特点,实现基本RS-232总线通信的功能,以实现串口数据帧结构选择,串并转换,波特率选择等功能。通过软件仿真,得到功能的验证,并进行功能逻辑模块的整合,从而验证设计的可行性与可靠性。 关键词: RS-232串口通信控制器;硬件描述语言; FPGA II Abstract communications between equipment, is still widely used method of communication field. Almost every computer has a serial interface, used and modems, laboratory equipment, industrial equipment, POS terminals, etc for data transmission. With its rs-five 232 convenient, economical realization of engineering characteristics, has been deeply favored. Whether in electric power, telecommunications, financial traffic control or many industries have widely application. The master chip adopt rs-five 232 serial communication controller, the basic clock circuit module, reset circuit happened module, baud rate, data frame format selection module choice module, and conversion module composition string. The compiler and simulation design program, in programmable logic devices on FPGA technology, combining download highly flexible and modular characteristics, basic RS - 232 fieldbus communication function, in order to realize the serial data frame structure, and the conversion of choice, baud rate etc. Function. Through the simulation test, the function and the integration of the logical module function, which verified the feasibility and reliability of the design. Keywords: RS - 232 serial communication controller, Hardware description language, The FPGA III 目录 1 绪论 ....................................................... 1 1.1 选 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 背景 .............................................................................................1 1.1.1 课题相关技术的发展..............................................................1 1.1.2 课题研究的必要性 ..................................................................2 1.2 课题研究的内容 ................................................................................3 2 FPGA及RS-232简介 ......................................... 4 2.1 FPGA概述 ..........................................................................................4 2.1.2 FPGA基本结构 ..............................................................................6 2.1.3 FPGA系统设计流程 ......................................................................8 2.1.4 FPGA开发编程原理 ....................................................................11 2.2 RS-232概述........................................................................................ 12 2.2.1 RS-232电气特性 ..................................................................... 13 2.2.2 RS-232连接器的机械特性 ................................................. 13 2.2.3 RS-232的接口信号.............................................................. 14 3 RS-232串口通信控制器硬件设计方案 ........................ 18 3.1 锁相环设计 ........................................................................................ 18 3.2 模式选择模块设计 ........................................................................... 19 3.3 接收模块设计 .................................................................................... 19 3.4 发送模块设计 .................................................................................... 21 4 RS-232控制器软件设计 ..................................... 23 4.1 模式选择模块软件设计 ................................................................... 23 4.2 接收模块软件设计 ........................................................................... 24 4.3 发送模块软件设计 ........................................................................... 26 5 研究展望 .................................................. 28 实验结论 ..................................................... 29 致谢 ......................................................... 30 参考文献 ..................................................... 31 附录 ......................................................... 32 1 1 绪论 现代社会的标志之一就是信息产品的广泛使用,而且是产品的性能越来越强,复杂程度越来越高,更新步伐越来越快。支撑信息电子产品高速发展的基础就是微电子制造工艺水平的提高和电子产品设计开发技术的发展。前者以微细加工技术为代表,而后者的代表就是电子设计自动化(electronic design automatic,EDA)技术。 本设计采用的VHDL是一种全方位的硬件描述语言,具有极强的描述能力,能支持系统行为级、寄存器传输级和逻辑门级三个不同层次的设计;支持结构、数据流、行为三种描述形式的混合描述、覆盖面广、抽象能力强,因此在实际应用中越来越广泛。ASIC是专用的系统集成电路,是一种带有逻辑处理的加速处理器。而FPGA是特殊的ASIC芯片,与其他的ASIC芯片相比,它具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及可实时在线 检测 工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训 等优点。 在控制系统中,键盘是常用的人机交换接口,当所设置的功能键或数字键按下的时候,系统应该完成该键所设置的功能。因此,键信息输入是与软件结构密切相关的过程。根据键盘的结构不同,采用不同的编码方法。但无论有无编码以及采用什么样的编码,最后都要转换成为相应的键值,以实现按键功能程序的转移。 1.1 选题背景 本节将从FPGA嵌入式应用开发技术与数字钟技术发展的客观实际出发,通过对该技术发展状况的了解,以及课题本身的需要,指出研究基于FPGA的芯片系统与设计——数字钟的设计与实现的必要性。 1.1.1 课题相关技术的发展 当今电子产品正向功能多元化,体积最小化,功耗最低化的方向发展。它与传统的电子产品在设计上的显著区别师大量使用大规模可编程逻辑器件,使产品的性能提高,体积缩小,功耗降低.同时广泛运用现代 计算机技术,提高产品的自动化程度和竞争力,缩短研发周期。EDA技术正是为了适应现代电子技术的要求,吸收众多学科最新科技成果而形成的一门新技术。 美国ALTERA公司的可编程逻辑器件采用全新的结构和先进的技术,加上MaxplusII(或最新的QUARTUS)开发环境,更具有高性能,开发周期短等特点,十分方便进行电子产品的开发和设计。 EDA技术,技术以大规模可编程逻辑器件为设计载体,以硬件描述语言为系统逻辑描述主要表达方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件的方式设计的电子系统到硬件系统的逻辑编译,逻辑化简,逻辑分割,逻辑映射,编程下载等工作。最终形成集成电子系统或专用集成芯片的一门新技术。 本设计利用VHDL硬件描述语言结合可编程逻辑器件进行的,并通过数码管动态显示计时结果。数字钟可以由各种技术实现,如单片机等.利用可编程逻辑器件具有其他方式没有的特点,它具有易学,方便,新颖,有趣,直观,设计与实验项目成功率高,理论与实践结合紧密,体积小,容量大,I/O口丰富,易编程和加密等特点,并且它还具有开放的界面,丰富的设计库,模块化的工具以及LPM定制等优良性能,应用非常方便。因此,本设计采用可编程逻辑器件实现。 1.1.2 课题研究的必要性 现在是一个知识爆炸的新时代。新产品、新技术层出不穷,电子技术的发展更是日新月异。可以毫不夸张的说,电子技术的应用无处不在,电子技术正在不断地改变我们的生活,改变着我们的世界。在这快速发展的年代,速度,精准对人们来说是越来越宝贵,在快节奏的生活时, RS-232串口通信控制器给人们带来了极大的方便。近些年,随着科技的发展和社会的进步,人们对科技的要求也越来越高,传统的东西已不能满足人们的需求。 1.2 课题研究的内容 本设计主要研究基于FPGA的RS-232串口控制器,针对具体设计要求进行原理设计(可在一般电子线路CAD软件,如protel99se上完成),提供电子版电路原理图用Quartus?软件进行时序仿真,验证设计性能的可行性与可靠性,并提供相应的仿真效果图采用VHDL语言设计相关的功能化模块,实现串口数据帧结构选择,串并转换,波特率选择等功能。通过具体操作,验证设计的稳定性与操作的灵活性。 2 FPGA及RS-232简介 2.1 FPGA概述 FPGA(Field,Programmable Gate Array),即现场可编程门阵列,是目前应用最广泛的现场可编程逻辑器件(FPLD)之一。FPGA是一类高集成度的可编程逻辑器件,起源于美国的Xillnx公司,该公司于1985年推出了世界上第一块FPGA芯片。在这二十年的发展过程中,FPGA的硬件体系结构和软件开发工具都在不断的完善,日趋成熟。从最初的1200个可用门,90年代时几十万个可用门,发展到目前数百万门至上千万门的单片FPGA芯片,Xilinx、Altera等世界顶级厂商已经将FPGA器件的集成度提高到一个新的水平。FPGA结合了微电子技术、电路技术、EDA技术,使设计者可以集中精力进行所需逻辑功能的设计,缩短设计周期,提高设计质量。 FPGA的应用领域最初为通信领域,但目前,随着信息产业和微电子技术的发展,可编程逻辑嵌入式系统设计技术已经成为信息产业最热门的技术之一,应用范围遍及航空航天、医疗、通讯、网络通讯、安防、广播、汽车电子、工业、消费类市场、测量测试等多个热门领域。并随着工艺的进步和技术的发展,向更多、更广泛的应用领域扩展。越来越多的设计也开始以ASIC转向FPGA, FPGA正以各种电子产品的形式进入了我们日常生活的各个角落。 目前以硬件描述语言(Verilog 或 VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至 FPGA 上进行测试,是现代 IC 设计验证的技术主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flip,flop)或者其他更加完整的记忆块。 2.1.1 FPGA的发展历史 早期的可编程逻辑器件只有可编程只读存储器(PROM)、紫外线可擦除只读存储器(EPROM)和电可擦除只读存储器(E2PROM)三种。由于结构的限制,它们只能完成简单的数字逻辑功能。 其后出现了一类结构上稍复杂的可编程芯片,即可编程逻辑器件(PLD),它能够完成各种数字逻辑功能。典型的PLD由一个“与”门和一个“或”门阵列组成,而任意一个组合逻辑都可以用“与—或”表达式来描述,所以PLD能以乘积和的形式完成大量的组合逻辑功能。 这一阶段的产品主要有PAL(可编程阵列逻辑)和GAL(通用阵列逻辑)。 PAL由一个可编程的“与”平面和一个固定的“或”平面构成,或门的输出可以通过触发器有选择地被置为寄存状态。PAL器件是现场可编程的,它的实现工艺有反熔丝技术、EPROM技术和E2PROM技术。还有一类结构更为灵活的逻辑器件是可编程逻辑阵列(PLA),它也由一个“与”平面和一个“或”平面构成,但是这两个平面的连接关系是可编程的。PLA器件既有现场可编程的,也有掩膜可编程的。在PAL的基础上又发展了一种通用阵列逻辑(GAL,Generic ArrayLogic),如GAL16V8、GAL22V10等。它采用了E,PROM工艺,实现了电可擦除、电可改写,其输出结构是可编程的逻辑宏单元,因而它的设计具有很强的灵活性,至今仍有许多人使用。这些早期的PLD器件的一个共同特点是可以实现速度特性较好的逻辑功能,但其过于简单的结构也使它们只能实现规模较小的电路。 为了弥补这一缺陷,20世纪80年代中期,Altera和Xilinx分别推出了类似于PAL结构的扩展型CPLD(Complex Programmable Logic Dvice)和与标准门阵列类似的FPGA(FieldProgrammable Gate Array),它们都具有体系结构和逻辑单元灵活、集成度高以及适用范围宽等特点。这两种器件兼容了PLD和通用门阵列的优点,可实现较大规模的电路,编程也很灵活。与门阵列等其他ASIC(Application Specific IC)相比,它们又具有设计开发周期短、设计制造成本低、开发工具先进、 标准产品不需测试、质量稳定以及可实时在线检验等优点,因此被广泛应用于产品的原型设计和产品生产(一般在10 000件以下)之中。几乎所有应用门阵列、PLD和中小规模通用数字集成电路的场合均可应用FPGA和CPLD器件。 FPGA和CPLD的内部结构稍有不同。通常,FPGA中的寄存器资源比较丰富,适 合同 劳动合同范本免费下载装修合同范本免费下载租赁合同免费下载房屋买卖合同下载劳务合同范本下载 步时序电路较多的数字系统;CPLD中组合逻辑资源比较丰富,适合组合电路较多的控制应用。在这两类可编程逻辑器件中,CPLD提供的逻辑资源较少,而FPGA提供了最高的逻辑密度、最丰富的特性和极高的性能,已经在通信、消费电子、医疗、工业和军事等各应用领域当中占据重要地位。因此,本文主要针对FPGA进行阐述。 2.1.2 FPGA基本结构 FPGA具有掩膜可编程门阵列的通用结构,它由逻辑功能块排成阵列,并由可编程的互连资源连接这些逻辑功能块来实现不同的设计。 FPGA一般由3种可编程电路和一个用于存放编程数据的静态存储器SRAM组成。这3种可编程电路是:可编程逻辑模块(CLB--Configurable Logic Block)、输入/输出模块(IOB--I/O Block)和互连资源(IR—Interconnect Resource)。可编程逻辑模块CLB是实现逻辑功能的基本单元,它们通常规则的排列成一个阵列,散布于整个芯片;可编程输入/输出模块(IOB)主要完成芯片上的逻辑与外部封装脚的接口,它通常排列在芯片的四周;可编程互连资源包括各种长度的连接线段和一些可编程连接开关,它们将各个CLB之间或CLB、IOB之间以及IOB之间连接起来,构成特定功能的电路。 1.CLB是FPGA的主要组成部分。图2-1是CLB基本结构框图,它主要由逻辑函数发生器、触发器、数据选择器等电路组成。CLB中3个逻辑函数发生器分别是G、F和H,相应的输出是G’ 、F’和H’。G有4个输入变量G1、G2、G3和G4;F也有4个输入变量F1、F2、F3和F4。这两个函数发生器是完全独立的,均可以实现4输入变量的任意组合逻辑函数。逻辑函数发生器H有3个输入信号;前两个是函数发生器的输出G’和F’, 而另一个输入信号是来自信号变换电路的输出H1。这个函数发生器能实现3输入变量的各种组合函数。这3个函数发生器结合起来,可实现多达9变量的逻辑函数。 CLB中有许多不同规格的数据选择器(四选一、二选一等),通过对CLB内部数据选择器的编程,逻辑函数发生器G、F和H的输出可以连接到CLB输出端X或Y,并用来选择触发器的激励输入信号、时钟有效边沿、时钟使能信号以及输出信号。这些数据选择器的地址控制信号均由编程信息提供,从而实现所需的电路结构。 CLB中的逻辑函数发生器F和G均为查找表结构,其工作原理类似于ROM。F和G的输入等效于ROM的地址码,通过查找ROM中的地址表可以得到相应的组合逻辑函数输出。另一方面,逻辑函数发生器F和G还可以作为器件内高速RAM或小的可读写存储器使用,它由信号变换电路控制。 2.输入/输出模块IOB。IOB提供了器件引脚和内部逻辑阵列之间的连接。它主要由输入触发器、输入缓冲器和输出触发/锁存器、输出缓冲器组成。 每个IOB控制一个引脚,它们可被配置为输入、输出或双向I/O功能。当IOB控制的引脚被定义为输入时,通过该引脚的输入信号先送入输入缓冲器。缓冲器的输出分成两路:一路可以直接送到MUX,另一路经延时几纳秒(或者不延时)送到输入通路D触发器,再送到数据选择器。通过编程给数据选择器不同的控制信息,确定送至CLB阵列的I1和I2是来自输入缓冲器,还是来自触发器。 当IOB控制的引脚被定义为输出时,CLB阵列的输出信号OUT也可以有两条传输途径:一条是直接经MUX送至输出缓冲器,另一条是先存入输出通路D触发器,再送至输出缓冲器。 IOB输出端配有两只MOS管,它们的栅极均可编程,使MOS管导通或截止,分别经上拉电阻接通Vcc、地线或者不接通,用以改善输出波形和负载能力。 可编程CLB CLB CLB CLB 开关 矩 输入CLBCLB CLB CLB 输出 CLB 模 块 CLB CLBB CLB CLB 互 连资源 CLBCLB CLB CLB CLB B 图2-1 CLB基本结构 3.可编程互连资源IR。可编程互连资源IR可以将FPGA内部的CLB和CLB之间、CLB和IOB之间连接起来,构成各种具有复杂功能的系统。IR主要由许多金属线段构成,这些金属线段带有可编程开关,通过自动布线实现各种电路的连接。 2.1.3 FPGA系统设计流程 一般说来,一个比较大的完整的项目应该采用层次化的描述方法:分为几个较大的模块,定义好各功能模块之间的接口,然后各个模块再细分去具体实现,这就是TOP DOWN(自顶向下)的设计方法。目前这种高层次的设计方法已被广泛采用。高层次设计只是定义系统的行为特征,可以不涉及实现工艺,因此还可以在厂家综合库的支持下,利用综合优化工具将高层次描述转换成针对某种工艺优化的网络表,使工艺转化变得轻而易举。CPLD/FPGA系统设计的工作流程如图2-2所示。 系统划分? VHDL代码或图形方式输入? 编译器? 代码级功能仿真? 仿真综合库 综合器? 适配前时序仿真? 适配器? 器件编程文件? 适配后仿真模型? 适配报告? CPLD/FPGA实现 适配后时序仿真 ASIC实现 图2-2 CPLD/FPGA系统设计流程 流程说明: 1.工程师按照“自顶向下”的设计方法进行系统划分。 2.输入VHDL代码,这是设计中最为普遍的输入方式。此外,还可以采用图形输入方式(框图、状态图等),这种输入方式具有直观、容易理解的优点。 3.将以上的设计输入编译成标准的VHDL文件。 4.进行代码级的功能仿真,主要是检验系统功能设计的正确性。这一步骤适用于大型设计,因为对于大型设计来说,在综合前对源代码仿真,就可以大大减少设计重复的次数和时间。一般情况下,这一仿真步 骤可略去。在Quartus II用VHDL实现新建如图2-3所示 图2-3新建vhdl 5.利用综合器对VHDL源代码进行综合优化处理,生成门级描述的网络表文件,这是将高层次描述转化为硬件电路的关键步骤。综合优化是针对ASIC芯片供应商的某一产品系列进行的,所以综合的过程要在相应的厂家综合库的支持下才能完成。 6.利用产生的网络表文件进行适配前的时序仿真,仿真过程不涉及具体器件的硬件特性,是较为粗略的。一般的设计,也可略去这一步骤。 7.利用适配器将综合后的网络表文件针对某一具体的目标器件进行逻辑映射操作,包括底层器件配置、逻辑分割、逻辑优化和布局布线。 8.在适配完成后,产生多项设计结果:(a)适配报告,包括芯片内部资源利用情况,设计的布尔方程描述情况等;(b)适配后的仿真模型;(c)器件编程文件。根据适配后的仿真模型,可以进行适配后时序仿真,因为已经得到器件的实际硬件特性(如时延特性),所以仿真结果能比较精确的预期未来芯片的实际性能。如果仿真结果达不到设计 要求,就修改VHDL源代码或选择不同速度和品质的器件,直至满足设计要求。 最后将适配器产生的器件编程文件通过编程器或下载电缆载入到目标芯片CPLD/FPGA中。 2.1.4 FPGA开发编程原理 硬件设计需要根据各种性能指标、成本、开发周期等因素,确定最佳的实现方案,画出系统框图,选择芯片,设计PCB并最终形成样机。 CPLD/FPGA软件设计可分为两大块:编程语言和编程工具。编程语言主要有VHDL和Verilog两种硬件描述语言;编程工具主要是两大厂家Altera和Xilinx的集成综合EDA软件(如MAX+plusII、QuartusII、Foundation、ISE)以及第三方工具(如FPGA Express、Modelsim、Synposys SVS等)。具体的设计输入方式有以下几种: 1.HDL语言方式。HDL既可以描述底层设计,也可以描述顶层的设计,但它不容易做到较高的工作速度和芯片利用率。用这种方式描述的项目最后所能达到的性能与设计人员的水平、经验以及综合软件有很大的关系。 2.图形方式。可以分为电路原理图描述,状态机描述和波形描述3种形式。有的软件3种输入方法都支持,如Active-HDL。MAX+plusII 图形输入方式只支持电路原理图描述和波形描述两种。电路原理图方式描述比较直观和高效,对综合软件的要求不高。一般大都使用成熟的IP核和中小规模集成电路所搭成的现成电路,整体放到一片可编程逻辑器件的内部去,所以硬件工作速度和芯片利用率很高,但是但项目很大的时候,该方法就显得有些繁琐;状态机描述主要用来设计基于状态机思想的时序电路。在图形的方式下定义好各个工作状态,然后在各个状态上输入转换条件以及相应的输入输出,最后生成HDL语言描述,送去综合软件综合到可编程逻辑器件的内部。由于状态机到HDL语言有一种标准的对应描述方式,所以这种输入方式最后所能达到的工作速度和芯片利用率主要取决于综合软件;波形描述方式是基于真值表的一种图形输入 方式,直接描述输入与输出的波形关系。这种输入方式最后所能达到的工作速度和芯片利用率也是主要取决于综合软件。 2.2 RS-232概述 EIA RS-232C 是由美国电子工业协会 EIA(Electronic Indust ry Association)在1969年颁布的一种串行物理接口标准。RS(Recommended Standard)是英文“推荐标准”的缩写,232为标识号,C表示修改次数。RS-232C 总线标准设有25条信号线,包括一个主通道和一个辅助通道。在多数情况下主要使用主通道,对于一般双工通信,仅需几条信号线就可实现,如一条发送线、一条接收线及一条地线。 RS-232C 标准规定的数据传输速率为每秒150、300、600、1200、2400、4800、9600、19200波特。 RS-232C 标准规定,驱动器允许有2500pF的电容负载,通信距离将受此电容限制,例 m;若每米电如,采用150pF/m的通信电缆时,最大通信距离为15缆的电容量减小,通信距离可以增加。传输距离短的另一原因是RS-232属单端信号传送,存在共地噪声和不能抑制共模干扰等问题,因此一般用于20m以内的通信。串行通信接口标准经过使用和发展,目前已经有几种。但都是在RS-232标准的基础上经过改进而形成的。所以,以RS-232C为主来讨论。RS-232C标准是美国EIA(电子工业联合会)与BELL等公司一起开发的1969年公布的通信协议。它适合于数据传输速率在0,20000b/s范围内的通信。这个标准对串行通信接口的有关问题,如信号线功能、电器特性都作了明确规定。由于通行设备厂商都生产与RS-232C制式兼容的通信设备,因此,它作为一种标准,目前已在微机通信接口中广泛采用。 RS-232C 标准(协议)的全称是 EIA-RS-232C 标准,其中EIA (Electronic Industry Association)代表美国电子工业协会,RS(recommeded standard)代表推荐标准,232是标识号,C代表RS232的最新一次修改(1969),在这之前,有RS232B、RS232A。。它规定连接电缆和机械、电气特性、信号功能及传送过程。例如, 目前在IBM PC机上的COM1、COM2接口,就是RS-232C接口。 2.2.1 RS-232电气特性 EIA-RS-232C 对电器特性、逻辑电平和各种信号线功能都作了规定。 在TxD和RxD上: 逻辑1(MARK)=-3V,-15V 逻辑0(SPACE)=+3,+15V 在RTS、CTS、DSR、DTR和DCD等控制线上: 信号有效(接通,ON状态,正电压),+3V,+15V 信号无效(断开,OFF状态,负电压)=-3V,-15V 以上规定说明了RS-232C标准对逻辑电平的定义。对于数据(信息码):逻辑“1”(传号)的电平低于-3V,逻辑“0”(空号)的电平高于+3V;对于控制信号;接通状态(ON)即信号有效的电平高于+3V,断开状态(OFF)即信号无效的电平低于-3V,也就是当传输电平的绝对值大于3V时,电路可以有效地检查出来,介于-3,+3V之间的电压无意义,低于-15V或高于+15V的电压也认为无意义,因此,实际工作时,应保证电平在?(3,15)V之间。 EIA RS-232C 与TTL转换:EIA RS-232C 是用正负电压来表示逻辑状态,与TTL以高低电平表示逻辑状态的规定不同。因此,为了能够同计算机接口或终端的TTL器件连接,必须在EIA RS-232C 与TTL电路之间进行电平和逻辑关系的变换。实现这种变换的方法可用分立元件,也可用集成电路芯片。目前较为广泛地使用集成电路转换器件,如MC1488、SN75150芯片可完成TTL电平到EIA电平的转换,而MC1489、SN75154可实现EIA电平到TTL电平的转换。MAX232芯片可完成TTL??EIA双向电平转换。 2.2.2 RS-232连接器的机械特性 连接器:由于RS-232C并未定义连接器的物理特性,因此,出 现了DB-25、DB-15和DB-9各种类型的连接器,其引脚的定义也各不相同。下面分别介绍两种连接器。 (1)DB-25: PC和XT机采用DB-25型连接器。DB-25连接器定义了25根信号线,分为4组: ?异步通信的9个电压信号(含信号地SG)2,3,4,5,6,7,8,20,22 ?20mA电流环信号 9个(12,13,14,15,16,17,19,23,24) ?空6个(9,10,11,18,21,25) ?保护地(PE)1个,作为设备接地端(1脚) 注意,20mA电流环信号仅IBM PC和IBM PC/XT机提供,至AT机及以后,已不支持。 (2)DB-9: 在AT机及以后,不支持20mA电流环接口,使用DB-9连接器,作为提供多功能I/O卡或主板上COM1和COM2两个串行接口的连接器。它只提供异步通信的9个信号。DB-25型连接器的引脚分配与DB-25型引脚信号完全不同。因此,若与配接DB-25型连接器的DCE设备连接,必须使用专门的电缆线。 电缆长度:在通信速率低于20kb/s时,RS-232C 所直接连接的最大物理距离为15m(50英尺)。 最大直接传输距离说明:RS-232C标准规定,若不使用MODEM,在码元畸变小于4%的情况下,DTE和DCE之间最大传输距离为15m(50英尺)。可见这个最大的距离是在码元畸变小于4%的前提下给出的。为了保证码元畸变小于4%的要求,接口标准在电气特性中规定,驱动器的负载电容应小于2500pF。 2.2.3 RS-232的接口信号 RS-232 的功能特性定义了25芯标准连接器中的20根信号线,其中2条地线、4条数据线、11条控制线、3条定时信号线,剩下 的5根线作备用或未定义。常用的只有10根,它们是: (1)联络控制信号线: 数据发送准备好(Data set ready-DSR)——有效时(ON)状态,表明MODEM处于可以使用的状态。 数据终端准备好(Data terminal ready-DTR)——有效时(ON)状态,表明数据终端可以使用。 这两个信号有时连到电源上,一上电就立即有效。这两个设备状态信号有效,只表示设备本身可用,并不说明通信链路可以开始进行通信了,能否开始进行通信要由下面的控制信号决定。 请求发送(Request to send-RTS)——用来表示DTE请求DCE发送数据,即当终端要发送数据时,使该信号有效(ON状态),向MODEM请求发送。它用来控制MODEM是否要进入发送状态。 允许发送(Clear to send-CTS)——用来表示DCE准备好接收DTE发来的数据,是对请求发送信号RTS的响应信号。当MODEM已准备好接收终端传来的数据,并向前发送时,使该信号有效, 通知 关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知 终端开始沿发送数据线TxD发送数据。 这对RTS/CTS请求应答联络信号是用于半双工MODEM系统中发送方式和接收方式之间的切换。在全双工系统中,因配置双向通道,故不需要RTS/CTS联络信号,使其变高。 接收线信号检出(Received Line detection-RLSD)——用来表示DCE已接通通信链路,告知DTE准备接收数据。当本地的MODEM收到由通信链路另一端(远地)的MODEM送来的载波信号时,使RLSD信号有效,通知终端准备接收,并且由MODEM将接收下来的载波信号解调成数字两数据后,沿接收数据线RxD送到终端。此线也叫做数据载波检出(Data Carrier dectection-DCD)线。 振铃指示(Ringing-RI)——当MODEM收到交换台送来的振铃呼叫信号时,使该信号有效(ON状态),通知终端,已被呼叫。 (2)数据发送与接收线: 发送数据(Transmitted data-TxD)——通过TxD终端将串行数据 发送到MODEM,(DTE?DCE)。 接收数据(Received data-RxD)——通过RxD线终端接收从MODEM发来的串行数据,(DCE?DTE)。 (3)地线 : GND、Siq.GND——保护地和信号地,无方向。 上述控制信号线何时有效,何时无效的顺序表示了接口信号的传送过程。例如,只有当DSR和DTR都处于有效(ON)状态时,才能在DTE和DCE之间进行传送操作。若DTE要发送数据,则预先将DTR线置成有效(ON)状态,等CTS线上收到有效(ON)状态的回答后,才能在TxD线上发送串行数据。这种顺序的规定对半双工的通信线路特别有用,因为半双工的通信才能确定DCE已由接收方向改为发送方向,这时线路才能开始发送。 2个数据信号:发送TXD;接收RXD。 1个信号地线:SG。 6个控制信号: DSR 数传发送准备好,Data Set Ready。 DTR 数据终端准备好,Data Terminal Ready。 RTS DTE请求DCE发送(Request To Send)。 CTS DCE允许DTE发送(Clear To Send),该信号是对RTS信号的回答。 DCD 数据载波检测(Data Carrier Detection),当本地DCE设备(Modem)收到对方的DCE设备送来的载波信号时,使DCD有效,通知DTE准备接收, 并且由DCE将接收到的载波信号解调为数字信号, 经RXD线送给DTE。 RI 振铃信号(Ringing),当DCE收到对方的DCE设备送来的振铃呼叫信号时,使该信号有效,通知DTE已被呼叫。 由于RS232接口标准出现较早,难免有不足之处,主要有以下四点: (1)接口的信号电平值较高,易损坏接口电路的芯片,又因为 与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接。 (2)传输速率较低,在异步传输时,波特率?20Kbps。 (3)接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。 (4)传输距离有限,最大传输距离标准值为50英尺(实际?15米)。 3 RS-232串口通信控制器硬件设计方案 在RS-232串口通信控制器设计中,一共包括锁相环,模式选择,接受模块和发送模块设计四部分。 3.1 锁相环设计 压控振荡器(用来产生信号),故名思议是根据输入的信号的电压(该电压是输入信号与标准信号的误差)来调整控制他本身输出信号的频率和相位(频率的变化会导致相位的变化),因为是个环路,所以然后再与输入信号比较,直至没有误差时,这时压控振荡器的输入为零,那么其输出就不变了。从而能稳定锁住输入信号的相位,故名锁相环。锁相环如图3-1所示。 图3-1 锁相环设计流程 锁相环由鉴相器、环路滤波器和压控振荡器组成。鉴相器用来鉴别输入信号之间的相位差 ,并输出误差电压。误差电压中的噪声和干扰成分被低通性质的环路滤波器滤除 ,形成压控振荡器(VCO)的控制电压。控制电压作用于压控振荡器的结果是把它的输出振荡频率。振荡频率拉向环路输入信号频率,当二者相等时,环路被锁定 。 锁相环在图中的用途是?可以在收、发通信双方建立载波同步或位同步。?可以使时钟倍频增加,例如从图中的25MHz变成50MHz?可以使时钟的相位稳定 3.2 模式选择模块设计 图3-2 模式选择设计流程 模式选择模块实现对于按键模式输入进行判断,对于不同输入命令,进行解析,得到发送与接收使能模式输出,使功能实现时分操作的目的。 模式选择模块输入协议分为以下两类: 1( 如果输入值是0B01时,接收模块使能输出,同时,屏蔽发送模块使能; ( 如果输入值是0B10时,发送模块使能输出,同时,屏蔽接收2 模块使能。 模式选择模块实现“软件开关”的作用,在每一功能时刻,保证串口控制器工作在一种模式之中,防止软件程序“竞争”,从而造成“死锁”现象发生,充分保证设计的安全性与运行的可靠性。 3.3 接收模块设计 串口接收模块针对于接收串行数据进行协议包的解析,实现串行数据输入,并行数据输出的功能,从接收判断的角度,实现了对于串口协议的解析功能。 串口接收模块,输入控制信号分为: 1( 16位波特率分频系数输入端:其值表示对于系统50Mhz时 钟分频的结果,实现对于不同波特率产生的分频输入,可以 方便调节不同模式下的波特率,实现参数化设计。 2( 2位数据位输入控制位:当前输入表示串口控制协议中,数 据位的宽度,其中“01”表示数据位为7位,“10”表示数 据位为8位,“11”表示数据位为9位,“00”表示当前设置 无效。 3( 2位校验位输入控制位:当前输入表示串口控制协议中,校 验模式的选择,其中 “01”表示奇数校验,“10” 表示偶 数校验,“11” 表示无校验,“00”表示当前设置无效。 4( 1位停止位输入控制:当前输入表示串口控制协议中,停止 位的模式选择,其中“0”表示1位停止位,“1”表示2位 停止位。 串口接收模块,输出控制信号分为: 1( 数据有效信号:0表示数据无效,1表示数据有效 2( 并行9位输出数据:表示当前串口协议解释后,7至9位并 行数据输出。 图3-3 接收模块设计 3.4 发送模块设计 串口发送模块针对于接收并行数据进行协议的组包设计,实现并行数据输入,串行数据输出的功能,从发送的角度,实现了对于串口协议的组合功能。发送模块设计与接收模块类似,依然针对波特率,数据位,校验位,停止位进行控制,实现全双向的串口通信控制功能。 图3-4发送设计流程 串口发送模块,输入控制信号分为: 1( 16位波特率分频系数输入端:其值表示对于系统50Mhz时 钟分频的结果,实现对于不同波特率产生的分频输入,可以 方便调节不同模式下的波特率,实现参数化设计。 2( 2位数据位输入控制位:当前输入表示串口控制协议中,数 据位的宽度,其中“01”表示数据位为7位,“10”表示数 据位为8位,“11”表示数据位为9位,“00”表示当前设置 无效。 3( 2位校验位输入控制位:当前输入表示串口控制协议中,校 验模式的选择,其中 “01”表示奇数校验,“10” 表示偶 数校验,“11” 表示无校验,“00”表示当前设置无效。 4( 1位停止位输入控制:当前输入表示串口控制协议中,停止 位的模式选择,其中“0”表示1位停止位,“1”表示2位 停止位。 串口发送模块,输出控制信号分为: 1( 数据输出有效指示信号:0表示数据无效,1表示数据有效 2( 串行输出数据:表示对于控制协议解析后,对于原配置并行 数据的串并转换后的协议输出。 4 RS-232控制器软件设计 本设计基于VHDL语言设计,实现了基于FPGA的硬件逻辑设计,从设计方式上,具有高度的灵活性,与可移植性,便于系统二次开发与项目集成整合,符合未来发展趋势。其中,软件设计内容,主要针对于不同模块进行说明,对于RS-232工作过程,进行匹配解析。 4.1 模式选择模块软件设计 模式选择模块整体工作流程如图4-1所示: 开始 模式选择 0B010B10 接收使能发送使能 结束 图4-1模式判断模块工作流程 模式判断模块的软件程序,主要包括以下实体部分: entity mode_sel is port( clr: in std_logic; clk: in std_logic; mode_sel: in std_logic_vector(1 downto 0); receive_enable : out std_logic; send_enable : out std_logic ); end entity mode_sel; 其仿真波形图,如图4-2所示: 图4-2模式判断模块仿真波形图 4.2 接收模块软件设计 当模式判断为接收模块,就先要对接收来的数据进行判断。具体过 程: 第一步输入数据产生波特率(表示对于时钟的分频), 产生波特率 时钟然后进入数据指示,‘0’表示数据无效,‘1’表示数据有效;如果 有效就进入指示模块工作启示。 第二步在一起正常的时候就进行起始位寄存器,先判断起始位,判 断起始位几个周期,一般只有1到2位起始位;然后进入数据寄存器, 判断有几位数据(一般是8-10个),‘01’表示7位,‘10’表示8位, ‘11’表示9位,‘00’表示无效,然后输出数据,7至9位并行数据输 出;再进入校验寄存器,如果是‘01’表示奇数校验,‘10’表示偶数 校验,‘11’表示无校验,‘00’表示无效;最后到停止位寄存器,判断 停止位有多长,‘0’表示1位,‘1’表示2位。 第三步实现串行数据转换成并行数据,然后就将其数据进行提取, 提取的数据在判断校验是否有效,如果校验的数据有效就进行输出,若 无效就结束。 接收模块的软件程序,主要包括以下实体部分: entity rec_judge is port( clr: in std_logic; clk: in std_logic; judge_enable: in std_logic; data_input: in std_logic; baud_rate : in std_logic_vector(15 downto 0); data_bit : in std_logic_vector(1 downto 0); check_bit : in std_logic_vector(1 downto 0); end_bit : in std_logic; data_valid : out std_logic data_output: out std_logic_vector(8 downto 0)、 ); end entity rec_judge; 其中,clr为复位信号输入,clk为50Mhz系统时钟输入,judge_enable 为接收使能控制信号输入,data_input为串行输入数据。 其仿真波形图,如图4-3所示: 图4-3 接收模块仿真波形图 4.3 发送模块软件设计 当模式判断为发送模块,就先要对发送来的数据进行判断。具体过 程:第一步输入数据产生波特率(表示对于时钟的分频), 产生波特率 时钟然后进入数据指示,‘0’表示数据无效,‘1’表示数据有效;如果 有效就进入指示模块工作启示。数据长度是13位最大; 第二步在一起正常的时候就进行起始位寄存器,先判断起始位,判 断起始位周期,一般只有1到2位起始位;然后进入数据寄存器,判断 有几位数据(一般是8-10个),‘01’表示7位,‘10’表示8位,‘11’ 表示9位,‘00’表示无效,然后输出数据,7至9位并行数据输出;再 进入校验寄存器,如果是‘01’表示奇数校验,‘10’表示偶数校验,‘11’ 表示无校验,‘00’表示无效;最后到停止位寄存器,判断停止位有多 长,‘0’表示1位,‘1’表示2位。 第三步实现把并行数据转换成串行数据,将其数据进行打包,最后 把打包的数据进行输出,然后就结束。 发送模块的软件程序,主要包括以下实体部分: entity send_judge is port( clr: in std_logic; clk: in std_logic; judge_enable: in std_logic; data_input: in std_logic_vector(7 downto 0); baud_rate : in std_logic_vector(15 downto 0); data_bit : in std_logic_vector(1 downto 0); check_bit : in std_logic_vector(1 downto 0); end_bit : in std_logic; data_valid : out std_logic; data_output: out std_logic ); end entity send_judge; 其中,clr为复位信号输入,clk为50Mhz系统时钟输入,judge_enable为接收使能控制信号输入,data_input为并行输入数据。 其仿真波形图,如图4-4所示: 图4-4 发送模块仿真波形图 5 研究展望 本设计中虽然有控制键对时钟进行控制,但是用到的按键太多,在实际应用上存在不足。故提出改进方案为用一个按键控制数码管的片选,再用两个按键控制计数的加减。这样可以节省按键资源,以供更多的功能的使用。 本设计是采用硬件描述语言和FPGA芯片相结合进行的数字钟的研究,从中可以看出EDA技术的发展在一定程度上实现了硬件设计的软件化。设计的过程变的相对简单,容易修改等优点,相信随着电子技术的发展,RS-232串口通信控制器通过具体操作,验证设计的稳定性与操作的灵活性,它的功能会更加多样化,满足人们的各种需要。通过具体操作,验证设计的稳定性与操作的灵活性。 实验结论 在此次的RS-232串口通信控制器设计过程中,更进一步地熟悉有关数字电路的知识和具体应用。学会了利QuarterII软件进行原理图的绘制,硬件描述语言VHDL的编写,程序的仿真等工作。并能根据仿真结果分析设计的存在的问题和缺陷,从而进行程序的调试和完善。 在设计电路中,往往是先仿真后连接实物图,但有时候仿真和电路连接并不是完全一致的,例如在对具体模块的仿真的过程中,往往没有考虑到整体设计的层面以及与上下模块接口的设计。再加上器件对信号的延时等问题,实际下载到实验箱上后会出现一系列的问题,因此仿真图和电路连接图还是有一定区别的。 此次的数字钟设计重在于按键的控制和各个模块代码的编写,虽然能把键盘接口和各个模块的代码编写出来,并能正常显示,但对于各个模块的优化设计还有一定的缺陷和不足。总的来说,通过这次的设计实验更进一步地增强了实验的动手能力,对数字钟的工作原理也有了更加透彻的理解。在本设计调试过程中遇到了一些问题如下: 1. 在进行系统的软件设计时,在保证程序功能的前提下,尽量采用指令字节少和执行时间短的指令,以减少程序占用空间和程序执行时间。 2在设计各个程序模块时,需要对各个模块进行划分。模块的划分有很大的灵活性,但也不能随意划分,模块划分时应遵循每个模块应具有独立的功能,能产生明确的结果,这就是单模块功能的高内聚性。 3. 模块说明应包括实现模块功能所用的基本算法,模块入口算法,出口参数,模块的数据结构及调用子程序等。一半有了层次图和模块说明后,划分模块的工作也就算完成了。. 致谢 在 论文 政研论文下载论文大学下载论文大学下载关于长拳的论文浙大论文封面下载 完成之际,我首先要向指导老师姜凯老师表示最真挚的谢意。姜凯老师认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我受益匪浅。无论在理论上还是在实践中,都给与我很大的帮助。在理论上,老师耐心讲解电路原理图的绘制,以及元器件的性能;在实际操作中,从系统的设计到最终系统的调试,老师都给予了诸多帮助,使我得到不少的提高,这是在这次设计中我所得到的最宝贵的财富。对于我以后的工作和学习都是一种巨大的帮助,感谢他耐心的辅导。 在这次毕业设计中,我的专业知识水平也取得一定的进步。而这些进步都离不开老师和同学的帮助。在此我向曾经帮助和关心我的老师和同学致以诚挚的感谢。 由于本人学识有限,加之时间仓促,文中不免有错误和待改进之处,真诚欢迎各位师长、同学提出宝贵意见。 参考文献 [1] 刘君,常明,秦娟,基于硬件描述语言(VHDL)的数字时钟设计,天津理工大学学报,2007,第23卷 第4期,40-41 [2] 廖日坤,CPLD/FPGA嵌入式应用开发技术白金手册,中国电力出版社,2003,212-218。 [3] 王开军,姜宇柏,面向CPLD/FPGA的VHDL设计,机械工业出版社,2006,28-65。 [4] 赵保经,中国集成电路大全,国防工业出版社,1985。 [5] 高吉祥,电子技术基础实验与课程设计,电子工业出版社,2002。 [6] 吕思忠,数子电路实验与课程设计,哈尔滨工业大学出版社,2001。 [7] 谢自美,电子线路设计、实验、测试,华中理工大学出版社,2003。 [8] 赵志杰,集成电路应用识图方法,机械工业出版社,2003,35-40。 [9] 张庆双,电子元器件的选用与检测,机械工业出版社,2003。 [10] 谭会生,张昌凡,EDA技术及应用,西安电子科技大学出版社,2002。 [11] 李可,数字钟电路及应用[M],北京:电子工业出版社,1996。 [12]康华先,电子技术基础(数字部分)第四版[M].北京:高等教育出版社, 2000. 213-224。 [13] 集成电路手册分编委会编,中外集成电路简明速查手册,TTL、CMOS电路[M],北京:电子工业出版社,1997。 [14] 康华光,电子技术基础,高等教育出版社,2002 [15] 宋春荣,通用集成电路速查手册,山东科学技术出版社,1995。 [16] 阎石,数字电子技术基础(第四版)[M],北京:高等教育出版社,1998。 [17] Kawasaki Hiroaki,Sakurada Hiroshi,Narushima Shinichi, etal Double-faced vacuum fluorescent display [P].U S Patent:5463276,1995 附录 . 1模式选择 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; --******************************** --******************************** entity mode_sel is port( clr: in std_logic; clk: in std_logic; mode_sel: in std_logic_vector(1 downto 0); receive_enable : out std_logic; send_enable : out std_logic ); end entity mode_sel; architecture a of mode_sel is begin aa: process(clr,clk) begin if clr='0' then receive_enable <= '0'; send_enable <= '0'; elsif clk'event and clk='1' then if mode_sel = "01" then receive_enable <= '1' ; send_enable <='0' ; elsif mode_sel = "10" then receive_enable <= '0'; send_enable <= '1' ; else receive_enable <= '0'; send_enable <= '0'; end if; end if; end process aa; end a; 3接受 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; --******************************** entity rec_judge is port( clr: in std_logic; clk: in std_logic; judge_enable: in std_logic; data_input: in std_logic;--输入数据 baud_rate : in std_logic_vector(15 downto 0); --波特率:表示对于时钟的分频 data_bit : in std_logic_vector(1 downto 0); --数据位:01表示7位,10表示8位,11表示9位,00表示无效 check_bit : in std_logic_vector(1 downto 0);--校验位:01表示奇数校验,10表示偶数校验,11表示无校验,00表示无效 end_bit : in std_logic; -- 停止位:0表示1位,1表示2位 data_valid : out std_logic;--数据有效指示: 0表示数据无效,1表示数据有效 data_output: out std_logic_vector(8 downto 0)--输出数据: 7至9位并行数据输出 ); end entity rec_judge; architecture abc of rec_judge is signal s_baud_clk : std_logic; signal s_begin : std_logic; signal s_end : std_logic; signal s_full : std_logic; signal s_data_valid : std_logic; signal s_data_bit : std_logic_vector(3 downto 0); signal s_check_bit : std_logic; signal s_check_mode: std_logic; signal s_end_bit : std_logic_vector(1 downto 0); signal s_counter_a : std_logic_vector(15 downto 0);--时钟分频系数 signal s_counter_b : std_logic_vector(3 downto 0);--数据长度:最大13位 signal s_data_reg : std_logic_vector(15 downto 0);--数据寄存器 begin aaa:process(clk,clr,judge_enable)--产生波特率时钟 begin if clr='0' or s_begin='0' or judge_enable ='0' then s_baud_clk<='0'; s_counter_a<=X"0000"; elsif clk'event and clk='1' then if s_counter_a < baud_rate then s_counter_a<= s_counter_a+1; else s_counter_a<=X"0000"; s_baud_clk<= not s_baud_clk; end if; end if; end process aaa; bbb:process(clk, clr)--指示模块工作启示 begin if clr='0' or s_end='1' then s_begin<='0'; elsif clk'event and clk='1' then if data_input = '0' then s_begin<='1'; end if; end if; end process bbb; ccc:process(s_baud_clk,s_begin,clr,clk)--数据解释 begin if(s_begin='0' or clr='0') then s_counter_b <="0000"; s_full<='0'; elsif s_baud_clk'event and s_baud_clk='1' then if s_counter_b <= (s_data_bit + s_check_bit + s_end_bit) then s_data_reg(conv_integer(s_counter_b))<= data_input; -- 暂存数据 s_counter_b<= s_counter_b+1; s_full<='0'; else s_full <= '1'; end if; end if; if(s_begin='0' or clr='0') then s_data_valid <= '0'; if s_check_mode = '1' then if s_data_bit ="0111" then if s_data_reg(8) = (s_data_reg(1) xor s_data_reg(2) xor s_data_reg(3) xor s_data_reg(4) xor s_data_reg(5) xor s_data_reg(6) xor s_data_reg(7) ) then s_data_valid <= '1'; else s_data_valid <= '0'; end if; elsif s_data_bit ="1000" then if s_data_reg(9) = (s_data_reg(1) xor s_data_reg(2) xor s_data_reg(3) xor s_data_reg(4) xor s_data_reg(5) xor s_data_reg(6) xor s_data_reg(7) xor s_data_reg(8) )then s_data_valid <= '1'; else s_data_valid <= '0'; end if; elsif s_data_bit ="1001" then if s_data_reg(10) = (s_data_reg(1) xor s_data_reg(2) xor s_data_reg(3) xor s_data_reg(4) xor s_data_reg(5) xor s_data_reg(6) xor s_data_reg(7) xor s_data_reg(8) xor s_data_reg(9) )then s_data_valid <= '1'; else s_data_valid <= '0'; end if; else s_data_valid <= '0'; end if; elsif s_check_mode = '0' then if s_data_bit ="0111" then if s_data_reg(8) = (s_data_reg(1) xor s_data_reg(2) xor s_data_reg(3) xor s_data_reg(4) xor s_data_reg(5) xor s_data_reg(6) xor s_data_reg(7)) then s_data_valid <= '1'; else s_data_valid <= '0'; end if; elsif s_data_bit ="1000" then if s_data_reg(9) = (s_data_reg(1) xor s_data_reg(2) xor s_data_reg(3) xor s_data_reg(4) xor s_data_reg(5) xor s_data_reg(6) xor s_data_reg(7) xor s_data_reg(8)) then s_data_valid <= '1'; else s_data_valid <= '0'; end if; elsif s_data_bit ="1001" then if s_data_reg(10) = (s_data_reg(1) xor s_data_reg(2) xor s_data_reg(3) xor s_data_reg(4) xor s_data_reg(5) xor s_data_reg(6) xor s_data_reg(7) xor s_data_reg(8) xor s_data_reg(9)) then s_data_valid <= '1'; else s_data_valid <= '0'; end if; else s_data_valid <= '0'; end if; else s_data_valid <= '0'; end if; end if; if s_data_valid = '1' and s_full='1' then s_end <= '1' ; data_output <= s_data_reg(9 downto 1) ; else s_end <= '0'; end if; end process ccc; data_valid <= s_data_valid; ddd:process(clk,clr)--数据位数解析 begin if clr='0' then s_data_bit<="0000"; elsif clk'event and clk='1' then if data_bit = "01" then s_data_bit <= "0111"; elsif data_bit = "10" then s_data_bit <= "1000"; elsif data_bit = "11" then s_data_bit <= "1001"; elsif data_bit = "00" then s_data_bit <= "0000" ; else s_data_bit <= "0000" ; end if; end if; end process ddd; eee:process(clk,clr)--数据校验解析 begin if clr='0' then s_check_bit<='0'; s_check_mode<= '0'; elsif clk'event and clk='1' then if check_bit = "01" then s_check_bit <= '1'; s_check_mode <= '1'; elsif check_bit = "10" then s_check_bit <= '1'; s_check_mode <= '0'; elsif check_bit = "11" then s_check_bit <= '0'; elsif check_bit = "00" then s_check_bit<='0'; s_check_mode<= '0'; else s_check_bit<='0'; s_check_mode<= '0'; end if; end if; end process eee; fff:process(clk,clr)--停止位数解析 begin if clr='0' then s_end_bit<="00"; elsif clk'event and clk='1' then if end_bit = '0' then s_end_bit <= "01"; elsif end_bit = '1' then s_end_bit <= "10"; else s_end_bit <= "00" ; end if; end if; end process fff; end abc; 4发送 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; --******************************** entity send_judge is port( clr: in std_logic; clk: in std_logic; judge_enable: in std_logic; data_input: in std_logic_vector(7 downto 0);--输入数据 baud_rate : in std_logic_vector(15 downto 0); --波特率:表示对于时钟的分频 data_bit : in std_logic_vector(1 downto 0); --数据位:01表示7位,10表示8位,11表示9位,00表示无效 check_bit : in std_logic_vector(1 downto 0);--校验位:01表示奇数校验,10表示偶数校验,11表示无校验,00表示无效 end_bit : in std_logic; -- 停止位:0表示1位,1表示2位 data_valid : out std_logic;--数据有效指示: 0表示数据无效,1表示数据有效 data_output: out std_logic ); end entity send_judge; architecture abc of send_judge is signal s_baud_clk : std_logic; signal s_begin : std_logic; signal s_end : std_logic; signal s_full : std_logic; signal s_data_valid : std_logic; signal s_data_bit : std_logic_vector(3 downto 0); signal s_check_bit : std_logic; signal s_check_mode: std_logic; signal s_end_bit : std_logic_vector(1 downto 0); signal s_counter_a : std_logic_vector(15 downto 0);--时钟分频系数 signal s_counter_b : std_logic_vector(3 downto 0);--数据长度:最大13位 signal s_data_reg : std_logic_vector(15 downto 0);--数据寄存器 begin aaa:process(clk,clr,judge_enable)--产生波特率时钟 begin if clr='0' or s_begin='0' or judge_enable ='0' then s_baud_clk<='0'; s_counter_a<=X"0000"; elsif clk'event and clk='1' then if s_counter_a < baud_rate then s_counter_a<= s_counter_a+1; else s_counter_a<=X"0000"; s_baud_clk<= not s_baud_clk; end if; end if; end process aaa; bbb:process(clk, clr)--指示模块工作启示 begin if clr='0' or s_end='1' then s_begin<='0'; elsif clk'event and clk='1' then if data_input = X"00" then s_begin<='1'; end if; end if; end process bbb; ccc:process(s_baud_clk,s_begin,clr,clk)--数据解释 begin if(s_begin='0' or clr='0') then s_full<='0'; elsif s_baud_clk'event and s_baud_clk='1' then s_data_reg(7 downto 0)<= data_input; --暂存数据 s_full <= '1'; end if; if(s_begin='0' or clr='0') then s_data_valid <= '0'; if s_check_mode = '1' then if s_data_bit ="0111" then if s_data_reg(8) = (s_data_reg(1) xor s_data_reg(2) xor s_data_reg(3) xor s_data_reg(4) xor s_data_reg(5) xor s_data_reg(6) xor s_data_reg(7) ) then s_data_valid <= '1'; else s_data_valid <= '0'; end if; elsif s_data_bit ="1000" then if s_data_reg(9) = (s_data_reg(1) xor s_data_reg(2) xor s_data_reg(3) xor s_data_reg(4) xor s_data_reg(5) xor s_data_reg(6) xor s_data_reg(7) xor s_data_reg(8) )then s_data_valid <= '1'; else s_data_valid <= '0'; end if; elsif s_data_bit ="1001" then if s_data_reg(10) = (s_data_reg(1) xor s_data_reg(2) xor s_data_reg(3) xor s_data_reg(4) xor s_data_reg(5) xor s_data_reg(6) xor s_data_reg(7) xor s_data_reg(8) xor s_data_reg(9) )then s_data_valid <= '1'; else s_data_valid <= '0'; end if; else s_data_valid <= '0'; end if; elsif s_check_mode = '0' then if s_data_bit ="0111" then if s_data_reg(8) = (s_data_reg(1) xor s_data_reg(2) xor s_data_reg(3) xor s_data_reg(4) xor s_data_reg(5) xor s_data_reg(6) xor s_data_reg(7)) then s_data_valid <= '1'; else s_data_valid <= '0'; end if; elsif s_data_bit ="1000" then if s_data_reg(9) = (s_data_reg(1) xor s_data_reg(2) xor s_data_reg(3) xor s_data_reg(4) xor s_data_reg(5) xor s_data_reg(6) xor s_data_reg(7) xor s_data_reg(8)) then s_data_valid <= '1'; else s_data_valid <= '0'; end if; elsif s_data_bit ="1001" then if s_data_reg(10) = (s_data_reg(1) xor s_data_reg(2) xor s_data_reg(3) xor s_data_reg(4) xor s_data_reg(5) xor s_data_reg(6) xor s_data_reg(7) xor s_data_reg(8) xor s_data_reg(9)) then s_data_valid <= '1'; else s_data_valid <= '0'; end if; else s_data_valid <= '0'; end if; else s_data_valid <= '0'; end if; end if; if s_data_valid = '1' and s_full='1' then s_end <= '1' ; if s_baud_clk'event and s_baud_clk='1' then data_output <= s_data_reg(s_counter_b) ; s_counter_b<= s_counter_b+1; end if; else s_end <= '0'; end if; end process ccc; data_valid <= s_data_valid; ddd:process(clk,clr)--数据位数解析 begin if clr='0' then s_data_bit<="0000"; elsif clk'event and clk='1' then if data_bit = "01" then s_data_bit <= "0111"; elsif data_bit = "10" then s_data_bit <= "1000"; elsif data_bit = "11" then s_data_bit <= "1001"; elsif data_bit = "00" then s_data_bit <= "0000" ; else s_data_bit <= "0000" ; end if; end if; end process ddd; eee:process(clk,clr)--数据校验解析 begin if clr='0' then s_check_bit<='0'; s_check_mode<= '0'; elsif clk'event and clk='1' then if check_bit = "01" then s_check_bit <= '1'; s_check_mode <= '1'; elsif check_bit = "10" then s_check_bit <= '1'; s_check_mode <= '0'; elsif check_bit = "11" then s_check_bit <= '0'; elsif check_bit = "00" then s_check_bit<='0'; s_check_mode<= '0'; else s_check_bit<='0'; s_check_mode<= '0'; end if; end if; end process eee; fff:process(clk,clr)--停止位数解析 begin if clr='0' then s_end_bit<="00"; elsif clk'event and clk='1' then if end_bit = '0' then s_end_bit <= "01"; elsif end_bit = '1' then s_end_bit <= "10"; else s_end_bit <= "00" ; end if; end if; end process fff; end abc;
本文档为【基于FPGA的RS-232串口通信控制器设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_353097
暂无简介~
格式:doc
大小:197KB
软件:Word
页数:50
分类:
上传时间:2017-12-01
浏览量:52