基于Verilog的UART模块的设计电子设计论文.docx
- 文档编号:4962263
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:23
- 大小:450.89KB
基于Verilog的UART模块的设计电子设计论文.docx
《基于Verilog的UART模块的设计电子设计论文.docx》由会员分享,可在线阅读,更多相关《基于Verilog的UART模块的设计电子设计论文.docx(23页珍藏版)》请在冰豆网上搜索。
基于Verilog的UART模块的设计电子设计论文
电子课程设计
实践报告
题目:
基于Verilog的UART模块的设计
班级:
信科07-4班
学号:
08073653
姓名:
姚万华
指导教师:
孙统风
中国矿业大学计算机学院
2010-6-2
摘要
UART(即UniversalAsynchronousReceiverTransmitter通用异步收发器)是广泛使用的串行数据传输协议。
UART允许在串行链路上进行全双工的通信。
通过应用EDA技术,基于CPLD/FPGA器件设计与实现UART的波特率产生器、UART发送器和接收器及其整合电路,目的是熟练运用VerilogHD语言,掌握CPLD芯片的使用。
波特率发生器、接收器和发送器是UART的三个核心功能模块,利用VerilogHDL语言对这三个功能模块进行描述并加以整合,通过MaxPlusII10.01仿真,用串口调试助手进行验证,其结果完全符合UART协议的要求和预期的结果。
关键词:
UART;串行通讯;Verilog—HDL;CPLD;仿真
目录
第1章课题概述3
1.1课题背景2
1.2课题目的与意义2
1.3报告组织结构2
第2章相关理论与技术3
2.1UART相关内容简介3
2.1.1复杂可编程逻辑器件CPLD简介3
2.1.2RS-232介绍3
2.1.3Verilog HDL简介6
2.2UART协议介绍6
2.3 硬件结构设计8
2.4软件设计9
第3章课题详细设计与实现9
3.1UART的整体设计9
3.2波特率发生器11
3.2.波特率的分频因子的计算11
3.3接收模块设计13
3.3.1接收模块原理13
3.3.2接收模块的源程序14
3.4发送模块设计5
3.4.1发送模块设计原理5
3.4.2发送模块源程序6
3.5功能的测试11
结论11
参考文献12
第1章课题概述
1.1课题背景
UART协议是数据通信及控制系统中广泛使用的一种全双工串行数据传输协议,在实际工业生产中有时并不使用UART的全部功能。
只需将其核心功能集成即可。
波特率发生器、接收器和发送器是UART的三个核心功能模块,利用Vefilog-HDL语言对这三个功能模块进行描述并加以整合UART(即UniversalAsynchronousReceiverTransmitter通用异步收发器)是广泛使用的串行数据传输协议。
UART允许在串行链路上进行全双工的通信。
串行外设用到RS232-C异步串行接口,一般采用专用的集成电路即UART实现。
如8250、8251、NS16450等芯片都是常见的UART器件,这类芯片已经相当复杂,有的含有许多辅助的模块(如FIFO),有时我们不需要使用完整的UART的功能和这些辅助功能。
或者设计上用到了FPGA/CPLD器件,那么我们就可以将所需要的UART功能集成到FPGA内部。
使用VHDL或Veriolog-HDL将UART的核心功能集成,从而使整个设计更加紧凑、稳定且可靠。
本文应用EDA技术,基于FPGA/CPLD器件设计与实现UART。
1.2课题目的与意义
实际应用上,有时我们不需要使用完整的UART的功能和这些辅助功能。
使用Verilog-HDL将所需要的UART的核心功能集成到FPGA/CPLD内部,就可以实现紧凑、稳定且可靠的UART数据传输。
这样,既可以满足实际的应用,实现所要求的简单的通信和控制,又能够去除更多不需要的繁杂复杂的功能实现。
1.3报告组织结构
第一章介绍课题的背景目的及意义,同时介绍了整个课题报告的组织形式。
第二章介绍UART协议和硬件结构;以及RS232的简要介绍。
简要介绍了课题所用的语言VerilogHDL语言。
第三章是课题的详细设计,分为波特率分频因子的计算,接收模块和发送模块。
每一部分分为设计原理和源程序。
最后是结论和参考文献。
第2章相关理论与技术
2.1UART相关内容简介
2.1.1复杂可编程逻辑器件CPLD简介
CPLD是ComplexPLD的简称,顾名思义,其是一种较PLD为复杂的逻辑元件。
CPLD是一种整合性较高的逻辑元件。
由于具有高整合性的特点,故其有性能提升,可靠度增加,PCB面积减少及成本下降等优点。
CPLD元件,基本上是由许多个逻辑方块(LogicBlocks)所组合而成的。
而各个逻辑方块均相似于一个简单的PLD元件(如22V10)。
逻辑方块间的相互关系则由可变成的连线架构,将整个逻辑电路合成而成。
常见的CPLD元件有Altera公司的Max5000及Max7000系列。
Cypress的Max340及Flash370系列等,一般来说,CPLD元件的逻辑门数约在1000~7000门之间。
【1】
2.1.2RS-232介绍
RS232接口,就是普通电脑后面那个串口.一般为9针的,也有25针的.是1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。
它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”(RS-232C,其中C表示此标准修改了三次).标准中包括了电气和机械方面的规定.该标准规定采用一个25个脚的DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定.后来随着设备的不断改进,成了目前大家普遍见到的9脚.【2】
在不使用传输控制信号的情况下,用3根线就可以传输了,9芯的是2收3发5地,25芯的是2发3收7地。
两设备用RS232相连的时候为收——发,发——收,地——地。
接口特性:
(1)接口的电气特性:
在RS-232C中任何一条信号线的电压均为负逻辑关系。
即:
逻辑“1”,-5—-15V;逻辑“0”+5—+15V。
噪声容限为2V。
即要求接收器能识别低至+3V的信号作为逻辑“0”,高到-3V的信号作为逻辑“1”
(2)接口的物理结构:
RS-232-C接口连接器一般使用型号为DB25的25芯插头座,通常插头在DCE端,插座在DTE端.一些设备与PC机连接的RS-232C接口,因为不使用对方的传送控制信号,只需三条接口线,即“发送数据”、“接收数据”和“信号地”。
所以采用DB-9的9芯插头座,传输线采用屏蔽双绞线。
(3)传输电缆长度由RS-232C标准规定在码元畸变小于4%的情况下,传输电缆长度应为50英尺.其实在一般应用中,传输距离小于50m,最大传输速率为20kbps.
由于RS-232-C接口标准出现较早,难免有不足之处,主要有以下四点:
(1)接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接。
(2)传输速率较低,在异步传输时,波特率为20Kbps。
(3)接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。
(4)传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在50米左右。
RS232的接口芯片
单片机的串口是TTL电平,在实际应用时,需要将TTL电平转换成RS232电平。
RS232的接口芯片很多,最著名的当然是maxim公司的max232;跟这个芯片完全兼容的芯片很多,象LINEAR公司的LT1081、LT1181,HARRIS的ICL232等,都是十分著名且常用的芯片,LINEAR的串行接口转换芯片在早期的电路设计中经常可以见到,但是近来好像比较少见了。
ICL232似乎比MAX232便宜。
看MAX232的原理框图,需要注意到2点:
1)需要外接电容0.1u电容,或者1u的胆电解电容或电解电容,有一款232芯片不需要外接电容,但是因为在芯片中做一个达到电容效果的电路是比较难,所以也比较贵;所以一般都选用外接电容的;之所以需要电容,是因为RS232电平是工作在大约-9V~+9V之间,需要电容将5V电压转换成Rs232电平所需要的+10V和-10V;电路上叫电荷泵,很形象;
2)Rs232的逻辑和TTL是正好相反的。
在框图上,输入和输出之间的逻辑是反的;对于TTL电平,当没有232信号发出时,是高电平;对于RS232来说,这时,TX端是-8~9V电压,相对于0V来说;如果有了信号,那就是从+9V~-9V交错变化的一系列信号,使用示波器可以看到信号的变化。
利用以上的特点,我们可以测试RS232接口电路的好坏。
1)判断芯片是否正常,参见MAX232的框图,使用万用表测量2和6脚,只要2脚的电压在+8V~+9V之间、6脚在-8V~-9V之间,就基本上可以断定这个芯片是好的;
2)在Rs232没有发信号时,看TX端电压为Rs232的高电平,也就是-8V~-9V之间,当发信号时,数据在变化,这说明这个Rs232的端口是好的;这个方法也适用于测量本地的串口。
早起的RS232接口芯片是MC1488(发送)、MC1489。
MC1489因为只有接收,所以是单5V电源工作;MC1488则需要正负12V电源;但是在工控机的板卡中,正负电源不是问题,所以在moxaC168等多串口卡中,仍然使用MC1488、MC1489,价格便宜成本低啊
2.1.3Verilog HDL简介
VerilogHDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。
被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。
数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。
VerilogHDL语言具有下述描述能力:
设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。
所有这些都使用同一种建模语言。
此外,VerilogHDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。
VerilogHDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。
因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。
语言从C编程语言中继承了多种操作符和结构。
VerilogHDL提供了扩展的建模能力,其中许多扩展最初很难理解。
但是,VerilogHDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。
当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。
2.2UART协议介绍
基本的UART通信只需要两条信号线(RxD,TxD)就可以完成数据的全双工通信任务。
TxD是UART发送端,为输出;RxD是UART接收端,为输人【3】。
UART的基本特点是:
在信号线上共有两种状态,分别用逻辑1(高电平)和逻辑O(低电平)来区分。
例如,在发送器空闲时,数据线保持在逻辑高电平状态,发送器是通过发送起始位来开始一个数据帧的传送,起始位使数据线处于逻辑O状态,提示接收器数据传输即将开始。
接着发送数据位,数据位一般为8位一个字节的数据(也有5位、6位或7位的情况),低位(LSB)在前,高位(MSB)在后。
然后发送校验位,校验位一般用来判断传输的数据位有无错误,一般是奇偶校验。
在使用中,该位常取消。
停止位在最后,用以标识数据传送的结束,它对应于逻辑1状态。
UART的帧格式包括起始位(startbit,低电平)、5—8位数据位(databits)、校验位(paritybit,可选)和停止位(stopbit,位数可为1、1.5、2位)。
这种格式是由起始位和停止位来实现字符的同步H1,如图l所示。
2.3 硬件结构设计
2.4软件设计
软件采用Altera公司的MAX+PLUSⅡ设计逻辑结构,设计的内容包括通用I/O地址译码器、各个寄存器以及UART核。
UART核主要包括3个部分:
波特率发生器、数据发送部分和数据接收部分。
I/O地址译码器和UART核使用硬件描述语言Veriloge-HDL来编写实现。
第3章课题详细设计与实现
3.1UART的整体设计
3.2波特率发生器
3.2.波特率的分频因子的计算
产生波特率的主信号频率是越高越好,这样才可产生较高且精确的波特率。
若是以40MHz主频率要产生9600波特率则必须将此clock=40MHz除以4166.66666不是整数,取一个最接近的数是4166则波特率为9601.53,其误差小于00.1%。
假如除数为4160则波特率为40000000/4160=9615.38其误差率为0.16%。
这里取DIV_CLK=4167电路的时序模拟如图2所示。
分频模块的程序流程图
3.3接收模块设计
3.3.1接收模块原理
接收不是由本机启动,而是由一个外部事件触发的。
在空闲状态时,若接收线上出现一个下降沿,即视为一个可能的起始位,应该对其再次采样加以确定。
一个真实的起始位,其低电平维持时间为104.3ns。
我们在起始位的中间时刻,以波特率的16倍频对接收线采样三次,经多数表决确认其电平状态。
状态为高,表明是一个干扰信号,UART仍回到空闲状态。
若确认接收线的状态为低,则这个起始位得到确认,UART开始接收后续数据。
每一位的接收方式与起始位确认方式一样,UART对数据接收的时序图参见图4。
接收完毕UART又回到空闲状态。
如果最后的停止位出错,则这一帧数据接收失败,放弃接收到的数据。
UART的接收状态转换图见图3。
3.3.2接收模块的源程序
`timescale1ns/1ns
modulereceiver(data_out,data_ready,framing_error,parity_error,serial_in,clock,reset);
outputdata_ready;//数据接收完毕
output[7:
0]data_out;//输出数据总线
outputframing_error;//帧错误信号1
outputparity_error;//验错误信号1
inputserial_in;//串行数据输入
inputclock;//输入时钟
inputreset;//复位信号1有?
//inputread_strobe;//读锁存信号0有?
初始值为1
parameterBAUD_CNT=4;//波特率输入数据,数字代表接收时钟分频40MH,分频系数4166
parameterrvBAUD_CNT=2;
regserial_in1;
regserial_in2;
regrxclk_enable;
reg[2:
0]clk_div;
reg[1:
0]rvclk_div;
reg[7:
0]rsr;
reg[7:
0]rbr;
reg[3:
0]control_cnt;
regdata_ready;
regparity;
regparity_error;
regframing_error;
wirerxclk;//接收时钟1有?
wireread_strobe;//读锁存信号0有?
初始值为1
//输入数据寄存器,用于下降沿检查
always@(posedgeclock)
begin
serial_in1<=serial_in;
serial_in2<=serial_in1;
end
//接收时钟使能,在时钟使能范?
内产生接受时钟并对输入数据采样
always@(posedgeclockorposedgereset)
begin
if(reset)
begin
rxclk_enable<=1'b0;
//parity<=1'b0;
end
elseif(!
serial_in1&&serial_in2)//检查下降沿
rxclk_enable<=1'b1;
elseif(control_cnt==10)//数据接收完毕
begin
rxclk_enable<=1'b0;
//parity<=1'b0;
end
end
//控制计数器
always@(posedgerxclkorposedgereset)
begin
if(reset)
control_cnt=0;
else
begin
if(!
rxclk_enable)
control_cnt=0;
else
control_cnt=control_cnt+1;
end
end
//数据接收完毕,通知微处理器可以产生read_strobe信号来读取并行数据
always@(posedgeclockorposedgeresetornegedgeread_strobe)
begin
if(reset)
data_ready=1'b0;
elseif(!
read_strobe)
data_ready=1'b0;
elseif(control_cnt==10)
data_ready=1'b1;
end
//产生接受时钟
always@(posedgeclockorposedgereset)
begin
if(reset)
clk_div=0;
elsebeginif(rxclk_enable)begin
if(clk_div>=(BAUD_CNT-1))
clk_div=0;
else
clk_div=clk_div+1;
end
end
end
assignrxclk=(clk_div>=BAUD_CNT-1)?
1:
0;
always@(negedgeclock)
begin
if(rvclk_div>=rvBAUD_CNT-1)
rvclk_div=0;
else
rvclk_div=rvclk_div+1;
end
assignread_strobe=(rvclk_div>=rvBAUD_CNT-1)?
1:
0;
/*接收数据进程:
rsr:
接收移位寄存器
rbr:
接收缓冲寄存器
*/
always@(posedgerxclkorposedgereset)
if(reset)
begin
rsr<=8'b0;
rbr<=8'b0;
parity<=1'b1;//偶校验,如果是奇校验,parity=0;
framing_error=1'b0;
parity_error=1'b0;
end
else
begin
if(control_cnt>=1&&control_cnt<=8)
begin
rsr[7]<=serial_in;
rsr[6:
0]<=rsr[7:
1];//移位
parity<=parity^rsr[7];//产生校验码
end
elseif(control_cnt==9)
begin
rbr<=rsr;//缓冲
end
elseif(!
parity)
parity_error=1'b1;//产生校验信息
elseif((control_cnt==10)&&(serial_in!
=1'b1))
framing_error=1'b1;//产生侦错误信号
elseframing_error=1'b0;
end
assigndata_out=!
read_strobe?
rbr:
8'bz;//并行数据输出
endmodule
3.4发送模块设计
3.4.1发送模块设计原理
以波特率频率产生器的txclk将数据data_in以write_strobe控制信号将其送入发送缓冲寄存器rbr,并令寄存器内容已载有数据而非空的标志rsr=0。
当同步波特率信txclk来临时监视是否处于rsr=0(内有数据)以及rsr=0(内有送入数据),但因rsr以送入传输寄存器rbr内,为空故rsr=1,此rsr代表缓冲寄存器rbr是否有被送入数据或已转送入传输寄存器,rbr是否为空,可再予以送入新的要发送的数据。
假如rsr=0(内有送入数据)则便要开始进行数据串行传输,传出数据为8位,连同启动信号“0”、校验位、停止信号共需12位的发送计数,以control_cnt作计数。
当control_cnt=0计数器便开始递加计数字节,同时令Start起始信号为0,送入TxD输出端输出。
而在计数器为1~8时都将rbr的最低位rbr(0)输出到TxD端,并令rbr[]作算术右移运算。
依次将rbr[]的D7~D0通过D0移到TxD端输出,直到第12位是停止移位,并将停止位TxD=0发送而结束一个8位数据的发送。
发送流程图如图5。
对应的发送模块的模拟时序则如图6所示。
3.4.2发送模块源程序
`timescale1ns/1ns
moduletransmit(data_in,,transmiting,reset,clock,serie_out);
outputtransmiting;//表示正在发送
outputserie_out;//串行输出数据
input[7:
0]data_in;//并行输入数据
inputclock;
inputreset;
parameterBAUD_CNT=4;//代表波特率输入数据,数字代表接收时钟的分频数
parametertxBAUD_CNT=2;
regtransmiting;
regtxclk_enable;
reg[7:
0]tsr;//发送移位寄存器
reg[7:
0]tbr;//发送缓冲寄存器
regparity;
reg[2:
0]clk_div;
reg[1:
0]txclk_div;
wiretxclk;
wirewrite_strobe;//写锁存信号
regserie_out;
reg[3:
0]control_cnt;
regwrite_strobe1;
regwrite_strobe2;
//initialbegintxclk_enable<=1'b0;end
//always#10write_strobe=~write_strobe;
//写入控制信号寄存器,用于下降沿
always@(posedgeclock)
begin
write_strobe1<=write_strobe;
write_strobe2<=write_strobe1;
end
//发送时钟使能,在时钟使能和范围内产生发送时钟,发送适中的数据和此时钟同步
always@(posedgeclockorposedgereset)
if(reset)
begin
transmiting<=1'b0;
txclk_enable<=1'b0;
end
//elseif(!
txclk_enable)
//begin
elseif(!
write_strobe1&&write_strobe2)//检测下降沿
begin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Verilog UART 模块 设计 电子设计 论文