IC课程设计报告

更新时间:2024-07-12 04:17:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

华中科技大学IC课程设计报告

题目:自适应波特率的UART设计

院系:控制科学与工程系

专业班:自动化0902班 姓名:

组 员: 学 号: 指导教师: 2012 年 1 月

1

华中科技大学IC课程设计报告

摘 要

通用异步接收发送器具有可编程性和高度兼容性, 在嵌入式系统设计中得到了广泛的应用。本文介绍了一种利用Verilog HDL语言设计UART 核心功能的方法, 具体描述了发送、接收以及波特率发生器模块的设计, 最后给出了该核心模块的整体功能仿真和综合结果。结果表明该UART 功能正确、稳定、可靠, 可以很好地应用于异步通讯中。

关键词: UART 异步通信Verilog HDL

I

华中科技大学IC课程设计报告 Abstract

Universal asynchronous receiver and transmitter are widely used in embedded system for itsprogrammable and high compatibility. A design of UART core with Verilog HDL was presented. The designsoftransmitter , receiver andbaudrategenerator modules were particularly described, andthe simulations were provided. The result of the simulations and synthesis shows that the UART is valid andreliable , and can be widely used in asynchronous communication.

Key Words: UART Verilog HDLAsynchronous communication

II

华中科技大学IC课程设计报告 目录

摘要 ................................................................ I Abstract ............................................................ II 1

绪论 ............................................................ 1

1.1

本设计的意义和背景 ..................................................................................................... 1

2 UART简介 ...................................................... 1

2.1 2.2 2.3

UART基本结构 ............................................................................................................. 1 UART帧格式 ................................................................................................................. 2 UART基本工作原理 ..................................................................................................... 2

3 UART系统设计方案 ............................................... 3

3.1 3.2

设计要求 ......................................................................................................................... 3 模块设计 ......................................................................................................................... 3

分频模块 ................................................................................................................. 3 接收模块 ................................................................................................................. 4 发送模块 ................................................................................................................. 5

3.2.1 3.2.2 3.2.3

4 本人所做工作 ..................................................... 5

4.1 4.2 4.3 4.4 4.5

发送模块的要求 ............................................................................................................. 5 模块设计过程 ................................................................................................................. 6 生成基本电路 ................................................................................................................. 9 仿真结果 ......................................................................................................................... 9 结果分析 ....................................................................................................................... 10

5 整体电路仿真分析 ................................................ 10

5.1 5.2

整体仿真结果 ............................................................................................................... 10 结论和讨论 ................................................................................................................... 11

结论 ....................................................................................................................... 11 讨论 ....................................................................................................................... 11

5.2.1 5.2.2

6 7 8

致谢 ........................................................... 12 心得体会 ........................................................ 13 参考文献 ........................................................ 14

III

华中科技大学IC课程设计报告 9 附录 ........................................................... 15

IV

华中科技大学IC课程设计报告

1 绪论

1.1 本设计的意义和背景

随着半导体技术的发展, 专用集成电路的复杂度越来越高, 集成电路已经进入片上系统(SOC)时代。SOC 的出现将整个电子系统的功能集成到单一芯片中, 芯片规模和复杂度都有不同层次的增加。为了避免重复劳动, 需要把一些常用的功能模块设计成可修改参数的模块, 让其他用户可以直接调用这些模块, 即IP。IP 核的复用技术很大程度上提高了SOC 的设计效率, 缩短SOC 产品开发周期, 降低成本[1 ]。

通用异步接收发送器( UART universalasynchronous receiver and

transmitter) 主要用于控制设备之间的串行通信, 广泛应用于SOC 设计中。UART性能的优劣将直接影响相应电子系统的性能和指标。但由于专用的UART 芯片引脚多, 接口复杂,不便应用于嵌入式设计中。基于以上考虑, 本文探讨了利用Verilog HDL 设计紧凑、可修改配置的UART软核的方法[2 ]。

2 UART简介

2.1 UART基本结构

