基于FPGA数字跑表的设计.docx
《基于FPGA数字跑表的设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA数字跑表的设计.docx(30页珍藏版)》请在冰豆网上搜索。
![基于FPGA数字跑表的设计.docx](https://file1.bdocx.com/fileroot1/2023-2/17/d0814eb0-9823-47a0-acb9-176c41cb07b6/d0814eb0-9823-47a0-acb9-176c41cb07b61.gif)
基于FPGA数字跑表的设计
基于FPGA数字跑表的设计
现代电子技术实验报告
数字跑表的设计
目录……………………………………………………………………………2
一、基于FPGA的VHDL设计流程………………………………………….3
1.1VHDL语言介绍…………………………………………………………..3
1.1.1VHDL的特点…………………………………………………………..3
1.2FPGA开发介绍…………………………………………………………..4
1.2.1FPGA简介……………………………………………………………...4
1.2.2FPGA设计流程………………………………………………………...4
1.2.3实验板使用芯片XC3S200A介绍………………………………………6
二、总体电路的设计……………………………………………………………6
2.1设计要求……………………………………………………………………………...6
2.2系统工作原理…………………………………………………………………………6
2.3单元电路的划分……………………………………………………………………...6
三、电子秒表的单元电路设计…………………………………………............7
3.1电子秒表的设计过程及结果分析………………………………………….7
3.1.1分频器……………………………………………………………………..7
3.1.2按键消抖…………………………………………………………………...8
3.1.3控制电路…………………………………………………………………..8
3.1.4计数器……………………………………………………………………..9
3.1.5寄存器……………………………………………………………………..12
3.1.6显示模块…………………………………………...……………………...15
3.1.7使能模块…………………………………………......................................17
四、顶层设计…………………………………………......................................18
4.1顶层设计………………………………………….........................................18
4.2分配引脚和下载实现……………………………………….........................19
4.3测试结果及结论.............................................................................................20
五、经验及收获...................................................................................................22
一、基于FPGA的VHDL设计流程
1.1VHDL语言介绍
VHDL(Very-high-speedIntegratedCircuitHardwareDescriptionLanguage)诞生于1982年.1987年底,VHDL被IEEE(TheInstituteofElectricalandElectronicsEngineers)和美国国防部确认为标准硬件描述语言.自IEEE公布了VHDL的标准版本(IEEE-1076)之后,各EDA公司相继推出了自己的VHDL设计环境,并宣布自己的设计工具可以和VHDL接口.此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准硬件描述语言.1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本.现在,VHDL和VERILOG作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言.有专家认为,在新的世纪中,VHDL和VERILOG语言将承担起几乎全部的数字系统设计任务.
1.1.1VHDL语言的特点
与其他硬件描述语言相比,VHDL具有以下特点:
1、功能强大、设计灵活:
VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制.它具有多层次的设计描述功能,层层细化,最后可直接生成电路级描述.VHDL支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言所不能比拟的.VHDL还支持各种设计方法,既支持自底向上的设计,又支持自顶向下的设计;既支持模块化设计,又支持层次化设计.
2、支持广泛、易于修改:
由于VHDL已经成为IEEE标准所规范的硬件描述语言,大多数EDA工几乎都支持VHDL,这为VHDL的进一步推广和广泛应用奠定了基础.在硬件电路设计过程中,主要的设计文件是用VHDL编写的源代码,因为VHDL易读和结构化,所以易于修改设计.
3、强大的系统硬件描述能力:
VHDL具有多层次的设计描述功能,既可以描述系统级电路,又可以描述门级电路.而描述既可以采用行为描述、寄存器传输描述或结构描述,也可以采用三者混合的混合级描述.另外,VHDL支持惯性延迟和传输延迟,还可以准确地建立硬件电路模型.VHDL支持预定义的和自定义的数据类型,给硬件描述带来较大的自由度,使设计人员能够方便地创建高层次的系统模型.
4、独立于器件的设计、与工艺无关:
设计人员用VHDL进行设计时,不需要首先考虑选择完成设计的器件,就可以集中精力进行设计的优化.当设计描述完成后,可以用多种不同的器件结构来实现其功能.
5、很强的移植能力:
VHDL是一种标准化的硬件描述语言,同一个设计描述可以被不同的工具所支持,使得设计描述的移植成为可能.
6、易于共享和复用:
VHDL采用基于库(Library)的设计方法,可以建立各种可再次利用的模块.这些模块可以预先设计或使用以前设计中的存档模块,将这些模块存放到库中,就可以在以后的设计中进行复用,可以使设计成果在设计人员之间进行交流和共享,减少硬件电路设计.
1.2FPGA开发介绍
现场可编程门阵列(FPGA)器件是八十年代中期出现的新产品,它的应用大大地方便了IC的设计,因而随着数字技术日益广泛的应用,以FPGA为代表的ASIC器件得到了迅速的普及和发展,器件集成度和速度都在高速增长.
传统的电路设计过程是:
先画原理图、把原理图绘制成印制电路板图、再制版、安装、调试.有了FPGA,我们只需要在计算机上绘出原理图,再运行相应的软件,就可把所设计的逻辑电路在FPGA中实现.所有步骤均可自动完成.电子设计工程师自己设计专用集成电路成为了一件很容易的事情.
FPGA作为专用集成电路(ASIC)概念上的一个新型范畴和门类,以其高度灵活的用户现场编程方式,现场定义高容量数字单片系统的能力,能够重复定义、反复改写的新颖功能,为复杂数字系统设计、研制以及产品开发提供了有效的技术手段.电子应用设计工程师应用FPGA技术不仅可避免通常ASIC单片系统设计周期长,前期投资风险大的弱点,而且克服了过去板级通用数字电路应用设计的落后,繁琐和不可靠性.
目前FPGA的两个重要发展与突破是,大多数厂商在其高端器件上都提供了片上的处理器(如CPU、DSP)等硬核(HardCore)或固化核(FixedCore).比如Xilinx的VirtexIIPro芯片可以提供PowerPC,而Altera的Stratix、Excalibur等系列芯片可以提供Nios、DSP和Arm等模块.在FPGA上集成微处理器,使SOPC设计更加便利与强大.另一个发展是在不同器件商推出的高端芯片上大都集成了高速串行收发器,一般能够达到3Gb/s以上的数据处理能力,在Xilinx、Altera、Lattice都有相应的器件型号提供该功能.这些新功能使FPGA的数据吞吐能力大幅度增强.
1.2.2FPGA设计流程
对于目标器件为FPGA和CPLD的HDL设计,其工程设计的基本流程如图:
图1FPGA设计流程图
1、文本编辑
用任何文本编辑器都可以进行,通常VHDL文件保存为vhd文件,Verilog文件保存为v文件.
2、使用编译工具编译源文件
HDL的编译器有很多,ACTIVE公司,MODELSIM公司,SYNPLICITY公司,SYNOPSYS公司,VERIBEST公司等都有自己的编译器.
3、逻辑综合
将源文件调入逻辑综合软件进行综合.综合的目的是在于将设计的源文件由语言转换为实际的电路.但是此时还没有在芯片中形成真正的电路.这一步的最终目的是生成门电路级的网表(Netlist).
4、布局、布线
将第3步生成的网表文件调入PLD厂家提供的软件中进行布线,即把设计好的逻辑安放到CPLD/FPGA内.这一步的目的是生成用于下载(编程Programming)的编程文件.在这一步,将用到第3步生成的网表,并根据CPLD/FPGA厂商的器件容量,结构等进行布局、布线.这就好像在设计PCB时的布局布线一样.先将各个设计中的门根据网表的内容和器件的结构放在器件的特定部位.然后,在根据网表中提供的各门的连接,把各个门的输入输出连接起来.最后,生成一个供编程的文件.这一步同时还会加一些时序信息(Timing)到你的设计项目中去,以便于你做后仿真.
5、后仿真
利用在布局布线中获得的精确参数,用仿真软件验证电路的时序.(也叫布局布线仿真或时序仿真).这一步主要是为了确定你的设计在经过布局布线之后,是不是还满足你的设计要求.
6、编程,下载
如果前几步都没有发生错误,并且符合设计要求,这一步就可以将由适配器等产生的配置或下载文件通过编程器或下载电缆下载到目标芯片中.
7、硬件测试
硬件测试的目的是为了在更真实的环境中检验HDL设计的运行情况,特别是对于HDL程序设计上不是十分规范,语义上含有一定歧义的程序.
1.2.3实验板使用芯片XC3S200A介绍
本实验设计中采用的是Xilinx公司的ETL-001FPGA开发板进行开发设计,该开发板所提供的主芯片XC3S200A是Xilinx公司最新推出的90nm半导体工艺的低端低成本的FPGA芯片,可以广泛地运用在通信,军事,电力,控制,消费电子,汽车电子绝大多数电子应用领域.芯片主要特性如下表1所示:
表1实验板XC3S200A
该芯片是基于SRAM工艺的超大规模可编程逻辑芯片,提供了高达20万的等效系统门,3854个查找表(LUT),3854个寄存器(FF),288Kbit的块状SRAM以及16个18*18的乘法器,以及60对差分I/O,LVD.芯片主要特性如上表示.
二、系统总体设计
2.1电子秒表的设计任务目标
1、跑表精度为0.01秒
2、跑表计时范围为:
1小时
3、设置开始计时/停止计时、复位两个按钮
4、显示工作方式:
用六位BCD七段数码管显示读数.显示格式:
00:
00:
00
扩展功能:
按键消抖;
选手时间分时显示;
2.2系统工作原理
系统基本流程图如图:
图1系统基本流程图
2.3单元电路的划分
根据要求设计的电路包括以下几个模块:
1.分频器:
由于我们要以1ms为最小单位进行计时.分频器的功能是对晶体振荡器产生的48MHz时钟信号进行分频,产生1KHz的基准信号,对晶体振荡器产生的时钟信号进行分频,产生时间基准信号.
2.计数锁存器:
由于我们要实现按不同的键让秒表产生不同的反应.所以需要这个模块对时间基准脉冲进行计数,完成计时功能.并完成对数据的锁存使显示保持暂停.
3.控制器:
由于我们要实现按不同的键让秒表产生不同的反应.所以需要这个模块控制计数器的运行、停止以及复位,产生锁存器的使能信号.
4.按键消抖电路:
由于普通按键会产生抖动现象,只按一下,可能出现多次抖动的现象,使按键不灵敏.所以需要消除按键输入信号抖动的影响,输出单脉冲.
5.扫描显示的控制电路:
包括扫描计数器、数据选择器和7段译码器,控制8个数码管以扫描方式显示计时结果.
单元电路划分总框图如下图2:
图2单元电路划分总框图
三、单元电路设计
3.1单元电路设计思路
3.1.1分频器
分频器的功能是对晶体振荡器产生的48MHz时钟信号进行分频,产生1KHz和100Hz的基准信号.对于频率为1khz的信号,分频系数为48000,因此需要一个24000进制的计数器,每当计数24000个时钟,分频输出信号c1000取反一次,c1000取反两次得到一个周期的信号.这样可实现对输入时钟信号的4800次分频,从而得到1khz的信号.对于频率为100hz的信号,原理相同,分频系数为480000.
生成的分频器模块如图3所示:
图3分频器模块
其中,clkin为48MHz晶振时钟信号;c1000为分频输出的1KHz时钟信号,c100为分频输出的100Hz时钟信号.
设计程序如下:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_arith.ALL;
useIEEE.STD_LOGIC_unsigned.ALL;
entityfdivis
Port(clkin:
inSTD_LOGIC;
c1000:
outSTD_LOGIC;
c100:
outSTD_LOGIC);
endfdiv;
architectureBehavioraloffdivis
signalc1000_temp:
integerrange0to23999:
=0;
signalc100_temp:
integerrange0to239999:
=0;
signalfd1000,fd100:
STD_LOGIC:
='0';
begin
process(clkin)is
begin
ifrising_edge(clkin)then
ifc1000_temp=23999thenc1000_temp<=0;fd1000<=notfd1000;
elsec1000_temp<=c1000_temp+1;
endif;
endif;
endprocess;
c1000<=fd1000;
process(clkin)is
begin
ifrising_edge(clkin)then
ifc100_temp=239999thenc100_temp<=0;fd100<=notfd100;
elsec100_temp<=c100_temp+1;
endif;
endif;
endprocess;
c100<=fd100;
endBehavioral;
仿真波形图4如下
图4分频器仿真波形
由仿真波形可知,分频器的设计是符合预期期望的,当产生输入晶振信号时,经过分频器内部处理的信号最终产生两个输出信号,分别是1KHz和100Hz,由波形图可以看出,当时钟信号计数24000个脉冲时,1KZ的波形翻转一次,从而产生1KZ的信号;同理,100Hz的信号也符合预期设计.
3.1.2按键消抖
由于实验板上的按键,在按下和松开的短暂时间里,会出现抖动现象,这样会严重影响按键的效果,故此需要设计一个消抖电路,来消除这种不利的影响,按键消抖电路不仅可以消除按键抖动的影响,而且每按一次键,只输出一个脉冲,其宽度为一个时钟周期,达到整形的作用,按键消抖电路是利用时间基准信号对按键按下时产生的抖动进行整形,使其输出为正常的脉冲信号的.
消抖设计框图5如下:
图5消抖模块设计原理图
程序设计如下:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_unsigned.ALL;
useIEEE.STD_LOGIC_arith.ALL;
entityXDis
Port(clk1k:
inSTD_LOGIC;
keyin:
inSTD_LOGIC;
keyout:
outSTD_LOGIC);
endXD;
architectureBehavioralofXDis
signalkey1,key2:
std_logic;
signalcount:
integerrange1to3:
=1
begin
process(clk1k,keyin)
begin
ifclk1k'eventandclk1k='1'then
ifcount=3then
key1<='1';
else
key1<='0';
count<=count+1;
endif;
key2<=key1;
endif;
ifkeyin='0'then
count<=1;
endif;
endprocess;
keyout<=(notkey1)andkey2;
endBehavioral;
仿真波形图6如下:
在按键按下的一个周期内,消抖模块输出仅有一个时钟周期,抑制了按键按下状态不稳的情况。
3.1.3计数器
十进制计数器是每当计数从1记到9时,下一位产生一个进位信号,进而输入到下一个计数器的时钟输入端,进而达到秒表所要求的计数进制.计数器是在时钟基准信号的情况下,分频为我们需要的计时时间信号,电子秒表的最低位为0.01秒,即需要100Hz的脉冲,当最低一位计数满9时,向前进1,同时自身为0,重复循环.
本设计中采用的是异步计时器,当上一位计数到9时,产生时钟进位,下一时钟在进位成立时,开始计时加1,以此内推,最终输出6组,计时信号,分别是0.01秒位,0.1秒位,秒个位,秒十位,分个位,分十位.当计数到59’59’59时计数清零为00’00’00重复计时.数字跑表需要用六位七段数码管显示,数码管显示数字分别用2个6进制计数器和4个10进制计数器对其计数,从秒表显示的右侧到左侧计数器分别为十进制、十进制、十进制、六进制、十进制、六进制、十进制计数器,如图7所示:
图7数码管显示示意图
计数器的设计图如下:
10进制计数器的框图如下:
图810进制计数器的框图
6进制计数器的框图如下:
图96进制计数器的框图
相应程序设计如下:
10进制程序设计如下:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_arith.ALL;
useIEEE.STD_LOGIC_unsigned.ALL;
entitycount101is
Port(rst:
inSTD_LOGIC;
clk:
inSTD_LOGIC;
carryin:
inSTD_LOGIC;
carryout:
outSTD_LOGIC;
countout:
outSTD_LOGIC_VECTOR(3downto0));
endcount101;
architectureBehavioralofcount101is
signalcount:
STD_LOGIC_VECTOR(3downto0):
="0000";
begin
process(clk,rst)
begin
ifrst='1'thencount<="0000";
elseifrising_edge(clk)then
ifcarryin='1'then
ifcount<"1001"thencount<=count+1;
elsecount<="0000";
endif;
endif;
elsenull;
endif;
endif;
endprocess;
countout<=count;
carryout<='1'whencarryin='1'andcount="1001"else'0';
endBehavioral;
6进制程序设计如下:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_arith.ALL;
useIEEE.STD_LOGIC_unsigned.ALL;
entitycount6is
Port(rst:
inSTD_LOGIC;
clk:
inSTD_LOGIC;
carryin:
inSTD_LOGIC;
carryout:
outSTD_LOGIC;
countout:
outSTD_LOGIC_VECTOR(3downto0));
endcount6;
architectureBehavioralofcount6is
signalcount:
STD_LOGIC_VECTOR(3downto0):
="0000";
begin
process(clk,rst)
begin
ifrst='1'thencount<="0000";
elseifrising_edge(clk)then
ifcarryin='1'then
ifcount<"0101"thencount<=count+1;
elsecount<="0000";
endif;
endif;
elsenull;
endif;
endif;
endprocess;
countout<=count;
carryout<='1'whencarryin='1'andcount="0101"else'0';
endBehavioral;
仿真波形如下图:
10进制的仿真波形如下:
图1010进制计数器仿真图形
由图可见,设计模块对波形个数计数,从产生结果为2进制的4位数.从0000到1001,结果正确.
6进制的仿真波形如下:
图116进制计数器的仿真波形
有图可知,6进制计数器设计正确,脉冲时钟上升沿到来时计数器开始计数,从0000到1001,然后重复循环.
3.1.4寄存器
数据锁存器,在使能为1时,将当前数据送到寄存器中保存,可记录4组数据,当再次使能时,将寄存的数据赋给输出,显示寄存器中的4组数据.
设计框图如下图:
图12寄存器设计框图
寄存器程序设计如下:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
entitysave2is
Port(lacthin:
inSTD_LOGIC;
reset:
inSTD_LOG