EDA基于VHDL的串口设计.docx
- 文档编号:11725742
- 上传时间:2023-03-31
- 格式:DOCX
- 页数:18
- 大小:283.74KB
EDA基于VHDL的串口设计.docx
《EDA基于VHDL的串口设计.docx》由会员分享,可在线阅读,更多相关《EDA基于VHDL的串口设计.docx(18页珍藏版)》请在冰豆网上搜索。
EDA基于VHDL的串口设计
EDA课程设计
题目:
基于VHDL的串口设计
院系:
机电学院
班级:
电气103
姓名:
张明军
学号:
20100744113
日期:
2012.12.10—2012.12.17
1、任务要求
1、1课题要求
1、2设计目标
2、系统设计
2、1层次模块划分
2、2分频模块的设计
2、3发送电路的波特率发生器的设计
2、4接受模块的设计
2、5接收电路的波特率发生器和采样时钟的设计
3、VHDL的描述思路
4、总体电路的描述
5、系统仿真验证
5、1发送电路的波特率发生器的VHDL的仿真
5、2发送模块VHDL的仿真
5、3特率发生器和采样时钟的设计的VHDL仿真
5、4接受模块的描述的VHDL仿真
5、5综合仿真
6、结果与分析
6.1实现功能说明
6.2器件资源分析
6.3故障和问题分析
7、总结体会
8、参考文献
9、附录
基于VHDL的串口设计任务书
摘要:
实验设计了基于VHDL描述的RS232串口通信控制器,通过串口调试工具实现CPLD向单片机的数据发送和单片机的数据接收。
完成的功能为实现收发一帧10个bit、波特率为4800的串口通信控制器。
实验的重心放在了RS232串口通信控制器发送模块和接收模块的设计,采用了自顶向下的思路进行设计。
报告中给出了完整的设计思路和过程,并将系统分模块进行了详细的设计,给出了VHDL语言描述。
完成了核心模块以及系统整体的仿真验证。
最终下载到实验板上测试通过。
1、任务要求
1、1课题要求
(1)用RS232实现与单片机之间的数据通信,单片机上用串口工具接收;
(2)CPLD每1秒钟发送1个字节的数据到单片机;
(3)所发送的数据用实验箱上的8个开关输入;
(4)设置发送允许控制;
(5)数据格式:
1位起始位、8位数据位、1位停止位;
(6)数据传输速率:
4800波特。
1、2设计目标
根据课题要求,实验中将目标进行了细化,叙述如下:
设定数据帧格式为10bit,其中第一位为起始位,定位低电平,8位数据位,1位结无数据传输时为高电平;
2、系统设计
2、1层次模块划分
系统划分为二层,自顶向下分别是顶层模块、控制器子模块。
顶层描述了整个系统的功能和运行;控制器子模块实现系统中各个独立而完整的功能部分。
每个层次可用一个或多个具体模块加以实现。
顶层模块:
作用为集成子模块功能,控制子模块的连接和耦合信号。
由各子模块定义成的库元件组成。
中层模块:
具体实现顶层模块的描述,包括的功能主要是串行发送电路的波特率发生器,发送模块和接收模块地区、接受模块的分频部分和验收。
发送电路的波特率发生器,将16KHz的时钟分频为4800Hz的时钟。
输入:
16KHz晶振信号。
输出:
送往发送模块的4800Hz的信号。
发送模块。
向PC机发送信号。
输入:
4800Hz时钟信号、发送数据。
输出:
输入数据的串行输出。
接收电路的波特率发生器和采样时钟的设计,提高接收的准确性,减少误码率
输入:
16KHz晶振信号。
输出:
送往接受模块的信号和检验模块。
接收模块,检测接收端,若检测到低电平则开始接收数据
输入:
CPLD发送的数据。
输出:
接收到的数据。
以上模块分别生成符号文件,最后在顶层模块中进行连接。
2、2分频模块的设计
由于UART是异步传输,没有传输同步时钟。
为了能保证数据传输的正确性,UART采用16倍数据波特率的时钟进行采样。
每个数据有16个时钟采样,取中间的采样值,以保证采样不会滑码或误码。
一般UART一帧的数据位数为8,这样即使每个数据有一个时钟的误差,接收端也能正确地采样到数据。
这里采用常用的数据波特率为9600bps,则所需时钟的频率为16*9600。
系统时钟为50MHz,则分频系数为50000000/(16*9600)=325.52,取整为325。
分频器实现相对简单,这里对其设计流程图不做详细介绍。
只是将设计过程和结果简述如下:
首先用VHDL语言进行设计输入,并生成模块文件如图2-1所示,其中clk为50M系统时钟输入,clkout为325分频后时钟输出。
图2-1分频模块
然后建立波形文件,对以上模块进行时序仿真,仿真结果如图2-2所示,方正结果说明,分频输出实现了对输入的325分频,分频模块设计正确。
图2-2分频模块仿真结果
2、3发送电路的波特率发生器的设计
要产生4800波特率,要有一个不低于4800Hz的时钟才可以。
为产生高精度的时钟,我选了
16KHz的晶振来提供外部时钟。
当然,你也可以选其它频率的时钟来产生4800Hz的时钟。
对于16KHz时钟,需要设计一个13进制的分频器来产生4800波特率的时钟信号。
发送过程:
空闲状态,线路处于高电平;当受到发送数据指令后,拉低线路一个数据位的时间T,接着数据按地位到高位依次发送,数据发送完毕后,接着发送停止位(停止位为高电平),一帧数据发送结束。
(1)模块流程图
根据以上发送过程,发送模块算法示意图设计如图2-3所示。
图2-3UART发送数据算法示意图
(2)生成模块文件
新建一原理图文件,将VHDL源文件生成对应的模块文件如图2-4所示,其中clk为时钟输入,datain为需要发送的数据输入,wrsig为发送命令输入,idle为忙闲信号输出,tx为串行数据输出端。
图2-4UART发送模块
图2-5UART发送模块仿真原理图
2、4接受模块的设计
根据采用的帧格式,需要发送的数据为10位(1位开始位、8位数据位、1位停止位),在发送完这10位后,就应该停止发送,并使发送端电平处于逻辑1,然后等候下次的发送.
接收电路比发送电路要复杂的多,接收电路要时实检测起始位的到来,一旦检测到起始位到,就要将这一帧数据接收下来。
串行接收电路首先要能判断接收数据的到来,即每一帧的开始,然后对数据进行3次采样,最后判决输出。
为简化设计,帧格式仍然采用:
1位开始位+8位数据位+1位停止位。
UART接收模块的功能:
时时检测线路,当线路产生下降沿时,即认为线路有数据传输,启动接收数据进程进行接收,按从低位到高位接收数据。
(1)模块流程图
根据以上描述的接收模块的功能,可将接收模块算法示意图设计如图2-6所示。
图2-6接收模块算法示意图
(2)生成模块文件
新建一原理图文件,将VHDL源文件生成对应的模块文件如图4.10所示,其中clk为时钟输入,rx为需要串行数据输入,dataout为并行输出,rdsig为忙闲信号输出。
图2-7UART接收模块
(3)波形仿真
新建一个原理图文件,加入各功能模块,并添加输入输出端口,各个模块的连接如图2-8所示。
图2-8UART接收模块仿真原理图
保存原理图为uartrxts.bdf。
编译工程文件,编译无误后新建波形仿真文件,加入输入输出信号,设置系统时钟clk为50MHz,保存为uartrxts.vwf,进行UART数据接收的波形仿真,波形仿真报告如图2-9所示
图2-9UART接收模块仿真结果
对上图分析看出,UART接收模块接收到的数据与UART发送模块发送的数据相一至,每接收到一个数据都有一个读取数据指示rdisg,UART接收模块得到正确验证
2、5 接收电路的波特率发生器和采样时钟的设计
为提高接收的准确性,减少误码率,每一位数据都用3倍频的波特率对数据进行采样,然后对3次采样结果进行判决:
如果3次采样中至少有2次为高电平,则接收这一位数据被判决为高电平,否者,为低电平。
为完成3次采样,除了频率为9600Hz的接收时钟外,还要有一个3倍频的采样时钟
3VHDL描述思路
第二部分“系统设计”中对系统的功能和逻辑结构、以及模块划分都有了详细的叙述,模块间的耦合和信号的传递关系已经清晰。
可以使用VHDL语言描述硬件电路了。
发送模块和接收模块的VHDL语言描述按照事先的设计进行编写可以使电路思想明晰化,避免编程过程中用软件的思维去描述硬件的电路系统,也可有效避免错误。
由于进行了细致的模块划分,模块的间的耦合程度降到了很低,这就使得电路设计的可靠性大为增强,只要模块的输出满足了功能定义,整个系统就能正常工作,即便个别模块出现问题,也不会过多影响到其他模块。
实际测试过程中也印证了这一点。
4总体电路的描述
顶层符号文件描述如下:
5系统仿真验证
系统仿真分为两个步骤进行,首先是关键模块的仿真,验证子系统功能的正确性,然后是综合仿真,验证整个系统的功能。
5、1发送电路的波特率发生器的VHDL的仿真
5、2发送模块VHDL的仿真
5、3特率发生器和采样时钟的设计的VHDL仿真
5、4接受模块的描述的VHDL仿真
5、5综合仿真
6、结果与分析
6.1实现功能说明
本实验完成的RS232串口通信控制器,完成了课题要求的所有功能。
由于顶层设计采用了子系统分模块描述的方法,使得控制器具有很好的扩展性。
可以在不改变系统框架和模块间电路连接关系,增加其他模块,实现其他功能。
本课题中并没有在数据帧中加入校验位,仅仅实现了1位起始位,1位停止位和8位数据位的传输。
初步实现了单片机和CPLD之间的通信。
数字系统的设计,真正的重点在于把系统层面的设计做好,系统架构清晰,层次明确,稳定性好,可扩展和可移植性好,这样的系统给到用户,只要添加用户模块或者稍作修改即可完成非特定的功能。
6.2器件资源分析
在设计阶段,对系统描述采用过多种方式,尝试了多种描述,代码的长度在增加,模块在增多,但系统稳定性和可扩展性也在增强,层次结构和模块设计也更加完善。
设计之初对资源使用没有多少概念,时常以软件的思想描述硬件,在描述中使用乘法等资源耗费严重的操作,也曾使用过嵌套多层的IF-ELSE语句,产生很长的选择器,降低了模块的可靠性,增加处理延时。
随着设计的深入,加上反复求精的过程磨练,逐步对硬件描述综合出的实际电路形式有了更多的理解,对延时和资源占用有了初步概念。
一个显见的结论是描述代码的长度和综合后的电路形式与资源占用无必然联系。
需要关注编译器在综合时如何将VHDL行为级描述转化为结构化的门级电路,才能分析清楚资源占用率和电路结构。
行为级描述可能与实际综合的电路产生不一致,需要谨慎对待。
6.3故障和问题分析
实验中由于详细划分了子模块、各模块的实现都仔细进行了描述,故没有出现太多的故障。
但是在最后将个子模块进行综合的时候出现了仿真结果不正确的现象,后经过多次修改终于得到正确的结果。
由于对VHDL语言的学习与理解还停留在低层次上,故在编译时出现了很多错误,在查阅了诸多相关资料后对VHDL的语法基本熟悉,逐渐深入,从最初的模块初步成型
到最后全模块化,自顶向下设计系统,完成VHDL描述。
最深的感受在于,开始时一心专注于代码的编写和语法的使用,忽视了系统设计,导致设计结果不令人满意,后来逐步采用自顶向下的设计思路,先从逻辑上把系统的功能和子系统的划分描述清楚,然后设计各个模块的接口和定义,最后分别去描述底层各个模块的功能和实现,清晰明了,一气呵成。
这也是系统没有多少故障的主要原因。
7、总结体会
对这次设计的题目起初不是很了解,后来通过同学、老师的解答和上网搜寻对设计有了一定的了解,对课题的设计业采用了很多方法,有复杂的也有简单的,最终决定采用这个方案,当然,在使用这个方案设计程序的时候也遇到了许多问题,有VHDL语言的语法问题也有硬件下载和仿真问题,后来都在同学和老师的帮助下解决了,解决问题的主要方法还是要加强对VHDL语言的学习和对硬件操作的学习,要注意只是与应用相结合。
8、参考文献
[1]EDA技术实验开发系统实验指导书,启东计算机厂有限公司。
[2]CPLD/FPGA可编程逻辑器件实用教程,马彧,王丹利,王丽英,机械工业出版社,2010,7。
[3].微机原理与接口技术(第二版),田辉,高等教育出版社.2011
[4].EDA技术实用教程——VHDL版(第四版),科学出版社
附录1发送电路的波特率发生器的VHDL
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYclk_divIS
PORT(clk:
INSTD_LOGIC;
clk_div13:
OUTSTD_LOGIC);
ENDclk_div;
ARCHITECTURErtlOFclk_divIS
SIGNALcount:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALclk_temp:
STD_LOGIC;
BEGIN
PROCESS(clk)
BEGIN
IF(clk'eventANDclk='1')THEN
IF(count="00001101")THEN
count<=(OTHERS=>'0');
clk_temp<=NOTclk_temp;
ELSEcount<=count+1;
ENDIF;
ENDIF;
ENDPROCESS;
clk_div13<=clk_temp;
ENDrtl;
附录2发送模块的VHDL
libraryieee;
useieee.std_logic_1164.all;
entitycomis
port(clk,en:
instd_logic;
Send_data:
instd_logic_vector(9downto0);
serial:
outstd_logic);
endcom;
architecturecom_arcofcomis
begin
process(clk)
variablecount:
integerrange0to9:
=0;
begin
ifen='0'then
count:
=0;
serial<='1';
elsifrising_edge(clk)then
ifcount=9then
serial<=Send_data(9);
else
serial<=Send_data(count);
count:
=count+1;
endif;
endif;
endprocess;
endcom_arc;
附录3接收电路的波特率发生器和采样时钟设计的VHDL
libraryieee;
useieee.std_logic_1164.all;
entitycount13is
port(clk,en:
instd_logic;
Clock1,Clock3:
outstd_logic);
endcount13;
architecturecount13_arcofcount13is
begin
process(clk,en)
variablecount:
integerrange0to13:
=0;
begin
ifen='0'then
NUll;
elsif(rising_edge(clk))then
count:
=count+1;
ifcount=13then
Clock1<='1';count:
=0;
else
Clock1<='0';
endif;
if(count=3orcount=6orcount=9)then
Clock3<='1';
else
Clock3<='0';
endif;
endif;
endprocess;
endcount13_arc;
附录4接受模块的VHDL
libraryieee;
useieee.std_logic_1164.all;
entitycom_receive10is
port(com,clr,clk1,clk3:
instd_logic;
Q:
outstd_logic_vector(0to9);
Valid:
outstd_logic);
endcom_receive10;
architecturecom_receive10_arcofcom_receive10is
SignalEnable:
std_logic:
='1';
SignalHold:
std_logic:
='0';
SignalN:
std_logic_vector(0to2):
="000";
begin
Valid<=EnableandHold;
process(clk1,clr)
variableNum:
integerrange0to9:
=0;
begin
ifclr='0'then
Enable<='1';Num:
=0;Q<="0000000000";
elsif(rising_edge(clk1))then
Q(Num)<=(N(0)andN
(1))or(N
(1)andN
(2))or(N(0)andN
(2));
ifNum=9then
Enable<='0';Num:
=0;
else
Num:
=Num+1;
endif;
endif;
endprocess;
process(clk3,clr)
variablem:
integerrange0to2:
=0;
begin
ifclr='0'then
m:
=0;
elsif(rising_edge(clk3))then
N(m)<=com;
ifm=2then
m:
=0;
else
m:
=m+1;
endif;
endif;
endprocess;
process(clr,com)
begin
ifclr='0'then
Hold<='0';
elsiffalling_edge(com)then
Hold<='1';
endif;
endprocess;
endcom_receive10_arc;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 基于 VHDL 串口 设计