UART主要由数据总线接口、控制逻辑、波特率发生器、发送部分和接收部分等组成。功能包括微处理器接口, 发送缓冲器( THR) 、发送移位寄存器( TSR) 、帧产生、奇偶校验、并转串电路、数据接收缓冲器( RBR) 、接收移位寄存器( RSR) 、帧产生、奇偶校验、串转并电路等。UART电路的典型应用结构框图如图1所示。

图1UART电路典型应用框图

1

华中科技大学IC课程设计报告 2.2 UART帧格式 UART帧格式如图2所示。

图2 UART帧格式框图

UART帧格式中包括收发空闲状态(idle), 起始位(startbit),数据位(5~8bit,可选), 奇偶校验位(parity), 停止位(stopbit, 位数可为1、1.5、2位)。UART内部的配置寄存器可以配置数据位数( 5~8 bit) 、是否有校验位和校验的类型、停止位的位数( 1, 1.5, 2) 等设置。 2.3 UART基本工作原理

UART主要用来实现串行和并行数据流间的变换, 主要功能是: 从CPU 接收并行数据转换成串行数据输出; 或者是从串口读入外部数据, 将其转换为并行数据, 送往CPU。所谓异步收发, 是因为在UART 协议中, 接收、发送不使用统一参考时钟。收发双方取得同步的方法是采用固定的串行数据格式, 即在数据格式设置中分别加上起始位和停止位, 来标志一个数据帧的开始和结束[3-4 ]。其串行数据格式如上图所示, 包括1 位起始位, 5~8 位数据位, 1 位奇偶校验位(可选) , 1/ 115/ 2 位停止位。UART 的功能系统可划分为六个模块, 分别为: 波特率发生器、接口模块、发送模块、接收模块,本设计着重于UART 的核心模块设计, 包括波特率发生器、接收器和发送器。数据传输机理为: 没有数据传输时, 串行传输线维持高电位状态。一旦发现串行线由高变低, 接收器就认为是个起始位, 启动内部电路对数据流进行采样(16 倍的波特率) , 如果续八次采样都是低电平, 则认为是个正确的起始位(第八次采样时, 正好位于起始位中心) , 开始接收数据位。这样每隔一个波特率时钟, 就在数据的中心采样一次, 低位在前, 高位在后。数据位之后是奇偶校验位, 用来判断接收的数据位有无错误, 可以选择是奇校验、偶校验或无校验位。最后是停止位, 一般为高电平, 表示一帧的结束[5 ]。

2

华中科技大学IC课程设计报告 3 UART系统设计方案

3.1 设计要求

1. 阅读相关资料,了解UART的工作原理及传输时序。

2. 系统时钟为50MHz,自己设定波特率,并根据设定的波特率计算出分频系数,

设计相应的分频模块。

3. 用verilog实现UART的3个模块的设计:分频模块、发送模块、接收模块,

并用Modelsim软件进行功能仿真。

3.2 模块设计

根据设计要求,要实现UART最基本的功能需要分3个模块来进行设计,即发送模块、接收模块和分频模块,以下分别简单介绍3个模块的设计方法和功能分析。图3是整个系统的框架图。

图3 系统整体框图 3.2.1 分频模块

分频功能主要由16 位二进制除数锁存器和16 位计数器完成。除数锁存器包括8 位二进制除数高字节锁存器(MSB) 和除数低字节锁存器(LSB) , 在地址选择信号作用下, 依次写入计数器中。计数器每次计数至除数的一半时, 分频输出信号为

3

华中科技大学IC课程设计报告 高电平, 计数溢出后变为低电平。通过除数的设置, 可以对系统时钟进行任意数(最大为216 - 1)分频, 其中, 除数= 系统时钟/ (16 倍波特率) 。取系统时钟为50MHz, 假设数据的波特率为p,则所需时钟的频率为16*p。以波特率p 为115200 为例,系统时钟为50MHz,则分频系数为50000000/(16*115200) = 27.127,取整为27,采用普通分频方法就可以达到目标。 3.2.2 接收模块

