资源描述
现代电子技术实验报告数字跑表的设计 目 录 2 一、基于FPGA的VHDL设计流程.3 1.1 VHDL语言介绍.3 1.1.1 VHDL的特点. 3 1.2 FPGA开发介绍. 4 1.2.1 FPGA简介. 4 1.2.2 FPGA设计流程. 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.1 VHDL语言介绍VHDL(Very-high-speed Integrated Circuit Hardware Description Language)诞生于1982年.1987年底,VHDL被IEEE(The Institute of Electrical and Electronics Engineers)和美国国防部确认为标准硬件描述语言.自IEEE公布了VHDL的标准版本(IEEE-1076)之后,各EDA公司相继推出了自己的VHDL设计环境,并宣布自己的设计工具可以和VHDL接口.此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准硬件描述语言.1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本.现在,VHDL和VERILOG作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言.有专家认为,在新的世纪中,VHDL和VERILOG语言将承担起几乎全部的数字系统设计任务.1.1.1 VHDL语言的特点与其他硬件描述语言相比,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.2 FPGA开发介绍现场可编程门阵列(FPGA)器件是八十年代中期出现的新产品,它的应用大大地方便了IC的设计,因而随着数字技术日益广泛的应用,以FPGA为代表的ASIC器件得到了迅速的普及和发展,器件集成度和速度都在高速增长.传统的电路设计过程是:先画原理图、把原理图绘制成印制电路板图、再制版、安装、调试.有了FPGA,我们只需要在计算机上绘出原理图,再运行相应的软件,就可把所设计的逻辑电路在FPGA中实现.所有步骤均可自动完成.电子设计工程师自己设计专用集成电路成为了一件很容易的事情.FPGA作为专用集成电路(ASIC)概念上的一个新型范畴和门类,以其高度灵活的用户现场编程方式,现场定义高容量数字单片系统的能力,能够重复定义、反复改写的新颖功能,为复杂数字系统设计、研制以及产品开发提供了有效的技术手段.电子应用设计工程师应用FPGA技术不仅可避免通常ASIC单片系统设计周期长,前期投资风险大的弱点,而且克服了过去板级通用数字电路应用设计的落后,繁琐和不可靠性.目前FPGA的两个重要发展与突破是,大多数厂商在其高端器件上都提供了片上的处理器(如CPU、DSP)等硬核(Hard Core)或固化核(Fixed Core).比如Xilinx的Virtex II Pro芯片可以提供Power PC,而Altera的Stratix、Excalibur等系列芯片可以提供Nios、DSP和Arm等模块.在FPGA上集成微处理器,使SOPC设计更加便利与强大.另一个发展是在不同器件商推出的高端芯片上大都集成了高速串行收发器,一般能够达到3Gb/s以上的数据处理能力,在Xilinx、Altera、Lattice都有相应的器件型号提供该功能.这些新功能使FPGA的数据吞吐能力大幅度增强.1.2.2 FPGA设计流程对于目标器件为FPGA和CPLD的HDL设计,其工程设计的基本流程如图: 图1FPGA设计流程图1、文本编辑用任何文本编辑器都可以进行,通常VHDL文件保存为vhd文件,Verilog文件保存为v文件.2、使用编译工具编译源文件HDL的编译器有很多,ACTIVE公司,MODELSIM公司,SYNPLICITY公司,SYNOPSYS公司,VERIBEST公司等都有自己的编译器.3、逻辑综合将源文件调入逻辑综合软件进行综合.综合的目的是在于将设计的源文件由语言转换为实际的电路.但是此时还没有在芯片中形成真正的电路.这一步的最终目的是生成门电路级的网表(Netlist).4、布局、布线将第3步生成的网表文件调入PLD厂家提供的软件中进行布线,即把设计好的逻辑安放到CPLDFPGA内.这一步的目的是生成用于下载(编程Programming)的编程文件.在这一步,将用到第3步生成的网表,并根据CPLDFPGA厂商的器件容量,结构等进行布局、布线.这就好像在设计PCB时的布局布线一样.先将各个设计中的门根据网表的内容和器件的结构放在器件的特定部位.然后,在根据网表中提供的各门的连接,把各个门的输入输出连接起来.最后,生成一个供编程的文件.这一步同时还会加一些时序信息(Timing)到你的设计项目中去,以便于你做后仿真.5、后仿真利用在布局布线中获得的精确参数,用仿真软件验证电路的时序.(也叫布局布线仿真或时序仿真).这一步主要是为了确定你的设计在经过布局布线之后,是不是还满足你的设计要求.6、编程,下载如果前几步都没有发生错误,并且符合设计要求,这一步就可以将由适配器等产生的配置或下载文件通过编程器或下载电缆下载到目标芯片中.7、硬件测试硬件测试的目的是为了在更真实的环境中检验HDL设计的运行情况,特别是对于HDL程序设计上不是十分规范,语义上含有一定歧义的程序.1.2.3 实验板使用芯片XC3S200A介绍本实验设计中采用的是Xilinx公司的ETL-001 FPGA开发板进行开发设计,该开发板所提供的主芯片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时钟信号.设计程序如下:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_arith.ALL;use IEEE.STD_LOGIC_unsigned.ALL;entity fdiv is Port ( clkin : in STD_LOGIC; c1000 : out STD_LOGIC; c100 : out STD_LOGIC);end fdiv;architecture Behavioral of fdiv issignal c1000_temp:integer range 0 to 23999:=0;signal c100_temp:integer range 0 to 239999:=0;signal fd1000,fd100:STD_LOGIC:=0;begin process (clkin) is begin if rising_edge(clkin) then if c1000_temp=23999 then c1000_temp=0;fd1000= not fd1000;else c1000_temp=c1000_temp+1; end if;end if;end process;c1000 =fd1000;process (clkin) isbegin if rising_edge(clkin) then if c100_temp=239999 then c100_temp=0;fd100= not fd100; else c100_temp=c100_temp+1; end if; end if;end process;c100 =fd100;end Behavioral;仿真波形图4如下图4分频器仿真波形由仿真波形可知,分频器的设计是符合预期期望的,当产生输入晶振信号时,经过分频器内部处理的信号最终产生两个输出信号,分别是1KHz和100Hz,由波形图可以看出,当时钟信号计数24000个脉冲时,1KZ的波形翻转一次,从而产生1KZ的信号;同理,100Hz的信号也符合预期设计.3.1.2按键消抖由于实验板上的按键,在按下和松开的短暂时间里,会出现抖动现象,这样会严重影响按键的效果,故此需要设计一个消抖电路,来消除这种不利的影响,按键消抖电路不仅可以消除按键抖动的影响,而且每按一次键,只输出一个脉冲,其宽度为一个时钟周期,达到整形的作用, 按键消抖电路是利用时间基准信号对按键按下时产生的抖动进行整形,使其输出为正常的脉冲信号的.消抖设计框图5如下:图5消抖模块设计原理图程序设计如下:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_unsigned.ALL;use IEEE.STD_LOGIC_arith.ALL;entity XD is Port ( clk1k : in STD_LOGIC; keyin : in STD_LOGIC; keyout : out STD_LOGIC);end XD;architecture Behavioral of XD issignal key1,key2:std_logic;signal count:integer range 1 to 3:=1beginprocess(clk1k,keyin) begin if clk1kevent and clk1k=1 then if count=3 then key1=1; else key1=0; count=count+1; end if; key2=key1;end if; if keyin=0 then count=1; end if; end process; keyout=(not key1) and key2;end Behavioral;仿真波形图6如下: 在按键按下的一个周期内,消抖模块输出仅有一个时钟周期,抑制了按键按下状态不稳的情况。3.1.3计数器十进制计数器是每当计数从1记到9时,下一位产生一个进位信号,进而输入到下一个计数器的时钟输入端,进而达到秒表所要求的计数进制.计数器是在时钟基准信号的情况下,分频为我们需要的计时时间信号,电子秒表的最低位为0.01秒,即需要100Hz的脉冲,当最低一位计数满9时,向前进1,同时自身为0,重复循环.本设计中采用的是异步计时器,当上一位计数到9时,产生时钟进位,下一时钟在进位成立时,开始计时加1,以此内推,最终输出6组,计时信号,分别是0.01秒位,0.1秒位,秒个位,秒十位,分个位,分十位.当计数到5959 59时计数清零为0000 00 重复计时.数字跑表需要用六位七段数码管显示,数码管显示数字分别用2个6进制计数器和4个10进制计数器对其计数,从秒表显示的右侧到左侧计数器分别为十进制、十进制、十进制、六进制、十进制、六进制、十进制计数器,如图7所示: 图7 数码管显示示意图计数器的设计图如下:10进制计数器的框图如下:图8 10进制计数器的框图6进制计数器的框图如下:图9 6进制计数器的框图相应程序设计如下:10进制程序设计如下:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_arith.ALL;use IEEE.STD_LOGIC_unsigned.ALL;entity count101 is Port ( rst : in STD_LOGIC; clk : in STD_LOGIC; carryin : in STD_LOGIC; carryout : out STD_LOGIC; countout : out STD_LOGIC_VECTOR (3 downto 0);end count101;architecture Behavioral of count101 issignal count:STD_LOGIC_VECTOR (3 downto 0):=0000;begin process(clk,rst) begin if rst=1 then count=0000; else if rising_edge (clk) then if carryin=1 then if count1001 then count=count+1;else count=0000;end if;end if;else null;end if;end if;end process;countout=count;carryout=1 when carryin=1 and count=1001 else 0;end Behavioral;6进制程序设计如下:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_arith.ALL;use IEEE.STD_LOGIC_unsigned.ALL;entity count6 is Port ( rst : in STD_LOGIC; clk : in STD_LOGIC; carryin : in STD_LOGIC; carryout : out STD_LOGIC; countout : out STD_LOGIC_VECTOR (3 downto 0);end count6;architecture Behavioral of count6 issignal count:STD_LOGIC_VECTOR (3 downto 0):=0000;begin process(clk,rst) begin if rst=1 then count=0000; else if rising_edge (clk) then if carryin=1 then if count0101 then count=count+1;else count=0000;end if;end if;else null;end if;end if;end process;countout=count;carryout=1 when carryin=1 and count=0101 else 0;end Behavioral;仿真波形如下图:10进制的仿真波形如下:图10 10进制计数器仿真图形由图可见,设计模块对波形个数计数,从产生结果为2进制的4位数.从0000到1001,结果正确.6进制的仿真波形如下:图11 6进制计数器的仿真波形有图可知,6进制计数器设计正确,脉冲时钟上升沿到来时计数器开始计数,从0000到1001,然后重复循环.3.1.4 寄存器数据锁存器,在使能为1时,将当前数据送到寄存器中保存,可记录4组数据,当再次使能时,将寄存的数据赋给输出,显示寄存器中的4组数据.设计框图如下图:图12 寄存器设计框图寄存器程序设计如下:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;use IEEE.STD_LOGIC_ARITH.ALL;entity save2 is Port ( lacthin : in STD_LOGIC; reset : in STD_LOGIC; mhin : in STD_LOGIC_VECTOR (3 downto 0); mlin : in STD_LOGIC_VECTOR (3 downto 0); shin : in STD_LOGIC_VECTOR (3 downto 0); slin : in STD_LOGIC_VECTOR (3 downto 0); dsin : in STD_LOGIC_VECTOR (3 downto 0); csin : in STD_LOGIC_VECTOR (3 downto 0); mhout : out STD_LOGIC_VECTOR (3 downto 0); mlout : out STD_LOGIC_VECTOR (3 downto 0); shout : out STD_LOGIC_VECTOR (3 downto 0); slout : out STD_LOGIC_VECTOR (3 downto 0); dsout : out STD_LOGIC_VECTOR (3 downto 0); csout : out STD_LOGIC_VECTOR (3 downto 0);end save2;architecture Behavioral of save2 issignal mh1out,ml1out,sh1out,sl1out,ds1out,cs1out:std_logic_vector(3 downto 0);signal mh2out,ml2out,sh2out,sl2out,ds2out,cs2out:std_logic_vector(3 downto 0);signal mh3out,ml3out,sh3out,sl3out,ds3out,cs3out:std_logic_vector(3 downto 0);signal mh4out,ml4out,sh4out,sl4out,ds4out,cs4out:std_logic_vector(3 downto 0);signal mh11out,ml11out,sh11out,sl11out,ds11out,cs11out:std_logic_vector(3 downto 0);signal count:std_logic_vector(3 downto 0):=0000;beginprocess(lacthin,reset) begin if reset=1 then count=0000; elsif lacthinevent and lacthin=1 then if count=1000 then count=0000; else count mh1out=mhin;ml1out=mlin;sh1out=shin;sl1out=slin;ds1out=dsin;cs1out=csin; mh11out=mhin;ml11out=mlin;sh11out=shin;sl11out=slin;ds11out=dsin;cs11out mh2out=mhin;ml2out=mlin;sh2out=shin;sl2out=slin;ds2out=dsin;cs2out=csin; mh11out=mhin;ml11out=mlin;sh11out=shin;sl11out=slin;ds11out=dsin;cs11out mh3out=mhin;ml3out=mlin;sh3out=shin;sl3out=slin;ds3out=dsin;cs3out=csin; mh11out=mhin;ml11out=mlin;sh11out=shin;sl11out=slin;ds11out=dsin;cs11out mh4out=mhin;ml4out=mlin;sh4out=shin;sl4out=slin;ds4out=dsin;cs4out=csin; mh11out=mhin;ml11out=mlin;sh11out=shin;sl11out=slin;ds11out=dsin;cs11outmh11out=mhin;ml11out=mlin;sh11out=shin;sl11out=slin;ds11out=dsin;cs11out mh11out=mh1out;ml11out=ml1out;sh11out=sh1out;sl11out=sl1out;ds11out=ds1out;cs11out mh11out=mh2out;ml11out=ml2out;sh11out=sh2out;sl11out=sl2out;ds11out=ds2out;cs11out mh11out=mh3out;ml11out=ml3out;sh11out=sh3out;sl11out=sl3out;ds11out=ds3out;cs11out mh11out=mh4out;ml11out=ml4out;sh11out=sh4out;sl11out=sl4out;ds11out=ds4out;cs11out mh11out=mhin;ml11out=mlin;sh11out=shin;sl11out=slin;ds11out=dsin;cs11out=csin; end case;end process;mhout=mh11out;mlout=ml11out;shout=sh11out;slout=sl11out;dsout=ds11out;csout=cs11out;end Behavioral;寄存器仿真波形图如下:由图,在按键脉冲上升沿来到之前,输入直接输出,程序只进行了对数据的存储功能(由于截图大小在报告中显示范围的有限,只记录第4次按键及之后的图形),当第五次,按下latchin时,输出为第一次按键时的输入值,按第6次时,输出为第二次记录时的输入值.依次类推,当第8次按键以后,再按第9次,程序又重复循环.图13 寄存器仿真波形图3.1.5显示控制模块实验板上设计了8位7段数码显示,以便编程者将基本的数字信息通过数码管显示出来,原理图如下:图15显示控制原理图在控制电路部分,使用了一组PNP三极管(Q1Q8)将正极的控制电平由高电平转为低电平,这样数码管的位数和段位的控制都统一成了低电平有效.在位数控制部分加入了3-8译码器以简化位数编码,用DIG接口的二进制数据000111直接表示数码管第一位到第八位的位选信号.利用动态扫描原理和设计要求,显示控制模块包含一个六选一数据器、三八译码器和七段译码器.六进制计数器通过cnt依次加1来控制使每次只将一路输入数据赋给输出,六选一数据选择器利用cnt的依次加1来轮番从低位至高位选择输入口,三八译码器根据cnt的值判断选择输入端,以完成显示的位选.用case语句来决定当输入口决定以后,输入口的数据要显示为具体多少数值.此步骤对照数码管的段选来完成. 原理框图的设计如下所示:图16 显示控制模块框图具体程序设计如下:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_arith.ALL;use IEEE.STD_LOGIC_unsigned.ALL;entity contro is Port ( clk : in STD_LOGIC; mh : in STD_LOGIC_VECTOR (3 downto 0); ml : in STD_LOGIC_VECTOR (3 downto 0); sh : in STD_LOGIC_VECTOR (3 downto 0); sl : in STD_LOGIC_VECTOR (3 downto 0); ds : in STD_LOGIC_VECTOR (3 downto 0); cs : in STD_LOGIC_VECTOR (3 downto 0); sel : out STD_LOGIC_VECTOR (7 downto 0); led7 : out STD_LOGIC_VECTOR (6 downto 0);end contro;architecture Behavioral of contro issignal cnt:STD_LOGIC_VECTOR (2 downto 0):=000;signal data:STD_LOGIC_VECTOR (3 downto 0);begin -scan choose 1 from 6 process(clk) begin if rising_edge (clk) then if cnt=101 then cnt=000;else cntdata=cs;seldata=ds;seldata=sl;seldata=sh;seldata=ml;seldata=mh;selnull;end case;end process;-led7:to decide the numberprocess(data)begin led7 led7 led7 led7 led7 led7 led7 led7 led7 led7 led7 null; end case;end process;end Behavioral;根据设计所做仿真如图:图17 显示控制模块仿真波形图 根据仿真波形,随着计数脉冲个数的逐次递加,38译码器将数据输入端选择出来,实现对数码管的位选,7段译码器对应相应的数字,即段选信号,从而使显示控制模块同时实现了位选与段选的功能.3.1.6使能模块使能模块的主要功能是产生计数器的使能控制信号.在输入信号的作用下,输出信号发生翻转.根据系统设计要求,设置开始计时/停止计时按键,该按键每按一次,跑表开始或停止计时,再按一次,停止或开始计时.该模块的设计原理框图如下所示:图18 使能原理设计框图其设计程序如下所示:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_arith.ALL;use IEEE.STD_LOGIC_unsigned.ALL;entity en is Port ( k : in STD_LOGIC; e : out STD_LOGIC);end en;architecture Behavioral of en issignal e1:STD_LOGIC;begin process(k) begin if rising_edge(k) then e1=not e1; end if;end process; e=e1;end Behavioral;根据设计所做仿真如下:图19 使能模块仿真图由仿真图可见,每当按键一次,在上升沿来到时,输出信号波形图翻转一次,实现每按键一次,使能信号变化一次.四、设计实现4.1顶层设计 在ise软件中,可以采用原理图的输入方式完成电路的设计.分单元设计好每个模块以后,通过电路图将各个部分连接到一起,实现顶层设计,顶层设计系统图如下:图20 系统顶层设计图4.2 管脚分配和下载实现 管脚分配图示在系统设计图中可以看出,管脚分配的具体命令交由ucf文件实现,具体命令如下:NET clk LOC = N9;NET enable LOC = H7;NET led LOC = C7;NET number0 LOC = A9;NET number1 LOC = B10;NET number2 LOC = A10;NET number3 LOC = C10;NET number4 LOC = C11;NET number5 LOC = A11;NET number6 LOC = B12;NET pianxuan0 LOC = J13;NET pianxuan1 LOC = J12;NET pianxuan2 LOC = H13;NET pianxuan3 LOC = G13;NET pianxuan4 LOC = N13;NET pianxuan5 LOC = M13;NET pianxuan6 LOC = L13;NET pianxuan7 LOC = K13;NET rst LOC = E9;#NET number5 IOSTANDARD = LVCMOS25;# PlanAhead Generated physical constraints NET savekey LOC = F7; 管脚分配好以后,选中适配好的下载源文件,生成bit文件供下载.4.3测试结果及结论测试结果以图片形式展示:首先是开始及复位,功能正常.key2开始/停止计数,key4复位:图21 循环计数然后实现4组寄存的功能:首先记下按键key6按键记下4组数据,然后计数不停止,知道想要回看数据,再按下key6,每按一次,回看一组数据.依次在2秒,4秒,6秒,8秒左右记录下数据,下图是回看组图:图22 2秒左右寄存的数据图23 4秒左右寄存的数据图24 6秒左右寄存的数据图25 8秒左右寄存的数据五、经验及收获本次实验实现了秒表的计数,复位,暂停,四组寄存等功能,让我们充分了解和认识到ISE和Modelsim软件的强大功能和FPGA技术的优越性.并对软件开发产生了兴趣.仿真和下载实现是两个不同的检验,仿真从软件内部来检验程序的合理性和正确性,准确性较高而下载实现是从外部来观察程序的实现效果,更直观,但不具有准确性.通过程序设计以及整个测试下载过程,完成了利用XILINX-ISE实现基于FPGA的数字跑表的实验任务,完成了设计目标.在此过程中熟悉了XILINX-ISE软件的使用方法,对硬件VHDL语言有了一定的了解,并且体会到了其贴近硬件的特性;对FPGA开发板有了初步的认知,明白了FPGA是一种具有掩膜可编程门阵列的通用结构,它由逻辑功能块排成阵列,并由可编程的互连资源连接这些逻辑功能块来实现不同的设计.为进一步学习打下了基础.通过对电子秒表和VHDL语言的的设计以及xilinx ise软件应用的学习,让我明白了很多东西.在实验室写程序的时候遇到了很多问题,和同学们一起讨论解决,开拓了自己的眼界.这次实验课收获很大.
展开阅读全文