1、摘要 通用串口是远程通信接口,在数字系统使用很普遍,是一个很重要的部件。本论文使用Verilog HDL 语言描述硬件功能,利用QuartusII 5.0在 FPGA 芯片上的综合描述,采用模块化设计方法设计UART(通用异步收发器)的各个模块。其中包括波特发生器,程序控制器,UART数据接收器和UART数据发送器,本文采用的外部时钟为48MHZ,波特率为9600。在QuartusII 5.0和Modelsim6.0环境下进行设计、编译和仿真。最后的程序编译仿真表明系统数据完全正确。关键词:VerilogHDL; UART;帧格式;FPGA;AbstractIn this paper, the
2、 use of hardware description languages Verilog VHDL function, the use of Alteras FPGA chips, the design of modular design method of UART (Universal Asynchronous Receiver Transmitter) of each module, including Porter, generators, process controllers, UART receiver data and the UART transmitter data.
3、QuartusII 5.0 and Modelsim6.0 in environment design, compilation, simulation and downloading. Finally, simulation results show that the procedures for compiling data entirely correct. Key words: VerilogHDL; UART; frame format; FPGA目录第一章 绪论1 1.1引言11.2 什么是Verilog HDL?11.3 历史21.4 主要能力21.5 模块41.6 数据流描述方
4、式5第二章片上系统SOC与FPGA的现状62.1 片上系统SOC介绍62.2 FPGA技术介绍62.3 FPGA 核心设计流程72.3.1 设计流程图72.3.2关键步骤的实现82.3.2.1 功能仿真82.3.2.2 逻辑综合92.3.2.3 前仿真92.3.2.4 布局布线102.3.2.5 后仿真(时序仿真)11第三章UART设计123.1 UART的帧格式123.2 UART模块133.2.1主要引脚功能介绍133.2.2UART主体程序143.3UART发送模块153.3.1UART的数据发送服务153.3.2UART的数据发送操作163.3.3UART的数据发送模块程序173.3.
5、4UART的数据发送模块程序仿真图203.4UART接收模块213.4.1UART数据接收服务213.4.2UART数据接收操作223.4.3UART的数据接收模块程序223.4.4UART的数据接收模块程序功能仿真图253.5UART控制器263.5.1UART控制器服务263.5.2UART控制器模块程序263.5.3UART控制器模块程序仿真图283.6UART波特发生器293.6.1UART波特发生器服务293.6.2UART波特发生器模块程序293.6.13UART波特发生器程序仿真图30结论31参考文献32致谢33附录34外文资料原文35译文43电子科技大学成都学院毕业设计论文绪论
6、1.1引言 21世纪,电子技术迅猛发展,高新技术日新月异。传统的设计方法正逐步退出历史舞台,取而代之的是基于EDA技术的芯片设计技术,它正在成为电子系统设计的主流。大规模可编程器件现场可编程门阵列FPGA(Field Programmable Gate Array)和复杂可编程逻辑器件CPLD(Complex Programmable Logic Device)是当今应用最广泛的两类可编程专用集成电路(ASIC)。其性能好、可靠性高、容量大、体积小,微功耗、速度快、使用灵活、设计周期短、开发成本低,静态可重复编程、动态在系统重构、硬件功能可以像软件一样通过编程来修改,极大地提高了电子系统设计的
7、灵活性和通用性。电子工程师和科学研究人员利用该类器件可以在办公室或实验室设计出所需要的专用集成电路,大大缩短产品的研发周期和降低成本。近年来,可编程逻辑器件的开发生产和销售规模以惊人的速度增长,且广泛地应用于航空航天、网络通信、军用雷达、仪器仪表、工业控制、医用CT、家用电器、手机和计算机等各个领域。它的广泛应用,使传统的设计方法正在进行一场巨大的变革。异步串行通信要求的传输线少,可靠性高,传输距离远,被广泛应用于微机和外设的数据交换。通常都由通用异步收发器UART(Universal AsynchronousReceiver- Transmitter)来实现该功能,如IBM PC 机中作为串
8、行接口芯片的National INS 8250。在实际应用中,往往只需要UART 的几个主要功能,专用的接口芯片会造成资源浪费和成本提高,特别是近来电子设计领域中日趋成熟的SOC 技术,由于要在单块或极少数的几块芯片中实现整个系统的功能,设计者就可以将类似UART的功能模块集成到FPGA 中。1.2 什么是Verilog HDL? Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。Verilog HDL 语言具有下
9、述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外, Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。 因此,用这种语言编写的模型能够使用Ve r i l o g仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于
10、学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。1.3 历史 Verilog HDL语言最初是于1 9 8 3年由Gateway Design Automation 公司为其模拟器产品开发的硬件建模语言。那时它只是一种专用语言。 由于他们的模拟、仿真器产品的广泛使用,Verilog HDL 作为一种便于使用且实用的语言逐渐为众多设计者所接受。在一次努力增加语言普及性的活动中, Verilog HDL语言于1 9 9 0年被推向公众领域。Open Verilog International(O V I)是促进Ve r i l o
11、g发展的国际性组织。1 9 9 2年, O V I决定致力于推广Verilog OVI标准成为I E E E标准。这一努力最后获得成功, Verilog 语言于1 9 9 5年成为I E E E标准,称为IEEE Std1 3 6 41 9 9 5。完整的标准在Ve r i l o g硬件描述语言参考手册中有详细描述。1.4 主要能力 下面列出的是Ve r i l o g硬件描述语言的主要能力: 基本逻辑门,例如a n d、o r和n a n d等都内置在语言中。 用户定义原语( U D P)创建的灵活性。用户定义的原语既可以是组合逻辑原语,也可以是时序逻辑原语。 开关级基本结构模型,例如p
12、m o s 和n m o s等也被内置在语言中。 提供显式语言结构指定设计中的端口到端口的时延及路径时延和设计的时序检查。 可采用三种不同方式或混合方式对设计建模。这些方式包括:行为描述方式使用过程化结构建模;数据流方式使用连续赋值语句方式建模;结构化方式使用门和模块实例语句描述建模。 Verilog HDL中有两类数据类型:线网数据类型和寄存器数据类型。线网类型表示构件间的物理连线,而寄存器类型表示抽象的数据存储元件。 能够描述层次设计,可使用模块实例结构描述任何层次。 设计的规模可以是任意的;语言不对设计的规模(大小)施加任何限制。 Verilog HDL不再是某些公司的专有语言而是I E
13、 E E标准。 人和机器都可阅读Verilog 语言,因此它可作为E D A的工具和设计者之间的交互语言。 Verilog HDL语言的描述能力能够通过使用编程语言接口( P L I)机制进一步扩展。P L I是允许外部函数访问Verilog 模块内信息、允许设计者与模拟器交互的例程集合。 设计能够在多个层次上加以描述,从开关级、门级、寄存器传送级( RT L)到算法级,包括进程和队列级。 能够使用内置开关级原语在开关级对设计完整建模。 同一语言可用于生成模拟激励和指定测试的验证约束条件,例如输入值的指定。 Verilog HDL 能够监控模拟验证的执行,即模拟验证执行过程中设计的值能够被监控
14、和显示。这些值也能够用于与期望值比较,在不匹配的情况下,打印报告消息。 在行为级描述中, Verilog HDL不仅能够在RT L级上进行设计描述,而且能够在体系结构级描述及其算法级行为上进行设计描述。 能够使用门和模块实例化语句在结构级进行结构描述。建模能力,即在一个设计中每个模块均可以在不同设计层次上建模。 Verilog HDL 还具有内置逻辑函数,例如&(按位与)和|(按位或)。 对高级编程语言结构,例如条件语句、情况语句和循环语句,语言中都可以使用。 可以显式地对并发和定时进行建模。 提供强有力的文件读写能力。 语言在特定情况下是非确定性的,即在不同的模拟器上模型可以产生不同的结果;
15、例如,事件队列上的事件顺序在标准中没有定义。1.5模块模块是Verilog 的基本描述单位,用于描述某个设计的功能或结构及其与其他模块通信的外部端口。一个设计的结构可使用开关级原语、门级原语和用户定义的原语方式描述; 设计的数据流行为使用连续赋值语句进行描述; 时序行为使用过程结构描述。一个模块可以在另一个模块中使用。一个模块的基本语法如下:Module modulename(portlist);Declarations;reg, wire, parameter,input, output, inout,function, task, . . .Statements:Initial state
16、mentAlways statementModule instantiationGate instantiationUDP instantiationContinuous assignmentendmodule说明部分用于定义不同的项,例如模块描述中使用的寄存器和参数。语句定义设计的功能和结构。说明部分和语句可以散布在模块中的任何地方;但是变量、寄存器、线网和参数等的说明部分必须在使用前出现。为了使模块描述清晰和具有良好的可读性, 最好将所有的说明部分放在语句前。本书中的所有实例都遵守这一规范。图1- 2为建模一个半加器电路的模块的简单实例。Module halfadder(A,B,Sum,C
17、arry);Input: A, B;Output: Sum, Carry;assign #2 Sum = A B;assign #5 Carry = A & B;endmodule图1-2半加法器模块的名字是halfadder。模块有4个端口: 两个输入端口A和B,两个输出端口S u m和C a rry。由于没有定义端口的位数, 所有端口大小都为1位;同时, 由于没有各端口的数据类型说明, 这四个端口都是线网数据类型。模块包含两条描述半加器数据流行为的连续赋值语句。从这种意义上讲,这些语句在模块中出现的顺序无关紧要,这些语句是并发的。每条语句的执行顺序依赖于发生在变量A和B上的事件。在模块中,
18、可用下述方式描述一个设计:1) 数据流方式;2) 行为方式;3) 结构方式;4) 上述描述方式的混合。1.6 数据流描述方式用数据流描述方式对一个设计建模的最基本的机制就是使用连续赋值语句。在连续赋值语句中,某个值被指派给线网变量。连续赋值语句的语法为:a s s i g n d e l a y L H S n e t = RHS_ expression;右边表达式使用的操作数无论何时发生变化, 右边表达式都重新计算, 并且在指定的时延后变化值被赋予左边表达式的线网变量。时延定义了右边表达式操作数变化与赋值给左边表达式之间的持续时间。如果没有定义时延值, 缺省时延为0。1.6 行为描述方式设计
19、的行为功能使用下述过程语句结构描述:1)initial语句:此语句只执行一次。2) always语句:此语句总是循环执行, 或者说此语句重复执行。只有寄存器类型数据能够在这两种语句中被赋值。寄存器类型数据在被赋新值前保持原有值不变。所有的初始化语句和a l w a y s语句在0时刻并发执行。电子科技大学成都学院毕业设计论文第二章片上系统SOC与FPGA的现状2.1 片上系统SOC介绍 SOC(systemonChip)称为片上系统。它最早产生于20世纪90年代中期,是一种将一个完整系统所有不同的功能块一次直接集成于一颗硅片上的技术。根据这种技术所制造出的芯片,就叫做片上系统,也称为系统级芯片
20、。SOC由可设计复用的IP核组成,采用超深亚微米工艺技术制造。这种结构使得在芯片设计过程中,能做到各种资源的最优化利用,使设计周期缩短,资源利用率最高。在一般设计过程中,设计人员要做的只是前端设计,如系统结构设计、硬件编程、功能仿真、时序仿真,然后向芯片制造商提供生成的网表。芯片制造商则负责芯片的物理设计、封装、测试等工作。但是随着系统集成度的不断提高以及终端用户需求的多样化,系统功能愈来愈复杂,如何确定系统结构并完成软硬件的划分,传统的系统设计方法己经不能很好满足设计的需求。为了提高芯片的设计效率,缩短设计周期,系统设计需要新的设计理论体系和设计方法,以克服传统设计方法中前端设计和后端设计相
21、互分离的弊病 。SOC技术从诞生到目前被广泛采用,也正是基于这一背景。本文设计工作采用的FPGA技术,就是目前流行的一种SOC。2.2 FPGA技术介绍FPGA(Field Programmable Gate Array)称为现场可编程门阵列,是在CPLD的基础上发展起来的新型高性能可编程逻辑器件,它一般采用SRAM工艺,也有一些专用器件采用Flash工艺或反熔丝(Anti一Fuse)工艺等。FPGA的集成度很高,其器件密度从数万系统门到数千万系统门不等,可以完成极其复杂的组合与时序逻辑电路功能,适用于高速、高密度的高端数字逻辑电路设计领域。使用FPGA技术设计各种大规模或超大规模的组合、时序
22、逻辑电路,不仅可以使设计者避免直接与若干复杂烦琐的电路元器件的选择布线直接接触,而且开发设计过程中采用的类似于软件开发的模块化设计方法还更加便于多人合作设计开发,这就极大地提高了产品规划设计的效率。因此,FPGA技术己经成为目前国际上通 行的硬件芯片产品设计开发的主流。 现在通用的FPGA芯片都含有大容量的ROM和RAM单元、可编程逻辑单元、丰富的布线资源等基本组成部分,这些资源已经完全可以满足目前绝大多数设计开发的需要。随着工艺技术的发展与市场需要,超大规模、高速、低功耗的新型FPGA不断推陈出新。一些高级的FPGA智能芯片甚至包含了中央处理器(CPU)和内嵌专用硬核。FPGA的主要器件供应
23、商有Xilinx、Altera、Lattice、Actel和Atmel等,本文工作所用的FPGA开发板和芯片就是由Altera公司提供的。2.3 FPGA 核心设计流程(1)设计定义(2)HDL实现逻辑仿真器(3)功能仿真逻辑综合器(4)逻辑综合逻辑仿真器(5)前仿真FPGA厂家工具(6)布局布线(8)静态时序分析逻辑仿真器(7)后仿真(9)在系统测试 2.3.1 设计流程图图2-1FPGA设计流程图说明:逻辑仿真器主要指modelsim,Verilog-XL。逻辑综合器主要指LeonardoSpectrum、Synplify、FPGA Express/FPGA Compiler等。FPGA厂
24、家工具指的是如Altera的Max+PlusII、QuartusII,Xilinx的Foundation、Alliance、ISE4.1等。2.3.2关键步骤的实现 2.3.2.1 功能仿真 RTL代码调用模块的行为仿真模型测试程序(test bench)测试数据逻辑仿真器图2-2FPGA设计流程之功能仿真说明:“调用模块的行为仿真模型”指的是RTL代码中引用的由厂家提供的宏模块/IP,如Altera 提供的LPM库中的乘法器、存储器等部件的行为模型。 2.3.2.2 逻辑综合设置综合目标和约束条件调用模块的黑盒子接口RTL代码逻辑综合器HDL网表(netlist)EDIF网表(netlist
25、) 图2-3FPGA设计流程之逻辑综合说明:“调用模块的黑盒子接口”的导入,是由于RTL代码调用了一些外部模块,而这些外部模块不能被综合或无需综合,但逻辑综合器需要其接口的定义来检查逻辑并保留这些模块的接口。2.3.2.3 前仿真如图2-4FPGA设计流程之前仿真逻辑综合器调用模块的行为仿真模型测试数据测试程序(test bench)HDL网表(netlist)逻辑仿真器说明:一般来说,对FPGA设计这一步可以跳过不做,但可用于debug综合有无问题。2.3.2.4 布局布线 逻辑综合器设置布局布线约束条件EDIF网表(netlist)调用模块的综合模型FPGA厂家工具SDF文件(标准延时格式
26、)HDL网表(netlist)下载/编程文件图2-5FPGA设计流程之布局布线2.3.2.5 后仿真(时序仿真) 测试数据SDF文件(标准延时格式)FPGA基本单元仿真模型测试程序(test bench)FPGA厂家工具HDL网表(netlist)逻辑仿真器 图2-6FPGA设计流程之后仿真 随着微机系统的广泛运用和微机网络的极大发展,UART(Universal Asynchronous Receive Transmitter)在数据通信及控制系统中得到了广泛运用。8250,NS 16450等芯片都是常见的UART器件,这类芯片己经相当复杂,有的含有许多辅助模块(如FIFO),但在实际中有时
27、只需要使用UART的部分功能,因而会造成一定的资源浪费。 FPGA在现代电子设计中的广泛运用,使我们可以充分利用其资源,在芯片上集成UART的功能模块,这样就无需外接专用UART芯片,从而简化了电路,缩小了体积,设计的灵活性更大。电子科技大学成都学院毕业设计论文第三章UART设计3.1 UART的帧格式 在 UART 中,数据位是以字符为传送单位,数据的前、后要有起始位、停止位,另外可以在停止位的前面加上一个比特(bit)的校验位。其帧格式如图所示。数据位 起始位D0 D1 D2 D3 D7 校验位 停止位以9600波特率接收或发送,每一位时间为1/9600秒,或48MHZ晶振5000次计数图
28、3_1数据帧格式 文章 通 过 分析UART的功能,利用有限状态机来描述UART核心控制逻辑的方法,将其核心功能集成,从而使整个设计更加稳定、可靠。基本的UART通信只需要两条信号线就可以完成数据的相互通信。UART的功能模块如图3_2所示。波特发生器Uart控制器接收模块发送模块对象模块图3_2UART的功能模块图3.2 UART模块在大规模电路的设计中,广泛采用层次化,结构化的设计方法。它将一个完整的硬件设计任务从系统级开始,划分为若干个可操作的模块,编制出相应的模型并进行仿真验证,最后在系统级上进行组合。这样在提高设计效率的同时又提高了设计质量,是目前复杂数字系统实现的主要手段,也是本文
29、设计思想的基础。其系统模块可划分为4个部分,如波特发生器,控制器,接收器,发送器,如图3-3所示:readsendclear_checkreadsend Clr3 clr4ks csData_inData_outclearRead_enablesend_enablecounterscountersresetCounters(control)stateT1clk_enableClk_clearClk(波特发生器)clk图3-3uart结构图3.2.1主要引脚功能介绍 Read:串行输入send:串行输出 Data_in:并行输入data_out:并行输出 Cs:通知cpu接收数据位ks:通知cp
30、u发送准备位 Reset:重启输入state:uart状态输入 Clk:48M时钟输入3.2.2UART主体程序module uart(read,send,cs,ks,reset,state,clk,dat_in,dat_out);input read,clk,reset,state;/read为串行输入,clk为时钟输入48MHZ,reset为重启键input7:0 dat_in;/并行数据输入output send,cs,ks;/send为串行输出,cs为通知cpu接收数据位,ks为发送准备位output7:0 dat_out;/并行数据输出wire clear,clk_enable,re
31、ad_enable,clear3,send_enable,clear4,t1;wire7:0 counters,dat_in;read u1 (dat_out,cs,read,reset,clk_enable,clk,read_enable,clear3,counters);/接收数据modulesend u2 (dat_in,ks,send,reset,clk_enable,clk,send_enable,clear4,counters);/发送数据moduleclk u3 (clk,t1,clk_enable); /时钟计数器模块counters u4(read_enable,send_e
32、nable,clk,state,t1,read,counters,reset,clear);check u5 (state,clear3,clear4,clear,clk_enable3,clk_enable4,clk_enable);endmodule/module read(dat_out,cs,read,reset,clk_enable3,clk,read_enable,clear3,counters);/接收数据moduleinput read_enable;input read,reset,clk;/read为串行输入,read_control为时钟控制,reset为重启键input
33、7:0 counters;output cs,clear3,clk_enable3;/cs为通知cpu读取数据位output7:0 dat_out;endmodule/module send(dat_in,ks,send,reset,clk_enable4,clk,send_enable,clear4,counters);/发送数据moduleinput7:0 dat_in,counters;input reset,clk,send_enable;output send,clk_enable4,clear4,ks;/ks为通知cpu发送准备位endmodule/module counters(
34、read_enable,send_enable,clk,state,t1,read,counters,reset,clear);/控制器moduleinput clk,state,t1,read,reset,clear;/state为uart状态输入,/clear为程序计数寄存器清零控制位output7:0 counters;output read_enable,send_enable;endmodule/module clk(clk,t1,clk_enable);/时钟计数器模块input clk,clk_enable;output t1;endmodule/module check(sta
35、te,clear3,clear4,clear,clk_enable3,clk_enable4,clk_enable);/clear选择模块input state,clear3,clear4,clk_enable3,clk_enable4;output clear,clk_enable;assign clear=state?clear4:clear3;assign clk_enable=state?clk_enable4:clk_enable3;endmodule/3.3UART发送模块3.3.1UART的数据发送服务 发送器实现的功能是将输入的8位并行数据变为串行数据,同时在数据头部加起始位,
36、在数据位尾部加奇偶校验位和停止位。数据发送服务如表3.1计数器 0 18 9 10操作发送低电平发送数据和奇偶校验发送奇偶校验结果发送高电平表3.1数据发送其基 本 特 点是: 在 信 号线上共有两种状态,可分别用逻辑1和逻辑。来区分。在发送器空闲时,数据线应该保持在逻辑高电平状态。发送 起 始 位:该位是一个逻辑0,总是加在每一帧的头部,提示接受器数据传输即将开始,在接收数据位过程中又被分离出去,占据一个数据位的时间。发送 数 据 位:在起始位之后就是数据位,一般为8位一个字节的数据,低位在前,高位在后。如字母C在ASCII表中是十进制67,二进制01000011,那么传输的将是110000
37、100。并在数据发送过程当中,进行数据位奇偶校验。 发送校 验 位:该位一般用来判断接收的数据位有无错误,常用的校验方法是奇偶校验法。将3过程当中奇偶校验的结果输入到数据线,并占一个数据位时钟。 停止位 :停止位总在每一帧的末尾,为逻辑1,用于标志一个字符传送的结束,占据一个数据位的时间。 帧:从起始位到停止位之间的一组数据称为一帧。3.3.2UART的数据发送操作如图3-4拉低电平空闲检测Cpu发送位检测 自检测接cpu传入数据拉高电平发送等待数据发送和奇偶校验奇偶结果发送图3-4数据发送操作解释:采用9600波特率发送从cpu传入数据:是指将data_in端口的数据存入寄存器中Cpu发送为
38、检测:是指将ks寄存器置位,即数据发送完毕3.3.3UART的数据发送模块程序module send(dat_in,send,reset,clk_enable4,clk,send_enable,clear4,counters);/发送数据moduleinput7:0 dat_in,counters;input reset,clk,send_enable;output send,clk_enable4,clear4;wire clear;wire7:0 dat_s;reg send,parity_result;reg clk_enable,clear1,clear4;reg7:0 date_s;
39、/always(posedge clk)beginif(send_enable & !reset)/当send_enable为高电平时为发送操作状态beginclk_enable4=1;clear4=clear1;endelsebeginclear4=1;endend/always(posedge clk)if(send_enable & !reset)beginif(counters=8b00000001)/0beginsend=0;date_s=dat_in;parity_result=1;endelse if(counters=8b00010000)/1beginsend=date_s0
40、;parity_result=parity_result + date_s0;endelse if(counters=8b00100000)/2beginsend=date_s1;parity_result=parity_result + date_s0;endelse if(counters=8b00110000)/3beginsend=date_s2;parity_result=parity_result + date_s0;endelse if(counters=8b01000000)/4beginsend=date_s3;parity_result=parity_result + date_s0;endelse if(counters=8b01010000)/5beginsend=date_s4;parity_result=parity_result + date_s0;endelse if(counters=8b01100000)/6beginsend=date_s5;parity_result=