FPGA秒表
- 格式:docx
- 大小:1.44 MB
- 文档页数:33
此文档下载后即可编辑目录1.秒表设计要求 (1)2.设计思路 (1)2.1功能模块 (1)2.1.1分频器 (1)2.1.2计数器 (1)2.1.3数据锁存器 (2)2.1.4控制器 (2)2.1.5扫描显示的控制电路 (2)2.1.6显示电路 (3)2.1.7按键消抖电路 (3)3.电路实现 (4)4.程序仿真 (13)4.1分频器 (13)4.1.1计数器电路综合 (15)4.1.2计数器电路仿真 (15)4.2同步计数器 (17)4.2.1计数器实现 (17)4.2.2计数器仿真 (20)4.2.3同步计数器电路综合 (22)4.3按键消抖电路 (23)4.3.1按键消抖电路实现 (23)4.3.2按键消抖电路仿真 (24)4.3.3按键消抖电路综合 (26)4.4八段译码器 (27)4.4.1八段译码器实现 (27)4.4.2八段译码器仿真 (28)4.4.3八段译码器电路综合 (28)4.5控制器 (30)4.5.1控制器 (30)4.5.1控制器仿真 (31)4.5.3控制器电路综合 (33)5.2View Technology Schematic : (34)5.3管脚锁定: (35)6.实验结论 (35)1.秒表设计要求(1)秒表的计时范围为00:00:00 ~ 59:59:99。
(2)两个按钮开关Start/Stop和Split/Reset,控制秒表的启动、停止、分段和复位:在秒表已经被复位的情况下,按下“Start/Stop”键,秒表开始计时。
在秒表正常运行的情况下,如果按下“Start/Stop”键,则秒表暂停计时;再次按下该键,秒表继续计时。
在秒表正常运行的情况下,如果按下“Split/Reset”键,显示停止在按键时的时间,但秒表仍然在计时;再次按下该键,秒表恢复正常显示。
在秒表暂停计时的情况下,按下“Split/Reset”键,秒表复位归零。
2.设计思路2.1功能模块2.1.1分频器对晶体振荡器产生的时钟信号进行分频,产生时间基准信号2.1.2计数器对时间基准脉冲进行计数,完成计时功能2.1.3数据锁存器锁存数据使显示保持暂停2.1.4控制器通过产生锁存器的使能信号来控制计数器的运行、停止以及复位设计分析:2.1.5扫描显示的控制电路包括扫描计数器、数据选择器和7段译码器,控制8个数码管以扫描方式显示计时结果,原理图如下:实验电路板上的按键2.1.6显示电路2.1.7按键消抖电路消除按键输入信号抖动的影响,输出单脉冲按键按下时,FPGA 的输入为低电平;松开按键时,FPGA 的输入为高电平但是在按下按键和松开按键的瞬间会出现抖动现象2.2电路框图3.电路实现 ---------------------------------------------------------------------------------- 实验板上的数码管为共阳LED数码管-- Company:-- Engineer:---- Create Date: 09:08:39 03/12/2011-- Design Name:-- Module Name: stopwatch_1 - Behavioral-- Project Name:-- Target Devices:-- Tool versions:-- Description:---- Dependencies:---- Revision:-- Revision 0.01 - File Created-- Additional Comments:------------------------------------------------------------------------------------ library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity stopwatch_1 isPort (Clk : in STD_LOGIC;start_stop : in STD_LOGIC;split_reset : in STD_LOGIC;ncs : out STD_LOGIC;s : out STD_LOGIC_VECTOR(2 downto 0);seg : out STD_LOGIC_VECTOR (7 downto 0) );end stopwatch_1;architecture Behavioral of stopwatch_1 issignal k1,k2,k3,k4: STD_LOGIC;signal cnt_1,cnt_2 : STD_LOGIC_VECTOR(1 downto 0);signal start_stop_out,split_reset_out: STD_LOGIC;signal count: STD_LOGIC_VECTOR(15 downto0):=(others=>'0');signal clk_1k: STD_LOGIC;signal z0,z1,z2,z3,z4,z5,z6,q1,q2,q3,q4,q5,q6 :STD_LOGIC_VECTOR(3 downto 0):=(others=>'0');signal count_2: STD_LOGIC_VECTOR(2 downto0 ):=(others=>'0');signal in_7: STD_LOGIC_VECTOR(3 downto 0);signal sreg: STD_LOGIC_VECTOR(2 downto 0):="111";signal snext: STD_LOGIC_VECTOR(2 downto 0);Begin---------------------------------------------------------为三八译码器置入使能信号ncs <= '0';---------------------------------------------------------分频电路process(clk)beginif rising_edge(clk) thenif count = 47999 thencount <=(others=>'0');elsecount <= count+1;end if;end if;end process;clk_1k <= count(15);---------------------------------------------------------同步计数电路process(clk_1k,sreg(2))beginif rising_edge(clk_1k) thenif sreg(2) = '1' thenz0<=(others=>'0');z1<=(others=>'0');z2<=(others=>'0');z3<=(others=>'0');z4<=(others=>'0');z5<=(others=>'0');z6<=(others=>'0');elsif sreg(1) = '1' thenz0 <= z0+1;if z0 = 9 thenz0 <=(others=>'0');z1 <= z1+1;if z1 = 9 thenz1 <=(others=>'0');z2 <= z2+1;if z2 = 9 thenz2 <=(others=>'0');z3 <= z3+1;if z3 = 9 thenz3 <= (others=>'0');z4 <= z4+1;if z4 = 5 thenz4 <= (others=>'0');z5 <= z5+1;if z5 = 9 thenz5 <= (others=>'0');z6 <= z6+1;if z6 = 5 thenz6 <= (others=>'0');end if;end if;end if;end if;end if;end if;end if;end if;end if;end process;---------------------------------------------------------扫描计数器process(clk_1k)beginif rising_edge(clk_1k) thencount_2 <= count_2+1;end if;end process;s <= count_2;---------------------------------------------------------锁存器process(sreg(0),z1,z2,z3,z4,z5,z6)beginif sreg(0) = '1' thenq1 <= z1;q2 <= z2;q3 <= z3;q4 <= z4;q5 <= z5;q6 <= z6;end if;end process;---------------------------------------------------------process(count_2,q1,q2,q3,q4,q5,q6)begincase count_2 iswhen "000" => in_7 <= q1;when "001" => in_7 <= q2;when "011" => in_7 <= q3;when "100" => in_7 <= q4;when "110" => in_7 <= q5;when "111" => in_7 <= q6;when others => in_7 <= "1111";end case;end process;---------------------------------------------------------八段译码器process(in_7)begincase in_7 iswhen "0000" => seg <="00000011";when "0001" => seg <="10011111";when "0010" => seg <="00100101";when "0011" => seg <="00001101";when "0100" => seg <="10011001";when "0101" => seg <="01001001";when "0110" => seg <="01000001";when "0111" => seg <="00011111";when "1000" => seg <="00000001";when "1001" => seg <="00001001";when others => seg <="11111101";end case;end process;---------------------------------------------------------按键去抖电路process(clk_1k,start_stop)beginif clk_1k'event and clk_1k='0' thenif cnt_1 = 3 thenk1 <= '1';elsek1 <= '0';cnt_1 <= cnt_1+1;end if;k2 <= k1;end if;if start_stop = '0' thencnt_1 <= "00";end if;end process;start_stop_out <= not k1 and k2;process(clk_1k,split_reset)beginif clk_1k'event and clk_1k='0' thenif cnt_2 = 3 thenk3 <= '1';elsek3 <= '0';cnt_2 <= cnt_2+1;end if;k4 <= k3;end if;if split_reset = '0' thencnt_2 <= "00";end if;end process;split_reset_out <= not k3 and k4;---------------------------------------------------------控制器process(clk_1k,start_stop_out,split_reset_out)beginif rising_edge(clk_1k) thensreg <= snext;end if;end process;process(start_stop_out,split_reset_out,sreg)begincase sreg iswhen "111" => if start_stop_out = '1' andsplit_reset_out = '0' thensnext <= "011";else snext <= sreg;end if;when "011" => if start_stop_out = '1' andsplit_reset_out = '0' then snext <= "001";elsif start_stop_out = '0' andsplit_reset_out = '1' then snext <= "010";else snext <= sreg;end if;when "001" => if start_stop_out = '0' andsplit_reset_out = '1' then snext <= "111";elsif start_stop_out = '1' andsplit_reset_out = '0' then snext <= "011";else snext <= sreg;end if;when "010" => if start_stop_out = '0' andsplit_reset_out = '1' then snext <= "011";else snext <= sreg;end if;when others => snext <= "111";end case;end process;end Behavioral;注:控制器设计时,巧妙地将状态编码和控制器输出的控制信号编码合二为一,即状态编码也是控制信号编码,使得程序形式上更为简单、清晰。
基于FPGA的秒表实验目的4个七段数码管分别表示十分分十秒秒当SW0为1的时候,暂停计时,进入设置。
按BTN0时秒加1,按BTN1时增加10秒按BTN2时增加1分,按BTN3时增加10分module miaobiao(clk,out,out1,control,btn);//模块名及端口input clk,control,btn;//输入端口声明output out,out1;//输出端口声明wire control;//输入控制信号是wire类型wire [3:0] btn;//四位按键reg [6:0] out1;//定义段选7位寄存器reg [3:0] out;//定义位选4位寄存器reg [31:0] count;//定义一个计数器reg [3:0] sec_l,sec_h,min_l,min_h,out2;//定义存储秒、十秒、分、十分的寄存器,还有显示寄存器供译码用;initial out1 <= 7'b0000001;//给段选赋初值,刚开始时位0000always @(posedge clk)//计数行为语句begincount = count + 1;if ((count==50000000)&&(control==0))//进行分频与控制信号的检测,控制信号为假,继续计数beginsec_l = sec_l +1;count = 0;if(sec_l==10)beginsec_l=0;sec_h = sec_h + 1;if(sec_h == 6)beginsec_h = 0;min_l = min_l + 1;if (min_l==10)beginmin_l = 0;min_h = min_h + 1;if(min_h==6)min_h = 0;endendendendelse if((count==50000000)&&(control==1))//控制信号为真,进入操作模式begincount = 0;if (btn[0]==1)beginsec_l = sec_l + 1;if (sec_l==10)sec_l = 0;endif (btn[1]==1)beginsec_h = sec_h + 1;if (sec_l==6)sec_h = 0;endif (btn[2]==1)beginmin_l = min_l + 1;if (min_l==10)min_l = 0;endif (btn[3]==1)beginmin_h = min_h + 1;if (min_h==6)min_h = 0;endendendalways @(posedge clk)//时钟扫描(动态扫描)行为语句begincase(count[15:14])2'b00:begin out <= 4'b1110; out2 <= sec_l;end//打通第一个管子的时候,把秒寄存器的值给显示寄存器,显示寄存器通过译码转换为段码2'b01:begin out <= 4'b1101; out2 <= sec_h;end2'b10:begin out <= 4'b1011; out2 <= min_l;end2'b11:begin out <= 4'b0111; out2 <= min_h;endendcaseendalways @(posedge clk)//译码行为语句,根据显示寄存器的值,译为2进制代码来赋予电平信号,打通led管begincase(out2)0:out1 <= 7'b0000001;1:out1 <= 7'b1001111;2:out1 <= 7'b0010010; 3:out1 <= 7'b0000110; 4:out1 <= 7'b1001100; 5:out1 <= 7'b0100100; 6:out1 <= 7'b0100000; 7:out1 <= 7'b0001111; 8:out1 <= 7'b0000000; 9:out1 <= 7'b0000100; endcaseendendmodule。
基于FPGA的电子秒表设计摘要简而言之,电子秒表的工作原理就是不断输出连续脉冲给加法计数器,而加法计数器通过译码器来显示它所记忆的脉冲周期个数。
电子秒表是日常生活中比较常见的电子产品。
本设计秒表的逻辑结构主要由74LS00, 555定时器,RS 触发器,74LS90等器件组成。
使用了基本RS触发器作为电子秒表的开关,基本RS触发器属低电平直接触发的触发器,有直接置位,复位的功能。
整个秒表需有一个清零/ 启动信号和一个停止/保持信号装置,以便秒表能随意停止及启动,计数器的输出全都为BCD码输出,方便显示译码器连接。
本设计基于简单易行的原则,秒表显示以0.01s为最小单位,设计时,按照设计任务的次序,将各单元电路逐个进行接线和调试,即分别测试基本RS触发器、时钟发生器及计数器的逻辑功能,待各单元电路工作正常后,再将有关电路逐级连接起来进行测试……,直到测试电子秒表整个电路的功能。
最后进行总结.做到经典而没有缺憾的设计结果。
关键字:74LS00 555定时器 RS触发器 BCD码目录摘要 (1)一、引言 (3)(一)设计的背景 (3)(二)设计实现的基本功能 (4)(三)设计的结构安排 (4)二、系统硬件设计 (5)(一)总体设计 (5)(二)555定时器简简介 (9)(三)基本RS触发器 (10)(四)功能测试 (12)三、系统软件设计 (14)(一) 设计方案 (14)(二)分频模块 (14)(三)计数模块 (16)(四)启停控制模块 (17)(五)显示控制模块 (18)(六)编译仿真 (19)参考文献 (22)致谢 (23)一、引言(一)设计的背景秒表计时器是电器制造,工业自动化控制、国防、实验室及科研单位理想的计时仪器,他广泛应用于各种继电器、电磁开关、控制器、延时器、定时器等的时间测试。
有关电子秒表的发展历史,大致可以分为三个演变阶段。
1、从大型钟向小型钟演变。
2、从小型钟向袋表过度。
3、从袋表向腕表发展。
fpga秒表设计实验报告本次实验是基于FPGA设计的秒表。
秒表主要是用来计时的一种仪器,具有精准度高、显示清晰等优点。
在实验中,我们使用FPGA来实现秒表的设计。
1. 实验目的通过本次实验,我们的目的是掌握FPGA的使用方法,并设计出一个能够精准计时的秒表。
同时,也能够加深理解数字电路的基本原理和数字信号的处理方式。
2. 实验原理秒表的原理很简单,在起点按下计时键后,秒表开始计时,时间会显示在数码管或LCD屏幕上。
在终点按下停止键后,秒表停止计时。
我们需要用数字电路来实现这个过程,分为三个部分。
2.1. 时钟模块时钟模块是秒表实现的基础。
我们可以使用FPGA内置的时钟控制器IP,也可以自己实现时钟模块。
在这个实验中,我们使用了FPGA内置的时钟控制器IP。
2.2. 计时模块计时模块是实现秒表的关键。
我们可以使用FPGA内置的计数器IP,也可以自己实现计数器模块。
在这个实验中,我们使用了FPGA内置的计数器模块。
2.3. 显示模块显示模块用来显示计时结果。
我们可以使用数码管或LCD屏幕来显示计时结果。
在这个实验中,我们使用了数码管来显示计时结果。
3. 实验步骤3.1. 创建工程首先,我们需要在Vivado IDE中创建一个FPGA工程。
在创建工程时,需要选择适当的设备型号、板卡等参数。
3.2. 添加时钟控制器IP在Vivado IDE中,选择IP Catalog,搜索并添加时钟控制器IP。
3.3. 添加计数器IP在Vivado IDE中,选择IP Catalog,搜索并添加计数器IP。
3.4. 添加数码管IP在Vivado IDE中,选择IP Catalog,搜索并添加数码管IP。
3.5. 连接IP在Vivado IDE中,将时钟控制器IP、计数器IP和数码管IP进行连接。
3.6. 程序设计使用Vivado IDE中的HDL语言对秒表进行程序设计。
3.7. 烧录程序将程序烧录到FPGA中,实现秒表功能。
基于FPGA的数字式秒表一、设计任务及要求秒表由于其计时精确,分辨率高(0.01 秒),在各种竞技场所得到了广泛的应用,本次设计的任务就是设计一个基于FPGA 的数字式秒表。
1、基本要求:(1)性能指标:秒表的分辨率为0.01 秒,最长计时时间为99.99 秒;(2)设置启/停开关和复位开关(计数控制器):启/停开关S1 的使用方法与传统的机械计时器相同,即按一下启/停开关,启动计时器开始计时,再按一下启/停开关计时终止。
复位开关S2 用来使计时器清0,复位开关可以在任何情况下使用,即使在计时过程中,只要按一下复位开关,计时进程应立即终止,并对计时器清零。
(开关按下为0,弹起为1)。
(3)秒表的计时基准信号:以周期为0.01 秒(频率100HZ)的计时脉冲作为一个比较精准的计时基准信号输入到0.01 秒位计数器的时钟端;在设计中采用分频器把1000HZ 的时钟信号转换为100HZ 的计时基准信号,其分频系数为10。
(4)数码管动态显示:七段数码管采用动态扫描的方式显示,扫描需要一个比较高频率的信号,本次设计选用1000HZ 。
为了得到1000Hz 信号,必须对输入的时钟信号50MHZ 进行分频。
显示模块共用11 个管脚,其中8 个用于连接8 个数码管的七段LED,还有 3 个管脚用于选择点亮哪个数码管,每隔很短的一段时间8 个数码管交替点亮,依次循环,动态显示,由于人眼的视觉残留,可以观察到连续的测量计数器的计数值。
上电后,八个数码管中左边四个显示自己的学号后四位,在运行过程中一直不变;右边四个显示计时时间,范围0000~9999,利用两个按钮S1、S2 控制计时。
2、提高要求:加入小数点,计时数码管显示范围00.00~99.99。
二、系统原理框图三、电路实现Array四、功能模块1、分频器(以10分频器为例)(1)Verilog HDL语言程序module fp10(Clk,Out);input Clk;output Out;reg Out;reg [3:0] Cout;reg Clk_En;initialOut<=0;always @(posedge Clk )beginCout <= (Cout == 4'd10) ? 4'd0 : (Cout + 4'd1);Clk_En <= (Cout >= 4'd5) ? 1'd1 : 1'd0;Out<=Clk_En;endEndmodule(2)模块化电路(3)波形仿真由波形仿真图可以看出,10分频器将1000Hz的脉冲分频成100Hz的脉冲。
课程设计报告专业班级课程题目秒表的设计学号姓名同组人成绩2013年5月一、设计目的1.进一步熟悉七段码译码器的硬件接口。
2.掌握用扫描方法驱动多个数码管硬件接口。
3.掌握秒表VHDL的编程方法。
二、系统总体设计(1).设计要求:1.秒表共有6个输出显示,分别为百分之一秒、十分之一秒、秒、十秒、分、十分,所以共有6个计数器与之相对应,6个计数器的输出全都为BCD码输出,这样便于和显示译码器的连接。
当计时达60分钟后,蜂鸣器鸣响10声。
2.整个秒表还需有一个启动信号和一个归零信号,以便秒表能随意停止及启动。
3.秒表的逻辑结构较简单,它主要由显示译码器、分频器、十进制计数器、六进制计数器和报警器组成。
在整个秒表中最关键的是如何获得一个精确的100HZ 计时脉冲。
(2).实验原理:秒表由于其计时精确,分辨率高(0.01秒),在各种竞技场所得到了广泛的应用。
秒表的工作原理与数字时基本相同,唯一不同的是秒表的计时时钟信号,由于其分辨率为0.01秒,所以整个秒表的工作时钟是在100Hz的时钟信号下完成。
当秒表的计时小于1个小时时,显示的格式是mm-ss-xx(mm表示分钟:0~59;ss 表示秒:0~59;xx表示百分之一秒:0~99),当秒表的计时大于或等于一个小时时,显示的和多功能时钟是一样的,就是hh-mm-ss(hh表示小时:0~99),由于秒表的功能和钟表有所不同,所以秒表的hh表示的范围不是0~23,而是0~99,这也是和多功能时钟不一样的地方。
在设计秒表的时候,时钟的选择为100Hz。
变量的选择:因为xx(0.01秒)和hh(小时)表示的范围都是0~99,所以用两个4位二进制码(BCD码)表示;而ss(秒钟)和mm(分钟)表示的范围是0~59,所以用一个3位的二进制码和一个4位的二进制码(BCD)码表示。
显示的时候要注意的问题就是小时的判断,如果小时是00,则显示格式为mm-ss-xx,如果小时不为00,则显示hh-mm-ss。
现代电子技术综合实验一、性能指标(1) 秒表计时范围为:1小时;(2) 秒表精度为0.01秒;(3) 具有开始计时、停止计时控制功能,且开始计时、停止计时为一个复用按键;(4) 在正常计时显示过程中,能够在存储按键作用下存储某一计时时间;存储的时间组数为确定值或1至任意值;(5) 在读取按键作用下存储的时间能够回放显示;回放显示可手动或自动依次显示;(6) 具有复位功能;(7) 用六位数码管显示时间读数。
二、任务要求(1)完成系统方案总体设计(2)利用硬件描述语言完成控制电路的设计、仿真(3)利用开发板完成系统的硬件实现(4)进行系统调试及功能测试(5)撰写设计报告三、系统组成u 计数器单级计数器四、单元电路设计signal count: std_logic_vector(3 downto 0):="0000"; process(rst,clk) begin if rst='1' then count <= "0000"; carry_out <= '0'; elsif clk'event and clk= '1' then if carry_in = '1' then if count= "1001" then count <= "0000"; carry_out <= '1'; else count <= count+1; carry_out <= '0'; end if; end if; end if;end process; count_out<=count; 功能:对频率100Hz 的信号进行计数,计数最大值为 595999。
clk:时钟信号输入rst:复位输入端carry_in:使能端count_out(3:0):计数输出端carry_out:进位输出端主要语句:同步级联原理图:有缘学习更多+谓ygd3076或关注桃报:奉献教育(店铺异步级联原理图:u分频器功能:将系统时钟分频后,为计时模块和显示模块提供工作时钟;clk:48MHz系统时钟信号输入端clkout1k:频率1KHz信号输出端clkout100:频率100Hz信号输出端123 4512 3 4 5 1 2clk_inclk_out 10个 主要语句: if clkin'event and clkin = '1' then if cnt = 5 then cnt <= 1; clkout <=not clkout; else cnt <= cnt + 1; end if; end if;分频器实现原理:基于计数器方法实现例有缘学习更多+谓ygd3076或关注桃报:奉献教育(店铺u 使能控制e_tmp <=not e_tmp;主要语句: 功能: 在输入信号的作用下,输出信号发生翻转,产生控制计数器的使能控制信号。
数字秒表设计
一、实验目的
1、理解计时器的原理与V erilog/VHDL的编程方法;
2、掌握多模块设计及层次设计的方法。
二、实验原理
秒计时器是由计数器和译码器、显示器组成,其核心是计数器与译码器。
60 秒计时器可由二个计数器分别完成:个位为十进制计数器,十位为6 进
制计数。
个位计数器的计数信号由实验开发板上主频20MHZ分频产生的1Hz
时钟信号提供, 十位计数器的计数信号由个位的进位信号提供。
然后由译码器
对计数结果进行译码,送LED 数码管进行显示。
Clr为清零,se t为开始。
三、实验框图
图2-1
四、实验任务
1、采用层次设计的方法,设计一个包括顶层及底层模块的60 秒计时器,底
层模块用Verilog/VHDL设计(或者选用原理图输入法中宏功能元件),顶层用原理图设计。
2、秒计时器应当具有系统复位功能;
3、每十秒发出提示信号及计满60 秒时发出报警信号。
(选做)
名
原
理
图
五、实验步骤
1.创建工程
2.选择目标器件
3.编写verilog hdl 程序
4.编译
5.生成符号文件
6.创建编辑原理图
7.设置顶层文件
8.编译
9.创建编辑波形图文件
10.使用波形图仿真
11.锁定管脚 12.编译 13.下载至芯片
六、实验结果
1.编译结果
名
仿
真
结
果
名
仿
真
结
果
文COUNT60.v (为了简便将分频器设置2分频的)。
基于FPGA的数字秒表设计硬件平台:DE2-115软件环境:Quartus II 15.1采样了较为简单的计数⽅法,详细代码就不讲解了,分为三个模块,⼀个是计数模块 count.v,⼀个是显⽰模块 disp.v,还有⼀个是顶层模块miaobiao.v。
有清零按键和暂停拨码开关。
顶层模块:1module miaobiao(2 clk,3 rst_n,4 pause,56 Hex0,7 Hex1,8 Hex2,9 Hex3,10 Hex4,11 Hex5,12 );1314input clk;15input rst_n;16input pause;1718output[6:0] Hex0;19output[6:0] Hex1;20output[6:0] Hex2;21output[6:0] Hex3;22output[6:0] Hex4;23output[6:0] Hex5;2425wire[3:0]h_sec_h;26wire[3:0]h_sec_l;2728wire[3:0]sec_h;29wire[3:0]sec_l;3031wire[3:0]fen_h;32wire[3:0]fen_l;3334 count u0(35 .clk(clk),36 .rst_n(rst_n),37 .pause(pause),3839 .h_sec_h(h_sec_h),40 .h_sec_l(h_sec_l),4142 .sec_h(sec_h),43 .sec_l(sec_l),4445 .fen_h(fen_h),46 .fen_l(fen_l)47 );4849 disp u1(5051 .h_sec_l(h_sec_l),52 .h_sec_h(h_sec_h),5354 .sec_l(sec_l),55 .sec_h(sec_h),5657 .fen_l(fen_l),58 .fen_h(fen_h),5960 .Hex0(Hex0),61 .Hex1(Hex1),62 .Hex2(Hex2),63 .Hex3(Hex3),64 .Hex4(Hex4),65 .Hex5(Hex5)66 );6768endmodulemiaobiao.v计数模块:1module count(2 clk,3 rst_n,4 pause,56 h_sec_h,7 h_sec_l,89 sec_h,10 sec_l,1112 fen_h,13 fen_l14 );1516input clk;17input rst_n;18input pause; //pause为0时正常计数,为1时暂停计数 1920output reg[3:0] h_sec_h; //百分秒低位21output reg[3:0] h_sec_l; //百分秒⾼位2223output reg[3:0] sec_h; //秒⾼位24output reg[3:0] sec_l; //秒低位2526output reg[3:0] fen_h; //分低位27output reg[3:0] fen_l; //分⾼位2829reg flag1; //flag1为百分秒向秒的进位30reg flag2; //flag2为秒向分的进位31reg[27:0] cnt; //32reg clk_100hz;3334/* 100hz 分频 */35always@(posedge clk or negedge rst_n)36if(!rst_n)37 cnt <= 28'd0;38else if(cnt == 249999)39 cnt <= 28'd0;40else41 cnt <= cnt + 1'b1;4243always@(posedge clk or negedge rst_n)44if(!rst_n)45 clk_100hz <= 1'b0;46else if(cnt == 249999)47 clk_100hz <= !clk_100hz;48else49 clk_100hz <= clk_100hz;5051/* 百分秒计数进程,每计满100,flag1产⽣⼀个进位 */52always@(posedge clk_100hz or negedge rst_n)53begin54if(!rst_n) begin55 {h_sec_h,h_sec_l} <= 8'h00;56 flag1 <= 1'b0;57end58else if(!pause) begin59if(h_sec_l == 9) begin60 h_sec_l <= 4'd0;61if(h_sec_h == 9) begin62 h_sec_h <= 4'd0;63 flag1 <= 1'b1;64end65else66 h_sec_h <= h_sec_h + 1'b1;67end68else begin69 h_sec_l <= h_sec_l + 1'b1;70 flag1 <= 1'b0;71end72end73end7475/* 秒计数进程,每计满60,flag2产⽣⼀个进位 */ 76always@(posedge flag1 or negedge rst_n)77begin78if(!rst_n) begin79 {sec_h,sec_l} <= 8'h00;80 flag2 <= 0;81end82else if(sec_l == 9) begin83 sec_l <= 4'd0;84if(sec_h == 5) begin85 sec_h <= 4'd0;86 flag2 <= 1'b1;87end88else89 sec_h <= sec_h + 1'b1;90end91else begin92 sec_l <= sec_l + 1'b1;93 flag2 <= 1'b0;94end95end9697/* 分计数进程,每计数满60,系统⾃动清零 */ 98always@(posedge flag2 or negedge rst_n)99begin100if(!rst_n) begin101 {fen_h,fen_l} <= 8'h00;102end103else if(fen_l == 9) begin104 fen_l <= 4'd0;105if(fen_h == 5)106 fen_h <= 4'd0;107else108 fen_h <= fen_h + 1'b1;109end110else111 fen_l <= fen_l + 1'b1;112end113endmodule114115116117118count.v显⽰模块:1module disp(23 h_sec_l,4 h_sec_h,56 sec_l,7 sec_h,89 fen_l,10 fen_h,1112 Hex0,13 Hex1,14 Hex2,15 Hex3,16 Hex4,17 Hex5,18 );1920input[3:0] h_sec_h;21input[3:0] h_sec_l;2223input[3:0] sec_h;24input[3:0] sec_l;2526input[3:0] fen_h;27input[3:0] fen_l;2829output reg[6:0] Hex0;30output reg[6:0] Hex1;31output reg[6:0] Hex2;32output reg[6:0] Hex3;33output reg[6:0] Hex4;34output reg[6:0] Hex5;3536always@(*) //百分秒个位控制37begin38case(h_sec_l)390:Hex0 <= 7'b1000000; //0401:Hex0 <= 7'b1111001; //1412:Hex0 <= 7'b0100100; //2423:Hex0 <= 7'b0110000; //3434:Hex0 <= 7'b0011001; //4445:Hex0 <= 7'b0010010; //5456:Hex0 <= 7'b0000010; //6467:Hex0 <= 7'b1111000; //7478:Hex0 <= 7'b0000000; //8489:Hex0 <= 7'b0010000; //949default:Hex0 <= 7'b1000000; //0 50endcase51end5253always@(*) //百分秒⼗位控制54begin55case(h_sec_h)560:Hex1 <= 7'b1000000; //0571:Hex1 <= 7'b1111001; //1582:Hex1 <= 7'b0100100; //2593:Hex1 <= 7'b0110000; //3604:Hex1 <= 7'b0011001; //4615:Hex1 <= 7'b0010010; //5626:Hex1 <= 7'b0000010; //6637:Hex1 <= 7'b1111000; //7648:Hex1 <= 7'b0000000; //8659:Hex1 <= 7'b0010000; //966default:Hex1 <= 7'b1000000; //0 67endcase68end6970always@(*) //71begin72case(sec_l)730:Hex2 <= 7'b1000000; //0741:Hex2 <= 7'b1111001; //1752:Hex2 <= 7'b0100100; //2763:Hex2 <= 7'b0110000; //3774:Hex2 <= 7'b0011001; //4785:Hex2 <= 7'b0010010; //5796:Hex2 <= 7'b0000010; //6807:Hex2 <= 7'b1111000; //7818:Hex2 <= 7'b0000000; //8829:Hex2 <= 7'b0010000; //983default:Hex2 <= 7'b1000000; //084endcase85end8687always@(*) //88begin89case(sec_h)900:Hex3 <= 7'b1000000; //0911:Hex3 <= 7'b1111001; //1922:Hex3 <= 7'b0100100; //2933:Hex3 <= 7'b0110000; //3944:Hex3 <= 7'b0011001; //4955:Hex3 <= 7'b0010010; //596default:Hex3 <= 7'b1000000; //097endcase98end99100always@(*) //101begin102case(fen_l)1030:Hex4 <= 7'b1000000; //01041:Hex4 <= 7'b1111001; //11052:Hex4 <= 7'b0100100; //21063:Hex4 <= 7'b0110000; //31074:Hex4 <= 7'b0011001; //41085:Hex4 <= 7'b0010010; //51096:Hex4 <= 7'b0000010; //61107:Hex4 <= 7'b1111000; //71118:Hex4 <= 7'b0000000; //81129:Hex4 <= 7'b0010000; //9113default:Hex4 <= 7'b1000000; //0114endcase115end116117always@(*) //118begin119case(fen_h)1200:Hex5 <= 7'b1000000; //01211:Hex5 <= 7'b1111001; //11222:Hex5 <= 7'b0100100; //21233:Hex5 <= 7'b0110000; //31244:Hex5 <= 7'b0011001; //41255:Hex5 <= 7'b0010010; //5126default:Hex5 <= 7'b1000000; //0127endcase128end129130endmoduledisp.v仿真⽤的是Modelsim SE-64 10.4,只对计数模块进⾏了仿真,不是很直观,代码如下:1 `timescale 1ns/1ns2 `define clk_period 203module count_tb;4reg clk;5reg rst_n;6reg pause;7wire[3:0] h_sec_h;8wire[3:0] h_sec_l;9wire[3:0] sec_l;10wire[3:0] sec_h;11wire[3:0] fen_h;12wire[3:0] fen_l;13 count u0(14 .clk(clk),15 .rst_n(rst_n),16 .pause(pause),17 .h_sec_h(h_sec_h),18 .h_sec_l(h_sec_l),19 .sec_h(sec_h),21 .fen_h(fen_h),22 .fen_l(fen_l)23 );2425initial26 clk = 0;27always#(`clk_period/2) clk = ~clk;2829initial30begin31 rst_n = 1'b0;32 #(`clk_period);33 rst_n = 1'b1;34 pause = 1'b1;35 #(`clk_period*5);36 pause = 1'b0;37 #(`clk_period*1000000);38 $stop;39end40endmodulecount_tb.v由于分频为100hz进⾏百分秒计数,Modelsim跑的⽐较慢,所以我将百分秒计数模块,秒计数模块,分计数模块⼀个个单独来进⾏仿真,这样速度较快,容易找到问题,功能上是可以完全实现的。
电子秒表设计学院:专业:学号:学生姓名:指导教师:第一章引言 (3)第二章基于FPGA的VHDL设计流程 (3)2.1VHDL语言介绍 (3)2.1.1 VHDL的特点 (3)2.1.2 基于VHDL的自顶向下设计方法 (5)2.2FPGA开发介绍 (5)2.2.1 FPGA简介 (5)2.2.2 FPGA设计流程 (6)第三章数字秒表单元电路设计与实现 (8)3.1项目任务与设计思路 (8)3.2基于VHDL方法的设计方案 (8)3.3系统电路设计 (9)3.4 系统单元模块设计与仿真........................................93.4.1 分频器.................................................93.4.2 十进制计数器....................................... ....113.4.3六进制计数器...........................................123.4.4 寄存器模块 (14)3.4.5 显示模块 (17)3.4.6 使能模块 (19)3.4.7 按键消抖模块 (20)第四章数字秒表系统设计与实现 (22)4.1 电子跑表顶层设计.......................................224.2 管脚适配...............................................244.3 下载过程........................................................244.4 系统硬件实现与调试......................................25 第五章结束语...................................................275.1 结果分析................................................275.2 总结.....................................................27摘要随着电子信息产业的不断发展,基于FPGA的应用技术发展迅速,在某些领域FPGA正逐步代替dsp、arm、单片机等微处理器。
本文设计一个基于FPGA技术的数字秒表。
首先,我们把晶振产生的48MHZ时钟信号送入FPGA芯片内,经FPGA内分频模块处理产生1KHZ时钟信号。
秒表的功能模块由VHDL语言编写,在Xilinx的ISE环境下调试,并在Modelsim上完成仿真,在最后把产生的信号送入LED显示电路里进行显示。
本文从电子秒表的具体设计触发,详细阐述了基于FPGA的数字秒表的设计方案,设计了各模块的代码,并对硬件电路进行了仿真。
关键词:EDA;ISE;Modelsim仿真;数字秒表设计;FPGA可编程逻辑器件●第一章引言随着电子信息产业的发展,数字系统的规模越来越大,更多采用自顶而下的模块化设计方法,这就要求技术人员对于基本的模块有着深入的理解。
随着FPGA 技术的发展和成熟,用FPGA来做为一个电路系统的控制电路逐渐显示出其无与伦比的优越性。
因此本文采用FPGA来做为电路的控制系统,采用模块化的设计方法设计一个能显示从00-00-00到59-59-99,并且具备秒表所有功能的小型数字系统。
●第二章基于FPGA的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语言将承担起几乎全部的数字系统设计任务。
●2.1VHDL语言介绍●2.1.1VHDL的特点VHDL主要用于描述数字系统的结构、行为、功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式,描述风格以及句法十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称为设计实体(可以是一个元件、一个电路模块或一个系统)分成外部(又称为可视部分,即端口)和内部(又称为不可视部分),即设计实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其它的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
应用VHDL进行工程设计的优点是多方面的,具体如下:1、与其它的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了它成为系统设计领域最佳的硬件描述语言。
强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。
就目前流行的EDA工具和VHDL综合器而言,将基于抽象的行为描述风格的VHDL程序综合成为具体的FPGA和CPLD等目标器件的网表文件已不成问题,只是在综合与优化效率上略有差异。
2、VHDL最初是作为一种仿真标准格式出现的,因此VHDL既是一种硬件电路描述和设计语言,也是一种标准的网表格式,还是一种仿真语言。
其丰富的仿真语句和库函数,使得在任何大系统的设计早期(即尚未完成),就能用于查验设计系统的功能可行性,随时可对设计进行仿真模拟。
即在远离门级的高层次上进行模拟,使设计者对整个工程设计的结构和功能的可行性做出决策。
3、VHDL语句的行为描述能力和程序结构决定了它具有支持大规模设计的分解和已有设计的再利用功能,符合市场所需求的,大规模系统高效、高速的完成必须由多人甚至多个开发组共同并行工作才能实现的特点。
VHDL中设计实体的概念、程序包的概念、设计库的概念为设计的分解和并行工作提供了有力的支持。
4、对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动地把VHDL描述设计转变成为门级网表。
这种方式突破了门级电路设计的瓶颈,极大地减少了电路设计的时间和可能发生的错误,降低了开发成本。
应用EDA工具的逻辑优化功能,可以自动地把一个综合后的设计变成一个更高效、更高速的电路系统。
反过来,设计者还可以容易地从综合和优化后的电路获得设计信息,返回去更新修改VHDL设计描述,使之更为完善。
5、VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。
正因为VHDL硬件描述与具体的工艺技术和硬件结构无关,VHDL设计程序的硬件实现目标器件有广阔的选择范围,其中包括各系列的CPLD、FPGA及各种门阵列实现目标。
6、由于VHDL具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变源程序的条件下,只需要改变端口类属参量或函数,就能轻易地改变设计的规模和结构。
●2.1.2基于VHDL的自顶向下设计方法1、设计说明:用自然语言表达系统项目的功能特点和技术参数等。
2、建立VHDL行为模型,即将设计说明已转化为VHDL行为模型。
建立模型是为了通过VHDL仿真器对整个系统进行系统行为仿真和性能评估。
3、VHDL行为仿真。
这一阶段可以利用VHDL仿真器对顶层系统的行为模型进行仿真测试,检查模拟结果,继而进行修改和完善。
4、VHDL-RTL级建模。
即将VHDL的行为模型表达为VHDL行为代码。
5、前端功能仿真。
即对VHDL-RTL级模型进行仿真,简称功能仿真。
6、逻辑综合。
使用逻辑综合工具将VHDL行为代码描述转化为结构化的门级电路。
7、测试向量生成。
8、功能仿真。
9、结构综合。
10、门级时序仿真。
11、硬件测试。
●2.2FPGA开发介绍● 2.2.1 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 的数据吞吐能力大幅度增强。
2.2.2 FPGA设计流程对于目标器件为FPGA和CPLD的HDL设计,其工程设计的基本流程如图 2-1所示。
现具体说明如下。
图2-1 EDA设计流程1、文本编辑用任何文本编辑器都可以进行,通常VHDL文件保存为vhd文件,Verilog 文件保存为v文件。