串行数据接收模块主要由移位寄存器、位计数器、16 分频电路、起始位检测电路。移位寄存器实现数据的并2串转换,位计数器用来记录已经接收的数据位的数目,起始位检测电路检测正确的起始位, 滤除噪声信号。16 分频电路用来产生数据接收的时钟信号(波特率频率) , 其与发送时钟之间的同步由内部时钟使能信号EN CLK控制。有空闲、起始位确认、移位、数据校验、无效等5 个状态。状态机处于空闲态时, 不断监视串行输入线RXD。如果RXD 出现由高到低的电平变化, 就认为是一个起始位的开始,立刻启动16 分频电路, 并转入起始位确认态。在起始位确认态时, 在RXD 出现低电平的同时, 启动起始位检测电路, 以16 倍的波特率频率对输入信道采样, 连续采样8 次(正好是半个波特率时钟周期) , 其间RXD 如果出现高电平, 则认为是噪声干扰, 关闭分频电路, 转入空闲态。如果连续8 次采样都是低电平, 则认为是个正确的起始位, 转入移位态。在移位态, 对串口输入数据按照一个比特时间(波特率时钟周期) 采样一次, 每次采样均位于数据位的中心, 通过ENOCLK达到同步。同时启动位计数器, 用来控制数据接收的位数。先是数据的低位后是高位。数据位接收完后, 转入数据校验态。在此状态对奇偶校验位、停止位进行检验, 若有误, 则发送错误报告。与此同时, 进行无效状态检测, 若有误, 则该次数据无效(数据位、校验位和停止位均为“0”) , 并发起中断, 状态机转入无效态, 直到串行线出现高电平, 才回到空闲态, 等待下一次的接收任务。否则, 将RSR 中的数据组装成一个字节, 并行移入接收FIFO 中, 并令DATARDY为“1”, 通知CPU 准备接收数据[6 ]。图4是接收模块框图。

图4 接收模块框图

4

华中科技大学IC课程设计报告 3.2.3 发送模块

UART发送器模块将8 位并行数据串行发出, 用wr 写信号装载并行进来的8 位数据到9 位移位寄存器(shift_reg)的低8 位, 最高位置为0, 表示数据的起始位, 数据发送完后发送1。数据发送前先发送1 表示等待数据的到来。等待16 个

clk16x 之后, 先发送一个1, 再过16 个clk16x 之后, 发送起始位0; 以后每过16 个clk16x, 发送一位数据, 直到数据发送完。16个clk16x 用计数器设计, 数据发送用状态机实现。为了避免时序问题以及保证可测试性, 采用单时钟沿同步触发, 在15 个clk16x 到来时, 将clk1x 置1, 在下一个clk16x 时钟的上升沿到来后发送一位数据, 由于clk1x 为高电平持续时间为一个clk16时钟周期, 也就是在clk1x 的下降沿把一位数据发送出去。图5为接收模块的框图

图5 接收模块框图

4 本人所做工作

我在整个工程设计中负责发送模块的设计,Modelsim软件使用资料的查找,对Tesetbench语法结构进行分析、研究。 4.1 发送模块的要求

1、具有空闲、起始、移位、奇偶校验、停止等5 个状态,状态机在空闲态的时候, 不

5

华中科技大学IC课程设计报告 断检测发送FIFO 状态标志位“EMPTY”, 如果为低电平(有数据待发送) , 状态机立刻转入起始态, 发送起始位。

2、自动转入移位态, 发送数据位, 直到8 位数据发送完毕后, 转入奇偶校验态, 发送校验位。最后在停止态, 发送停止位。当一帧数据发送完毕后, UART回到空闲态, 并等待下一个数据帧的开始。 4.2 模块设计过程

我在发送模块中使用的变量有data_in,clk,reset,idle(输入变量),data_out,data_tran,data_tran1(输出变量)。Clk为分频后的时钟频率;reset将UART重置,一般是将数据发送完毕后重置;idle线路繁忙判断标志位,为1表示繁忙,为0表示空闲。Data_out数据输出,将并行数据一个个转化成串行数据;data_tran为工作标志位,串行数据输出完毕为0,工作时为1;data_tran1表示并串转化标志位,转化时为0,转化完为1。

下面是我所做模块的完整代码: `timescale 1 ps/1 ps

module send(datain,clk,reset,idle,data_out,data_tran,data_tran1); input [7:0]datain; //数据输入端,待发送的8位数据

input clk,reset,idle; //reset重置UART,idle=1禁止输入,为0允许输入 output data_out; //串行数据输出 output data_tran; output data_tran1;

reg data_tran; //工作标志位,串行数据输出完毕为0,工作时为1

reg data_tran1; //并串转化标志位,转化时为0,转化完为1 reg data_out;

reg [7:0]data_save; //存储从datain送来的并行数据

reg [7:0]data_btoc; //开始并串转化时把数据从data_tran送到data_tran1,在data_tran1中转换成串行

reg parity; //奇偶校验位,接收端检错

reg [3:0]clk_div; //每个系统时钟上升沿计数,挤满给clk1附一个值 reg clk1_en; //clk1的使能信号

wire clk1; /*周期为16个系统周期,上升沿时cnt累加, 下降沿系统根据cnt的值做并串转换*/

reg [3:0]cnt; //clk1上升沿累加

reg sign1,sign2; //记录输入端wire变化 always@(posedge clk or posedge reset) begin

if(reset) begin

sign1<=1'b1; sign2<=1'b1;

6

华中科技大学IC课程设计报告 end else begin

sign1<=idle; sign2<=sign1; end end

always@(posedge clk or posedge reset) begin

if(reset) begin

data_tran<=1'b0; clk1_en<=1'b0; end

/*idle从1(禁止datain输入数据)变为0(允许datain输入数据), 在从1到0的下降沿并行数据从datain输入并存储在 内部寄存器data_save内,此时有sign1=0且sign2=1*/ else if(!sign1&&sign2) begin

data_tran<=1'b1; clk1_en<=1'b1; end

else if(cnt==4'b0010) //即将开始转化 data_tran<=1'b1;

else if(cnt==4'b1101) //转化和输出都完成 begin

data_tran<=1'b0; clk1_en<=1'b0; end end

always@(negedge idle or posedge reset) begin

if(reset)

data_save=8'b0; else

data_save=datain; ////下降沿存入输入数据 end

always@(posedge clk or posedge reset) begin

if(reset)

clk_div=4'b0; else if(clk1_en)

clk_div=clk_div+1; end

7

华中科技大学IC课程设计报告 assign clk1=clk_div[3]; ////周期为16个时钟周期 always@(negedge clk1 or posedge reset) if(reset) begin

data_out<=1'b1; data_tran1<=1'b1; parity<=1'b1; data_btoc<=8'b0; end

else ////clk1下降沿做并串转换和输出(clk1的上升沿 cnt累加)

begin

if(cnt==4'b0001) begin

data_btoc<=data_save;

data_tran1<=1'b0; //为0表示开始转换 end

else if(cnt==4'b0010) begin

data_out<=1'b0; //用0表示串行的开头 end

else if((cnt>=4'b0011)&&(cnt<=4'b1010)) begin //做并串转换

data_btoc[7:1]<=data_btoc[6:0]; //移位 data_btoc[0]<=1'b0; //低位填0

data_out<=data_btoc[7]; //最高位输出

parity<=parity^data_btoc[7]; //计算奇偶效验位 end

else if(cnt==4'b1011)

data_out<=parity; //输出奇偶校验位 else if(cnt==4'b1100) begin

data_out<=1'b1; //最后输出1作为串行的最后一位 data_tran1<=1'b1; end end

always@(posedge clk1 or posedge reset or negedge clk1_en) if(reset)

cnt=4'b0000; else if(!clk1_en) cnt=4'b0000; else

cnt=cnt+1; endmodule

8

华中科技大学IC课程设计报告 上面是发送端运行时的基本过程。 4.3 生成基本电路

4.4 仿真结果 如图6所示。

9

华中科技大学IC课程设计报告 图6 发送模块仿真波形

4.5 结果分析

从上述波形可以看出,输入数据为01010101。首先初始化输入数据,reset置1,idle置1,clk一直翻转,奇偶校验位初始置1,。在数据开始传递时,idle由0变到1,reset置为0,由于数据一直在传送,故data_tran一直为1,直到所有数据传送完毕,起始位为0,所以data_out先输出0,然后是8位数,分别为0,1,0,1,0,1,0,1;然后奇偶校验位,奇偶校验位初始为1,与传输的数据分别进行异或操作,首先1和0异或为1,再和8位数据的初始位0进行异或操作得到1,一直继续下去,直到8位数据的最后一位,奇偶校验位的值分别为1,1,0,0,1,1,0,0,1;结束位为1,当所有数据传输完毕后,data_tran变为0,标志数据传送完了。然后reset也置为高电平,idle也变为1,即禁止传输数据。当有新的数据要进行传输时,所有数据重置,即重复上述过程。

5 整体电路仿真分析

5.1

整体仿真结果

10

华中科技大学IC课程设计报告 图7 整体仿真波形

5.2 结论和讨论 5.2.1 结论

通过以上波形,我们可以很清楚看出并行数据依次变为串行数据和并行数据,说明数据可以完成从串口到并口的传递,并且在传递的过程中奇偶校验位是可以可以起作用的。对于任意波特率,该UART均可以实现,其功能简单,但是很实用,可以用在所有要求不是很

高的数据接口中。通过波特发生器、发送器和接收器模块的设计与仿真, 能够较容易地实现通用异步收发器设计, 对于收发的数据帧和发生的波特率时钟频率能较灵活地改变, 而且硬件实现不需要很多资源, 尤其能较灵活地嵌入到FPGA/CPLD的开发中。在EDA技术平台上进行设计、仿真与实现具有较好的优越性。 5.2.2 讨论

毛刺问题解决

毛刺的解决在通常的UART 设计中存在组合逻辑, 当输入的信号由高电平变低电平而其它某个信号由低电平变高电平时, 由于在信号变化的瞬间, 组合逻辑的输出并非同时变化, 而是有先后之分, 将导致输出出现尖脉冲, 即产生毛刺。本设计采用时钟沿(上升沿)触发, 即将组合逻辑输出端通过加到寄存器后输出, 从而避免毛刺的产生[7 ]。

多时钟与亚稳态的解决

在通常的UART 设计中, 由于CPU 时钟与UART 的数据接收、发送时钟是处在不同的时钟域, 时钟频率和相位上存在差异, 导致时序不能满足建立时间和保持时间的要求, 即数据的输出处于不确定状态, 从而出现时序违反(slack<0)和亚稳态。本设计通过采用同步电路设计, 有效地解决时序和亚稳态的问题。

11

华中科技大学IC课程设计报告 6 致谢

感谢在此次课程设计过程中对我悉心指导的刘政林老师和周昭柳助教,以及与我一起愉快合作的同学林少龙和聂高宁。

12

华中科技大学IC课程设计报告 7 心得体会

该课程设计前后历时10个周,虽然耗费了我大量的课外时间,但是从中学到的东西却是不可估量。

一、去除恶习,提升学习能力

自己养成了独立解决问题的习惯,以前总是碰到问题就问寝室的同学,自己从来不思考问题,有时甚至连问题都懒得看。而且之前做类似设计时,都是依靠同组同学,自己很少动手,现在我明白了其实是自己吃亏了,自己以前不紧养成懒惰的习惯,还没学到知识,而且花费了和别人一样多的时间。

二、了解了硬件编程

在做这次课程设计中,我学习到了很多硬件设计方面的知识,课程设计分为:课题分析---Verilog HDL编程---调试程序---仿真波形---综合生成器件。程序的编写应严谨,算法上要做到简单明了,高效。

三、提到自己动手、动脑能力

学会了如何去开始一个课程设计。对于一个课程设计,刚开始时大家不可能上来就知道如何开始,每个人都需要查阅大量相关资料,明白课程设计的目的,所牵扯到的知识,所要使用的软件,语言。我一开始根本不知道UART是什么东西,之前也从来没有听过,所以开始就是一头雾水,上网搜了很多资料,才知道它是一个并口、串口数据转换器,外加一个波特率发生器,然后就开始对它进行功能模块分析,分成了发送和接收两个模块。然后我们组就开始了分工,我做了发送模块,就这样一直下来功能上慢慢得到完善。回过头来看时,UART也就如此,并没有当初那么吓人。

四、加深对课程的了解

我熟练掌握了Modelsim软件的使用,对Verilog HDL语言也更加了解,整个verilog HDL编写过程都是按照C语言要求的结构化,模块化,加上注释的详细清晰,所以也使我们的程序可读行强。

五、培养了团队合作意识

像这种课程设计,由于要自学verilog HDL,以及Modelsim,LeonardoSpectrum

的使用,对初学者来说是个很大的工程,所以我们坚持团队合作,分工明确,有多种方案共同研究拍板,有了问题大家共同探讨,极大提高了开发效率。

总的来说,这次IC课程设计确实学到很多,不仅学到以上六点,而且也锻炼了我遇到问题解决问题的勇气和能力,以及遇到挫折不达目的不罢休的韧性,这在以后的工作与学习中将会非常重要。

13

华中科技大学IC课程设计报告 8 参考文献

[1] ALI L ,SIDEK R ,ARIS I ,et al. Design of a micro2UART forSOCapplication[J] .Computers and Electrical Engineering ,2004 ,30(4) :2572268.

[2]李洋,王森章. 使用System C 设计UART IP 核[J ] . 微型电脑应用,2004 ,20(4) :46248. [3] JOE C.串行通信编程指南[M] . 北京:北京科海培训中心,1990.

[4] Intel 82510 Asynchronous Serial Controller [R] . Data sheet of Intel Corporation ,1989 ,40279. [5] NORHUZAIMIN J ,MAIMUN H. The design of high speed UART [ C] ∥Asia2Pacific Conf on Applied Electromagnetic.Malaysia ,2005 :3062310.

[6]李秋菊, 杨银堂, 高海霞.基于Verilog HDL的UART IP的设计,1003-253X(2007)06-520- 04

[7]尧勇仕,顾晓峰,于宗光,韩郑生.基于ASIC/SoC的UART核的设计,2008,02- 2- 0092-02

14

华中科技大学IC课程设计报告 9 附录

本部分为整个工程的源代码 //波特率发生器div.v `timescale 1 ps/ 1 ps

module div(in_50MHz,in_nclr,out_1Hz);

input in_50MHz,in_nclr; //定义输入时钟为50MHz,in_nclr为清0信号 output out_1Hz; //输出为1Hz wire in_50MHz,in_nclr;

reg out_1Hz=0; //输出初始电平为低电平 reg [26:0]Q; //计数器

always @(posedge in_50MHz or negedge in_nclr) begin

if (!in_nclr) begin

Q<= 27'b000_0000_0000_0000_0000_0000_0000; //开始时置0 end

else if (Q==12) begin

Q <=27'b000_0000_0000_0000_0000_0000_0000; /*如果Q增加到12,就置0, out_1Hz<= ~out_1Hz;输出时钟信号翻转 */ end

else Q <= Q + 1'b1; //上述条件都不满足时,Q自增 end

endmodule

//UART发送端,send.v `timescale 1 ps/1 ps

module send(datain,clk,reset,idle,data_out,data_tran,data_tran1); input [7:0]datain; //数据输入端,待发送的8位数据

input clk,reset,idle; //reset重置UART,idle=1禁止输入,为0允许输入 output data_out; //串行数据输出 output data_tran; output data_tran1;

reg data_tran; //工作标志位,串行数据输出完毕为0,工作时为1 reg data_tran1; //并串转化标志位,转化时为0,转化完为1 reg data_out;

reg [7:0]data_save; //存储从datain送来的并行数据

reg [7:0]data_btoc; //开始并串转化时把数据从data_tran送到data_tran1,在data_tran1中转换成串行

reg parity; //奇偶校验位,接收端检错

15

本文来源:https://www.bwwdw.com/article/1nw.html

Top