基于verilog数字秒表的设计实现精选文档
基于FPGA数字秒表设计(完整资料).doc
此文档下载后即可编辑目录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;注:控制器设计时,巧妙地将状态编码和控制器输出的控制信号编码合二为一,即状态编码也是控制信号编码,使得程序形式上更为简单、清晰。
Verilog秒表设计 精品
课程名称:数字系统设计一、实验目的1、进一步熟悉ISE软件的使用,熟悉FPGA开发流程;2、掌握编写Verilog代码的步骤,学会绘制ASM图;3、学会自顶向下的设计方法,使用不同的模块实现系统的设计。
二、实验设备1、装有ISE软件的PC机一台;2、Nexys3开发板一块。
三、实验内容与要求设计一个秒表它具有计时功能。
此秒表有两个按键(reset, start)按下reset键后,秒表清零。
开始默认秒表计时,按下start键后,停止计时,再次按下start键后,又开始计时,如此反复。
用FPGA开发板上的两个七段数码管显示时间(以秒为单位),计时由0 到 59 循环。
三、实验步骤1、设计系统框图,设计采取自顶向下的设计方案,整个秒表系统的原理图如下所示。
主要包括五个模块——按键消抖模块、分频模块、按键功能控制模块、计数模块、数码管驱动显示模块。
2、根据系统的原理图,画出各个模块的ASM图。
(1)利用D触发器对按键进行消抖处理,其电路图如下。
利用下面这个电路即可实现对start键和reset键的消抖。
只有连续输入三个周期的高电平时,按键才有效。
(2)分频模块的ASM图。
此ASM图将100MHz的信号分频为100Hz的信号,用于计数和数码管的扫描。
(3)start键与reset键功能控制模块的ASM图。
图中rst为复位信号,sta为计时信号。
利用状态机实现不同状态之间的转换并输出复位信号与计时信号。
默认状态是start_time,即计时状态。
(4)计数模块的ASM图。
输入100Hz的时钟用于计数,当复位信号有效时,将所有的数全部置0。
否则sta信号有效时开始计数。
最后输出秒位与十秒位。
(5)数码管驱动模块的ASM图。
使用100Hz的信号扫描数码管,并将对应的数字以十进制形式显示在数码管上。
因为只用到两个数码管,所以前两个数码管置1,即保持不亮,只点亮后两个数码管。
3、根据所绘制各个模块的ASM图和系统的原理图,编写Verilog代码。
用Verilog HDL语言编写的电子秒表
module jian_kong(rest,kon,clk001,clk001out);//开始与暂停按键的控制电路 input rest; input kon; input clk001; output clk001out; wire k; wire d; assign d=~k; assign clk001out=k&clk001; D_FF D_FF0(rest,kon,d,k); endmodule module D_FF(rest,clk,d,q); input rest; input clk; input d; output q; reg q; always@(posedge rest or posedge clk) if(rest==1'b1) begin q<=1'b0; end else begin q<=d; end endmodule //到此程序全部结实
Module shumaguan(a_to_g,A_TO_D,clk,qian,bai,shi,ge);//数码管驱动 output reg [6:0]a_to_g; output reg [3:0]A_TO_D; input wire clk; input wire [3:0]qian; input wire [3:0]bai; input wire [3:0]shi; input wire [3:0]ge; reg [3:0]duan; reg [1:0]wei; reg a; reg [16:0]q; always@(posedge clk) begin if(q==49999) begin q<=0; a<=~a; end else q<=q+1; end
always@(*)//4位位选译码 case(wei) 3:begin A_TO_D=4'b1110; duan=qian; end 2:begin A_TO_D=4'b1101; duan=bai; end 1:begin A_TO_D=4'b1011; duan=shi; end 0:begin A_TO_D=4'b0111; duan=ge; end default:A_TO_D=4'b1110; endcase always@(posedge a)//四个状态循环 if(wei==3) wei<=0; else wei<=wei+1; endmodule //到此数码管驱动模块结束
基于VerilogHDL设计的数字时钟.(精选)
基于VerilogHDL设计的数字时钟.(精选)深圳大学考试答题纸(以论文、报告等形式考核专用)二○18 ~二○19 学年度第一学期课程编1602080001 课程名称号学姓名李思豪专业年级电子科学与技术16级1班号题目:基于Verilog HDL设计的数字时钟摘要:本文利用Verilog HDL语言自顶向下的设计方法设计多功能数字钟,突出了其作为硬件描述语言的良好的可读性、可移植性和易理解等优点,并通过Altera QuartusⅡ 6.0和cyclnoe II EP2C35F672C6完成综合、仿真。
此程序通过下载到FPGA芯片后,可应用于实际的数字钟显示中关键词:Verilog HDL;硬件描述语言;FPGA目录一、实验任务 (3)实验目的 (3)实验要求 (3)二、设计思路 (3)三、实验结果 (10)四、总结与收获 (14)一、实验任务实验目的1.深入了解基于quartus ii工具的复杂时序逻辑电路的设计。
2.理解并熟练利用EDA工具进行综合设计。
3.熟练掌握芯片烧录的流程及步骤。
4.掌握Verilog HDL 语言的语法规范及时序电路描述方法。
实验要求设计一个带秒表功能的24 小时数字钟,它包括以下几个组成部分:①显示屏,由6 个七段数码管组成,用于显示当前时间(时:分,秒)或设置的秒表时间;②复位键复位所有显示和计数③设置键,用于确定新的时间设置,三个消抖按键分别用于时分秒的设置④秒表键,用于切换成秒表功能基本要求(1) 计时功能:这是本计时器设计的基本功能,每隔一秒计时一次,并在显示屏上显示当前时间。
(2) 秒表功能:设置时间,进行倒计时功能(3) 设置新的计时器时间:按下设置键后,用户能通过时分秒三个消抖按键对时间进行设置。
二、设计思路1、总原理框图:原理如上图所示,时钟由分频器模块,数码管显示模块,计时器模块三个模块构成,每个模块实现如下的不同功能,最后通过在顶层模块的调用,来实现时钟功能。
基于FPGA数字秒表设计
数字秒表设计一、实验目的1、理解计时器的原理与Verilog/VHDL的编程方法;2、掌握多模块设计及层次设计的方法。
二、实验原理秒计时器是由计数器和译码器、显示器组成,其核心是计数器与译码器。
60秒计时器可由二个计数器分别完成:个位为十进制计数器,十位为6进制计数。
个位计数器的计数信号由实验开发板上主频20MHZ分频产生的1Hz时钟信号提供,十位计数器的计数信号由个位的进位信号提供。
然后由译码器对计数结果进行译码,送LED数码管进行显示。
Clr为清零,se t为开始。
三、实验框图图2-1四、实验任务1、采用层次设计的方法,设计一个包括顶层及底层模块的60秒计时器,底层模块用Verilog/VHDL设计(或者选用原理图输入法中宏功能元件),顶层用原理图设计。
2、秒计时器应当具有系统复位功能;3、每十秒发出提示信号及计满60秒时发出报警信号。
(选做)文件名COUNT10.V代码module COUNT1O(SET, CLR, CLK, DOUT, COUT); in put SET, CLR, CLK;output [3:0] DOUT;output COUT;reg [3:0] data;reg COUT;assig n DOUT = data;always @(n egedge CLK or n egedge CLR)4'HF: Q<=7'H71 ;default: Q<=7'B1111111;endcaseenden dmoduleCOUNT60.bdf文件名原理图五、实验步骤1•创建工程2•选择目标器件3. 编写verilog hdl程序4编译5. 生成符号文件6. 创建编辑原理图7. 设置顶层文件8编译六、实验结果1. 编译结果Flow StatusQuartos II VersionRevisicxi NameTop^vel Entity NarneFamlyDeviceTrning ModdsMet timmg requiTiefrientsTata logic ate merit ETold conbinatKMial fundioni Dedfcatcd logic registers Total negiateFBTotal pinsTot日virtual pinsTotaJ rnemory bits&vibedded Multiplier &dements Total PLLs SuccessfLi - Sat Nov 01 11:12:49 30149 1 Build 222 10/21/200& SJ Wet> Editicri COUNTSCOUNTGOl^done I IIEP3C5E144C8Fmi^lN/AG3/5.136( 1 X)33/5.136(<1 X)3J26/96(27*}Q/4?3^36<0%)0/4&(D%)0/2(0%)2. 仿真结果文件名COUNT6.V仿真结果Mann 白Value i17.B F^07ua邑更 g ^?JE^7ub ia-19 JB 71字麼甲 5 33—0宀^^4CLKCLHSETCOUTB D0UTHDH1卜1HD卜0TLrLrLrLnrLrLnnrLrLrLrLrLrLrLrLrLnjTrLrLrLrLrLrumfmrLrLrLrLri L r~1 i 1 i厂-n n文件名COUNT10.V9. 创建编辑波形图文件10. 使用波形图仿真11. 锁定管脚12. 编译13. 下载至芯片仿真结果文件名仿真结果17J?5na■TLTLrLnirLrLrWLn_ruwwjwrLnjmjirLrLrwin_ruijWWUi[n JTT ®(n2XDE®®o^oD203®2xnixD®(n®®©(n2XD®@i®OE®i®<ri i i _______ i i _______COUNT60.V (为了简便将分频器设置2分频的)C_KfHRSET 冋DOITH hiDOirn uOH5 xHUTL_nu jnlimnninmmiMmmmmrimimmMJMominroinnrumiminmTmmmnnrmim!irrno“j 厂JCJZ : 前t 底—I 強—r 耶弋騙工如丫非—仍丈丸朗代熾:璇绽帰它狀减燉麒^峨*]炊輕烫处好號爼仞XCOK切默XX*X*X5XIMM*>X*iXXXAN WtXXXCO Z備出七、实验小结通过本次实验,我掌握了分频器的设计,学习了如何通过原理图设计,知道了如何在一个工程中同时使用verilog hdl程序和原理图。
毕业论文-基于fpga(verilog)的数字式秒表设计说明书
基于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的脉冲。
基于verilog语言编程的数字秒表设计
数字秒表设计系别:电子通信工程系专业:电子信息工程班级:学号:姓名:数字秒表(基于verilong语言编程)课程设计一、设计要求用verilong语言编写程序,结合实际电路,设计一个4位LED数码显示“秒表”,显示时间为99.9~00.0秒,每秒自动减一,精度为0.1。
另设计一个“开始”按键和一个“复位”按键。
再增加一个“暂停”按键。
按键说明:按“开始”按键,开始计数,数码管显示从99.9开始每秒自动减一;按“复位”按键,系统复位,数码管显示99.9;按“暂停”按键,系统暂停计数,数码管显示当时的计数。
二、设计目的1、通过本次课程设计加深对verilong语言课程的全面认识、复习和掌握,对EPM7064芯片的应用达到进一步的了解。
2、掌握定时器、外部中断的设置和编程原理。
3、通过此次课程设计能够将软硬件结合起来,对程序进行编辑,调试。
使其能够通过电脑下载到芯片,正常工作。
4、实际操作Quartus II软件,复习巩固以前所学知识。
三、总体设计本秒表系统具有复位、暂停、秒表计时等功能。
clk为系统工作时钟,采用Altera DE2上的50M时钟信号,经过分频器产生秒表计时周期为0.01s的时钟,再经过计数器,分别对秒表的百分位、十分位、秒、秒十位、分、分十位进行计数。
onoff为启动/暂停控制信号,当它为0时,启动计时,当它为1时,计时暂停。
clr为复位信号,当该信号有效时,计数器和译码清零,此时数码管显示输出为00:00:00。
在总体电路图中,根据设计要求,需要两个输入控制信号onoff和clr。
由于开发板上除了拨动开关就是瞬时的按键开关,且按键开关平时都呈高电平,按一下为低电平。
故在实际测试时采用了拨动开关SW0来控制秒表的启动/暂停,通过KEY0来控制秒表的清零。
四、设计思路描述该实验要求进行计时并在数码管上显示时间,通过相关软件Quartus II编译,利用JTAG 下载电路到核心芯片,驱动硬件工作。
EDA基于Verilog数字秒表
石家庄经济学院信息工程学院电子信息工程专业EDA技术课程设计报告题目:数字秒表姓名学号 412109 班级电子一班指导教师王军芬2015年 1 月 16日课程设计任务书3。
2总电路连线及波形仿真图:图2 电路原理总图3.3 5个模块原理图、波形仿真图及源程序:(1)分频模块:图3 分频模块原理图因为将50MHz的频率分成100Hz和2000HZ的过程中涉及到到频率范围太大,进行波形仿真时,无法正常显示。
设计原理:将50MHz分频为clk1100Hz和clk2 2000HZ的频率,先分频到2000HZ,分频倍数,N1=25000,所以此处用到的是偶数倍分频,其原理如下:使用一模N1计数器模块即可实现,即每当模N1计数器上升沿从0开始计数至N1时,输出时钟进行翻转,同时给计数器一复位信号使之从0开始重新计数,在把2000赫兹频率分为100赫兹,分频倍数为N2=20,每当模N2计数器上升沿从0开始计数至N2时,输出时钟进行翻转,同时给计数器一复位信号使之从0开始重新计数,为以此循环即可。
源程序:module fenpin(clk,clk1,clk2);input clk;output clk1;output clk2;reg [15:0]k2;reg[7:0] k1;reg clk2;reg clk1;always@(posedge clk)beginif(k2<16'd12499)k2=k2+8'd1;else k2=0;if(k2==16'd12499)clk2=clk2+1;//clk2=2000hzendalways @(posedge clk2)beginif(k1〈8’d9)k1=k1+8’d1;else k1=0;if(k1==8'd9)clk1=clk1+1;//clk1=100hzendendmodule(2)计数模块:图4 计数模块原理图图5 波形仿真图设计原理:此处rst是复位键键,当其处于高电平时,全部清零,start是开始键,pause是暂停键,三个按键都用了一个T触发器,按下复位键,其他二个按键没用,按下开始键计数开始,按下暂停键计数停止,再按开始键计数开始.其计数部分由一个六进制的计数器和三个十进制的计数器组成,首先是百分秒位msl开始从零计数,当其计数到九时,向十分秒位msh进一,同时将百分秒位清零;当十分位计数到九时,向秒位sl进一,同时将十分妙位和百分秒位清零;当秒位计数到九时,向十秒位sh进一,同时将秒位、十分秒位和百分秒位清零;当十秒位计数到五时,将所有位清零。
EDA课程设计--基于CPLD的Verilog秒表设计
EDA课程设计报告题目基于CPLD的Verilog秒表设计姓名学号指导教师二О一一年月日一.设计任务设计一个秒表,要求精度达到0.1秒。
有一个开始计时、一个停止计时、一个复位按键。
晶振为12MHz有源晶振,采用CPLD器件为ALTERA的EPM7064AELC44-10N,采用四位数码管显示。
设计功能:1、四位数码管显示999.9秒。
全部采用十进制,满十进一。
2、精度为0.1秒。
3、开始按键和停止按键在一起,按一次开始再按停止。
4、复位按键进行清零。
二.设计方案秒表设计主要分为两部分:程序部分和硬件部分。
在硬件方面主要用到JTAG接口、数码管、EPM7064AELC44-10N芯片、电阻、按键、三极管、电源、有源晶振、44口的芯片插槽等部分组成!具体电路图及显示效果图片见下页。
电路板的具体管脚连接关系如下:seg0 seg1 seg2 seg3 seg4 seg5 seg6 (小数点seg7没有用到)24 25 26 27 28 29 31时钟GCLK1 43dig0 dig1 dig2 dig334 36 37 39key0 key1 key214 16 17三.设计程序自顶而下,一体化程序设计。
秒表程序主要分为四部分:0.1秒信号产生部分,按键消抖处理部分,数码管动态扫描显示部分,计时处理部分。
其中0.1秒信号产生部分将12MHz的有源时钟信号分频成为10Hz的0.1秒计时信号;按键消抖处理部分将将琴键开关转换为乒乓开关,使开关按下去以后就可以松手,不用长时间的按住不放;数码管动态扫描显示部分,通过计算二进制数和在实验箱上实验大概在12~11位二进制时动态扫描为1ms左右,使数码管显示明显完整清新,不会出现闪烁现象;计时处理部分,开始加入清零功能,是不论开始暂停都可以被清零功能清楚,秒计数部分采用满十进一的形式,即总计999.9秒。
module miaobiao(clk,key,dig,seg); //模块名miaobiaoinput clk; //输入时钟input[1:0] key; //输入按键output[3:0] dig; //数码管选择输出引脚output[7:0] seg; //数码管段输出引脚reg[7:0] seg_r; //定义数码管输出寄存器reg[3:0] dig_r; //定义数码管选择输出寄存器reg[3:0] disp_dat; //定义显示数据寄存器reg[24:0]count; //定义计数寄存器reg[23:0]hour; //定义现在时刻寄存器reg sec,keyen; //定义标志位reg[1:0]dout1,dout2,dout3; //寄存器wire[1:0]key_done; //按键消抖输出assign dig = dig_r; //输出数码管选择assign seg = seg_r; //输出数码管译码结果//秒信号产生部分always @(posedge clk) //定义clk上升沿触发begincount = count + 1'b1;if(count == 25'd2400000) //0.05S到了吗?begincount = 25'd0; //计数器清零sec = ~sec; //置位秒标志endend//按键消抖处理部分assign key_done = (dout1 | dout2 | dout3);//按键消抖输出always @(posedge count[17])begindout1 <= key;dout2 <= dout1;dout3 <= dout2;endalways @(negedge key_done[0])beginkeyen = ~keyen; //将琴键开关转换为乒乓开关end//数码管动态扫描显示部分always @(posedge clk) //count[12:11]大约1ms改变一次begincase(count[12:11]) //选择扫描显示数据3'd0:disp_dat = hour[3:0]; //0.1秒位3'd1:disp_dat = hour[7:4]; //秒个位3'd2:disp_dat = hour[11:8]; //秒十位3'd3:disp_dat = hour[15:12]; //秒百位endcasecase(count[12:11]) //选择数码管显示位3'd0:dig_r = 4'b1110; //选择第一个数码管显示3'd1:dig_r = 4'b1101; //选择第二个数码管显示3'd2:dig_r = 4'b1011; //选择第三个数码管显示3'd3:dig_r = 4'b0111; //选择第四个数码管显示endcaseendalways @(posedge clk)begincase(disp_dat)4'h0:seg_r = 8'hc0; //显示04'h1:seg_r = 8'hf9; //显示14'h2:seg_r = 8'ha4; //显示24'h3:seg_r = 8'hb0; //显示34'h4:seg_r = 8'h99; //显示44'h5:seg_r = 8'h92; //显示54'h6:seg_r = 8'h82; //显示64'h7:seg_r = 8'hf8; //显示74'h8:seg_r = 8'h80; //显示84'h9:seg_r = 8'h90; //显示94'ha:seg_r = 8'hbf; //显示-default:seg_r = 8'hff; //不显示endcaseif((count[17:15]== 3'd2)&sec)seg_r = 8'hff;end //计时处理部分always @(negedge sec or negedge key_done[1])//计时处理beginif(!key_done[1]) //是清零键吗?beginhour = 15'h0; //是,则清零endelse if(!keyen)beginhour[3:0] = hour[3:0] + 1'b1; //0.1秒加1if(hour[3:0] == 4'ha)beginhour[3:0] = 4'h0;hour[7:4] = hour[7:4] + 1'b1; //秒的个位加一if(hour[7:4] == 4'ha)beginhour[7:4] = 4'h0;hour[11:8] = hour[11:8] + 1'b1; //秒的十位加一if(hour[11:8] == 4'ha)beginhour[11:8] = 4'h0;hour[15:12] = hour[15:12] + 1'b1;//秒的百位加一if(hour[15:12] == 4'ha)hour[15:12] = 4'h0; //记满999.9秒时清零endendendendendendmodule四.总结及心得这次课程设计主要碰到的是编程问题。
verilog秒表
秒表下载到目标板上显示效果,计时长度为1小时,计时精度为1秒。
初始值为:00:00计时最大值:59:59设计思路:共3个模块:顶层模块----顶层模块对底层模块进行例化,顶层模块不做逻辑设计。
底层模块----共2个底层模块,计时模块:通过在例化时对分频系数的改变,得到1秒,10秒,1分,10分的输出,再对每位计数值的最大值进行例化。
译码模块:对输出要显示的时间数字进行译码。
顶层模块,顶层只做例化。
例化模块为计时模块、译码模块。
//============================================================ //Author:tianwenfei//Date:2011-10-14//Function:This is watch module.//============================================================ `define UD#1module WATCH1(//Input portsSYSCLK,RST_B,//Output portsLED_DATA,LED_SEL);//============================================================ //Input and output declaration//============================================================ input SYSCLK;input RST_B;output[7:0]LED_DATA;output[3:0]LED_SEL;//============================================================ //Wire and reg declaration//============================================================ wire[7:0]LED_DATA;wire[3:0]LED_SEL;wire SYSCLK;wire RST_B;//============================================================ //Wire and reg in the module//============================================================ wire[3:0]DATA1;wire[3:0]DATA2;wire[3:0]DATA3;wire[3:0]DATA4;parameter CNT_1S=36'h17D7840;parameter CNT_10S=36'hEE6B280;parameter CNT_1M=36'h59682F00;parameter CNT_10M=36'h37E11D600;//============================================================ //Logic//============================================================ //InstanceCNT_TIME I_CNT_1S(//Input ports.SYSCLK(SYSCLK),.RST_B(RST_B),.CLK_DIV_COEF(CNT_1S),.CNT_MAX(4'h9),//Output ports.DATA_OUT(DATA1));CNT_TIME I_CNT_10S(//Input ports.SYSCLK(SYSCLK),.RST_B(RST_B),.CLK_DIV_COEF(CNT_10S),.CNT_MAX(4'h5),//Output ports.DATA_OUT(DATA2));CNT_TIME I_CNT_1M(//Input ports.SYSCLK(SYSCLK),.RST_B(RST_B),.CLK_DIV_COEF(CNT_1M),.CNT_MAX(4'h9),//Output ports.DATA_OUT(DATA3));CNT_TIME I_CNT_10M(//Input ports.SYSCLK(SYSCLK),.RST_B(RST_B),.CLK_DIV_COEF(CNT_10M),.CNT_MAX(4'h5),//Output ports.DATA_OUT(DATA4));LED_CTL I_LED_CTL(//Input ports..SYSCLK(SYSCLK),.RST_B(RST_B),.SCAN_COEF(24'h3D090),.DATA_0(DATA1),.DATA_1(DATA2),.DATA_2(DATA3),.DATA_3(DATA4),//Output ports..LED_DATA(LED_DATA),.LED_SEL(LED_SEL));endmodule此为计时模块//============================================================ //Author:tianwenfei//Date:2011-10-13//Function:This is a count time module.//============================================================ `define UD#1module CNT_TIME(//Input portsSYSCLK,RST_B,CLK_DIV_COEF,CNT_MAX,//Output portsDATA_OUT);//============================================================ //Input and output declaration//============================================================ input SYSCLK;input RST_B;input[WIDTH-1:0]CLK_DIV_COEF;input[3:0]CNT_MAX;output[3:0]DATA_OUT;//============================================================ //Wire and reg declaration//============================================================ wire SYSCLK;wire RST_B;wire[WIDTH-1:0]CLK_DIV_COEF;wire[3:0]CNT_MAX;wire[3:0]DATA_OUT;parameter WIDTH=36;//============================================================ //Wire and reg in the module//============================================================ reg[WIDTH-1:0]CLK_DIV_CNT;reg[WIDTH-1:0]CLK_DIV_CNT_N;reg DIV_CLK;reg DIV_CLK_N;reg[3:0]DIV_CLK_CNT;reg[3:0]DIV_CLK_CNT_N;//============================================================ //Logic//============================================================ //Division clock.always@(posedge SYSCLK or negedge RST_B)beginif(!RST_B)CLK_DIV_CNT<=`UD36'h0;elseCLK_DIV_CNT<=`UD CLK_DIV_CNT_N;endalways@(*)beginif(CLK_DIV_CNT==CLK_DIV_COEF)CLK_DIV_CNT_N=36'h0;elseCLK_DIV_CNT_N=CLK_DIV_CNT+36'h1;end//Duty50%square wave clock.always@(posedge SYSCLK or negedge RST_B)beginif(!RST_B)DIV_CLK<=`UD1'h0;elseDIV_CLK<=`UD DIV_CLK_N;endalways@(*)beginif(CLK_DIV_CNT==CLK_DIV_COEF)DIV_CLK_N=~DIV_CLK;elseDIV_CLK_N=DIV_CLK;end//Count the divison clock.always@(posedge SYSCLK or negedge RST_B)beginif(!RST_B)DIV_CLK_CNT<=`UD4'h0;elseDIV_CLK_CNT<=`UD DIV_CLK_CNT_N;endalways@(*)beginif((DIV_CLK_CNT==CNT_MAX)&&(DIV_CLK)&&(!DIV_CLK_N)) DIV_CLK_CNT_N=4'h0;else if((DIV_CLK)&&(!DIV_CLK_N))DIV_CLK_CNT_N=DIV_CLK_CNT+4'h1;elseDIV_CLK_CNT_N=DIV_CLK_CNT;endassign DATA_OUT=DIV_CLK_CNT;endmodule此模块为译码模块//============================================================ //Author:tianwenfei//Date:2011-10-13//Function:This is a decorder module.//============================================================ `define UD#1module LED_CTL(//Input ports.SYSCLK,RST_B,SCAN_COEF,DATA_0,DATA_1,DATA_2,DATA_3,//Output ports.LED_DATA,LED_SEL);//============================================================ //Input and output declaration//============================================================ input SYSCLK;//System clock,50MHz.input RST_B;//Global reset,low active.input[23:0]SCAN_COEF;//The coef of scan,fast or sllow.input[3:0]DATA_0;//The data will show in led0.input[3:0]DATA_1;//The data will show in led1.input[3:0]DATA_2;//The data will show in led2.input[3:0]DATA_3;//The data will show in led3.output[7:0]LED_DATA;//The data output to led.output[3:0]LED_SEL;//Seclet led,uesed for scan.//============================================================ //Wire and reg declaration//============================================================ wire SYSCLK;wire RST_B;wire[23:0]SCAN_COEF;wire[3:0]DATA_0;wire[3:0]DATA_1;wire[3:0]DATA_2;wire[3:0]DATA_3;reg[7:0]LED_DATA;reg[3:0]LED_SEL;//============================================================ //Wire and reg in the module//============================================================ reg[3:0]LED_DATA_HEX;//The hex of the output data.reg[23:0]LED_SCAN_CNT;//Count for scan the led,200HZ.reg[1:0]LED_SEL_NUM;//The num of the led is secleted.reg[23:0]LED_SCAN_CNT_N;//Next value of LED_SCAN_CNT.reg[1:0]LED_SEL_NUM_N;//Next value of LED_SEL_NUM.reg[24:0]CNT_TIME;//0.5Sreg[24:0]CNT_TIME_N;reg DP;//Pointreg DP_N;//============================================================ //Logic//============================================================ //Count system clock for Scan the led.always@(posedge SYSCLK or negedge RST_B)beginif(!RST_B)LED_SCAN_CNT<=`UD24'h0;elseLED_SCAN_CNT<=`UD LED_SCAN_CNT_N;endalways@(*)beginif(LED_SCAN_CNT==SCAN_COEF)LED_SCAN_CNT_N=24'h0;elseLED_SCAN_CNT_N=LED_SCAN_CNT+24'h1;end//Count the number of the led is secleted.always@(posedge SYSCLK or negedge RST_B)beginif(!RST_B)LED_SEL_NUM<=`UD2'h0;elseLED_SEL_NUM<=`UD LED_SEL_NUM_N;endalways@(*)beginif(LED_SCAN_CNT==SCAN_COEF)LED_SEL_NUM_N=LED_SEL_NUM+2'h1; elseLED_SEL_NUM_N=LED_SEL_NUM;end//The output control.always@(*)begincase(LED_SEL_NUM)2'b00:LED_SEL=4'b0111;2'b01:LED_SEL=4'b1011;2'b10:LED_SEL=4'b1101;2'b11:LED_SEL=4'b1110;default:LED_SEL=4'b0000;endcaseendalways@(*)begincase(LED_SEL_NUM)2'b00:LED_DATA_HEX=DATA_0[3:0];2'b01:LED_DATA_HEX=DATA_1[3:0];2'b10:LED_DATA_HEX=DATA_2[3:0];2'b11:LED_DATA_HEX=DATA_3[3:0];default:LED_DATA_HEX=4'h0;endcaseend//Count the time of0.5S.always@(posedge SYSCLK or negedge RST_B) beginif(!RST_B)CNT_TIME<=`UD25'h0;elseCNT_TIME<=`UD CNT_TIME_N;endalways@(*)beginif(CNT_TIME==25'h17d7840)CNT_TIME_N=25'h0;elseCNT_TIME_N=CNT_TIME+25'h1;end//Pointalways@(posedge SYSCLK or negedge RST_B) beginif(!RST_B)DP<=1'h1;elseDP<=DP_N;endalways@(*)beginif(CNT_TIME==25'h17d7840)DP_N=~DP;elseDP_N=DP;endalways@(*)beginif((DP)&(LED_SEL_NUM==2'h2))LED_DATA[7]=1'h0;elseLED_DATA[7]=1'h1;end//Dataalways@(*)begincase(LED_DATA_HEX)4'h0:LED_DATA[6:0]=7'b1000000;4'h1:LED_DATA[6:0]=7'b1111001;4'h2:LED_DATA[6:0]=7'b0100100;4'h3:LED_DATA[6:0]=7'b0110000;4'h4:LED_DATA[6:0]=7'b0011001;4'h5:LED_DATA[6:0]=7'b0010010;4'h6:LED_DATA[6:0]=7'b0000010;4'h7:LED_DATA[6:0]=7'b1111000;4'h8:LED_DATA[6:0]=7'b0000000;4'h9:LED_DATA[6:0]=7'b0010000;default:LED_DATA[6:0]=7'b1111111; endcaseendendmodule。
课程设计---基于Verilog HDL数字时钟设计与实现
课程设计---基于Verilog HDL数字时钟设
计与实现
简介
本课程设计旨在通过使用Verilog硬件描述语言(HDL)设计和实现数字时钟。
学生将研究如何使用Verilog语言来描述数字电路,并将其应用于设计和实现一个简单的数字时钟电路。
设计目标
- 研究使用Verilog HDL来描述和设计数字电路
- 实现一个简单的数字时钟电路
- 熟悉数字时钟的工作原理和设计流程
实施步骤
1. 了解数字时钟的原理和工作方式
2. 研究Verilog HDL语言的基本语法和使用方法
3. 设计并实现时钟的各个功能模块,如时钟显示模块、时钟计数模块等
4. 使用仿真工具验证设计的正确性
5. 进行实际的硬件验证,将设计烧录到FPGA开发板上并进行测试
实验要求
1. 设计的数字时钟应具备基本的时分秒显示功能
2. 时钟应具备可调节的时间设置功能
3. 需要使用FPGA开发板进行实际硬件验证
4. 实验报告应包含设计原理、设计流程、仿真结果和实际硬件验证结果
参考资料
1. Verilog HDL教程
2. FPGA开发板用户手册
3. 相关学术论文和文献
以上为课程设计---基于Verilog HDL数字时钟设计与实现的文档简介。
本课程设计将帮助学生学习Verilog HDL语言并应用于设计和实现数字时钟电路。
verilog_HDL秒表
verilog_HDL秒表实验八 verilog HDL秒表一、实验目的:1、了解数字秒表的工作原理。
2、进一步熟悉用verilog HDL 语言编写驱动七段码管显示的代码。
3、掌握verilog HDL 编写中的一些小技巧。
二、实验要求:实现数字秒表功能,要求有分、秒、1,秒显示,该秒表能够随时控制启/停,清零重新计时功能。
三、实验原理:秒表的工作原理与多功能数字电子钟大致相同,唯一不同的是,由于秒表的分辨率为0.01 秒,所以整个秒表的工作时钟是在100Hz的时钟信号下完成。
假设该秒表的应用场合小于1小时,秒表的显示格式为mm-ss-xx(mm表示分钟:0,59;ss 表示秒:0,59;xx 表示百分之一秒:0,99)。
四、实验步骤:1、用verilog HDL语言编写出秒表电路程序;通过Quartus?进行编辑、编译、综合、适配、仿真测试,给出其所有信号的时序仿真波形。
2、按实验要求锁定管脚,重新综合(注:此实验中,使用了时钟信号,请关闭时钟信号管脚的自动锁定功能,具体方法参照ALTERA软件介绍)。
3、在EDA6000软件中建立实验模式。
4、下载设计文件,硬件验证秒表的工作性能。
代码:十进制计数器:module count10(RST,SRT,CLK,cout,Q); input RST,SRT,CLK;output cout;output [3:0] Q;reg [3:0] Q;always @(posedge CLK or posedge RST ) beginif(RST) Q=4'b0000;else if (SRT)beginif (Q<4'b1001) Q=Q+4'b0001;else Q=4'b0000;endendassign cout=Q[3]&Q[0];endmodule六进制计数器:module count6(RST,SRT,CLK,cout,Q); input RST,SRT,CLK;output cout;output [2:0] Q;reg [2:0] Q;always @(posedge CLK or posedge RST ) beginif(RST) Q=3'b000;else if (SRT)beginif (Q<3'b101) Q=Q+3'b001;else Q=3'b000;endendassign cout=Q[2]&Q[0];endmodule顶层模块设计:。
基于verilog的数字秒表的设计实现
数字秒表的设计实现团队成员:董婷詹磊胡鹏一、测试要求1. 有源晶振频率:24MHZ2. 测试计时范围:00’00”00 ~ 59’59”99,显示的最长时间为59分59 秒3. 数字秒表的计时精度是10ms4. 显示工作方式:a、用八位数码管显示读数b、用两个按钮开关(一个按钮使秒表复位,另一个按钮控制秒表的启动/暂停)二、设计要求1. 设计出符合设计要求的解决方案2. 利用软件对各单元电路及整体电路进行仿真3. 在开发板上实现设计5. 撰写设计报告三、秒表功能键1、power:秒表电源键2、Reset:秒表复位清零键3、run/stop:秒表启动/停止键四、实验原理1 .实验设计原理(1)秒表的逻辑结构较简单,它主要由十进制计数器、六进制计数器、分频器、数据选择器、和显示译码器等组成。
在整个秒表中最关键的是如何获得一个精确的100HZ计时脉冲,除此之外,整个秒表还需有一个启动信号和一个清零信号,以便秒表能随意停止、启动以及清零复位。
(2)秒表有共有8个输出显示,其中6个显示输出数据,分别为百分之一秒、十分之一秒、秒、十秒、分、十分,所以共有6个计数器与之相对应;另外两个为间隔符,显示‘-’。
8个计数器的输出全都为BCD码输出,这样便与同显示译码器连接。
(3)可定义一个24位二进制的寄存器hour用于存放8个计数器的输出,寄存器从高位到低位每连续4位为一组,分别存放百分之一秒、十分之一秒、间隔符、秒、十秒、间隔符、分、十分。
由频率信号输出端输出频率为100HZ的时钟信号,输入到百分之一秒模块的时钟端clk,百分之一秒模块为100进制的计数器,当计数到“1001”时,百分之一秒模块清零,同时十分之一秒模块加1;十分之一秒模块也为100进制的计数器,当计数到“1001”时,十分之一秒模块清零,同时秒模块加1;以此类推。
直到分模块计数到59进59。
(4)为了消除按键消抖问题,定义寄存器key-inner来存储按键key的输入信号,key-flag作为启动/暂停的转换标志,key-inner[0]出现一个下降沿时,key-flag取反一次,当key-flag为0时计数器启动,1时计数器暂停,当key-flag 为1同时key-inner[1]为9时,计数器清零。
时钟文档
基于FPGA的V erilog HDL语言数字钟(含秒表)设计一、功能说明1.时钟功能:完成分/时的正确计数并显示,秒由于数码管数目的限制,采取发光二极管做提示;2.闹钟定时:实现定时提醒及定时报时,利用二极管发光代替扬声器发出报时声音;3.时钟校时:当认为时钟不准确时,可以分别对分/时钟进行调整;4.秒表功能:利用4个数码管完成秒表显示:A、精度达100ms;B、可以清零;C、可暂停,并可随时记时、暂停后记录数据,最大计时为999.9s。
二、设计方案时钟模块:作用:实现时钟,时间校时,闹铃定时,秒表计时功能方案:50MHz分频到1Hz(用于时钟)和10Hz(用于秒表计时)。
选择:用于选择此时数码管显示的时哪个状态,mode=00时为普通时钟状态,mode=01时为闹铃定时状态,mode=10时为时钟校时状态,mode=11时为秒表计时状态;时钟:利用count,smin0,smin1,shour0,shour1的计数来实现,具体情况见程序;校时:当turn=1时,调整分位;当turn=0时,调整小时位;闹铃:当turn=1时,调整分位;当turn=0时,调整小时位;秒表:当pause=0时,开始计时;当pause=1时,暂停;附带码:分频模块:fdiv.vfdiv_ms.v时钟模块:clock.v显示模块:作用:显示时钟的小时(两位),分钟(两位)器件:4位7段共阳数码管方案:扫描输出【1】4位7段共阳数码管管脚说明:7个段控制端口:a,b,c,d,e,f,g,决定每位数码管显示的数字4个位控制端口:决定显示哪一位数码管1个公共的引脚,接VCC【2】方案设计:使用同步扫描电路,对4个位控制端口进行扫描,使得同一个时刻只有一个数码管亮,每隔0.5ms扫描一次,由于眼睛的视觉停留效应,会使得显示结果达到4位同时亮的效果。
这样可以节省3/4的电能消耗。
代码设计:1、采用0.5ms的扫描时钟clk2,上升沿触发。
数字式秒表verilog语言实现
VgaDCM DCMInst(
.CLKIN_IN(clk),
.CLKDV_OUT(sys_clk),
.CLKIN_IBUFG_OUT(),
.CLK0_OUT(),
.LOCKED_OUT());
(2)分频器模块
产生用于计时的1/10秒脉冲信号pulse10,频率为10Hz;
#(dely*250) clear=0;count=1;stop=0;sec=1;
#(dely*200) sec=0;
#(dely*300) clear=0;count=0;stop=1;sec=1;
#(dely*100) clear=0;count=1;stop=0;sec=1;
#(dely*500) clear=0;count=0;stop=1;sec=0;
系统主100MHz时钟
ButtonIn
Input
AG5
Enter按键
a
Output
P7
七段码
b
Output
P3
c
Output
P2
d
Output
R7
e
Output
P4
f
Output
T2
g
Output
R5
position[0]
Output
N6
5个数码管的点亮控制端
position[1]
Output
L5
position[2]
initial sys_clk=0;
always #(dely/2) sys_clk=~sys_clk;
initial
begin
clear=1;count=0;stop=0;sec=0;
秒表的设计_Verilog_HDL
FPGA及数字系统设计专周报告系别:XXXXXXXX班级:XXXXX学号:XX姓名:XXXX日期:XXXX年XX月XX日一、专周设计课题秒表的设计二、专周实习目的1、熟练利用Verilog HDL语言进行数字系统设计。
2、掌握数字系统的设计方法——自顶向下的设计思想。
3、掌握计数器的设计与使用。
4、根据秒表的功能要求设计一个秒表。
5、熟练掌握用Quartus II软件进行系统原理图设计、文本设计以及进行波形仿真。
三、专周实习所需器材装有Quartus II软件的电脑一台、FPGA教学实验系统一台、下载电缆一根。
四、专周实习要求1、有秒、分计数,数码扫描显示输出。
2、有清零端和暂停端。
3、在功能允许的情况下,可自由发挥。
4、下载,检查结果是否正确。
五、专周实习原理1、功能描述秒表是一种计时的工具,有着很广泛的用途。
本实验中的秒表要求有两个功能按钮:一个是计数和停止计数按钮,当第一次按下此按钮时,秒表开始计数,再一次按下时,秒表停止计数,并显示所计的数字;另一个是清零按钮,当按下此按钮时,秒表清零。
在数码管上采用动态扫描显示输出。
2、基本原理:本设计中用到的主要元件有计数器、分频器、数据选择器、译码器、位选信号发生器等。
秒、分都是60进制计数,所以必须采用两个60进制的计数器,而百分秒择采用的是100进制;分频器主要将1KHZ的时钟信号经过10分频后,产生100HZ的单位时钟周期;数据选择器主要功能是将即将显示的数据送给译码器;译码器将BCD码转换为七段译码进行显示;位选信号发生器根据人眼暂留效应和显示的数码的个数,产生一段循环码。
原理框图如下图。
3、自顶向下的设计方法自顶向下的设计方法是数字系统设计中最常用的设计方法,也是基于芯片的系统设计的主要方法。
自顶向下的设计方法利用功能分割手段将设计由上到下进行层次话和模块化,及分层次、分模块进行设计和仿真。
功能分割时,将系统功能分解为功能块,功能块再分解为逻辑块,逻辑块再分解为更少的逻辑块和电路。
verilog电子秒表设计
华中科技大学《电子线路设计、测试与实验》实验报告实验名称:电子秒表院(系):光学与电子信息学院专业班级:光材1102姓名:***学号:U*********时间:2013.12.5地点:南一楼实验成绩:指导教师:**2013 年12 月3 日实验目的:利用层次化方法在实验板设计实现一个能显示00.00 秒(百分之一秒)到59.99 秒,当计时达到并超过1 分钟时,给出LED 常亮信号告警,计数结果停留在计数最大值(即99.99 秒)上的电子秒表。
功能要求:基本功能:6) 设计一个能显示00.00 秒到59.99 秒的电子秒表。
7) 利用实验板所提供的50MHz 信号做为时钟信号。
8) 计数结果在AN3~AN0 中提供的数码管中显示。
9) 具有继续/暂停按键和复位清零开关。
拨码开关SW0 为复位开关,当SW0 为HIGH 时,系统复位,电子秒表显示时间为0 秒;当SW0 为LOW 时,系统开始按继续/暂停按键BTN0 控制进行工作;BTN0 为继续/暂停按键,当继续/暂停按键BTN0 按下时,系统暂停计数,AN1~AN0 显示停留在所暂停时刻;当继续/暂停按键BTN0 松开时,系统正常计数,显示精度为0.01 秒。
10) 当计时达到并超过1 分钟时,LD0 闪烁告警,计数结果停留在计数最大值上。
设计步骤与要求:1) 计算并说明采用Basys2 实验板时钟50MHz 实现系统功能的基本原理。
2) 在Xilinx ISE13.1 软件中,利用层次化方法,设计实现模一百计数及显示的电路系统,设计模块间的连接调用关系,编写并输入所设计的源程序文件。
3) 对源程序进行编译及仿真分析(注意合理设置,以便能够在验证逻辑的基础上尽快得出仿真结果)。
4) 输入管脚约束文件,对设计项目进行编译与逻辑综合,生成下载所需.bit类型文件。
# PlanAhead Generated physical constraintsNET "CLK" LOC = B8;NET "CLR" LOC = P11;NET "PAUSE" LOC = G12;NET "WARN" LOC = M5;NET "display[0]" LOC = F12;NET "display[1]" LOC = J12;NET "display[2]" LOC = M13;NET "display[3]" LOC = K14;NET "out_display[0]" LOC = L14;NET "out_display[1]" LOC = H12;NET "out_display[2]" LOC = N14;NET "out_display[3]" LOC = N11;NET "out_display[4]" LOC = P12;NET "out_display[5]" LOC = L13;NET "out_display[6]" LOC = M12;NET "out_display[7]" LOC = N13;NET "CLR" CLOCK_DEDICA TED_ROUTE = FALSE;# PlanAhead Generated IO constraintsNET "CLK" IOSTANDARD = LVCMOS33;NET "CLR" IOSTANDARD = LVCMOS33;NET "PAUSE" IOSTANDARD = LVCMOS33;NET "WARN" IOSTANDARD = LVCMOS33;NET "display[0]" IOSTANDARD = LVCMOS33;NET "display[1]" IOSTANDARD = LVCMOS33;NET "display[2]" IOSTANDARD = LVCMOS33;NET "display[3]" IOSTANDARD = LVCMOS33;NET "out_display[0]" IOSTANDARD = LVCMOS33;NET "out_display[1]" IOSTANDARD = LVCMOS33;NET "out_display[2]" IOSTANDARD = LVCMOS33;NET "out_display[3]" IOSTANDARD = LVCMOS33;NET "out_display[4]" IOSTANDARD = LVCMOS33;NET "out_display[5]" IOSTANDARD = LVCMOS33;NET "out_display[6]" IOSTANDARD = LVCMOS33;NET "out_display[7]" IOSTANDARD = LVCMOS33;NET "CLK" DRIVE = 12;5) 在Basys2 实验板上下载所生成的.bit 文件,观察验证所设计的电路功能。
Verilog秒表计时电路
秒表计时电路1.实验内容1.秒表计时功能,显示分、秒、0.01秒2.具有启动、暂停、停止和清空功能3.增加有趣的流水灯4.输入信号:4bit按键,50MHz时钟5.输出信号:6位数码管2.实验原理(1) Verilog语言Verilog HDL是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。
本实验使用Verilog语言编写代码,通过编译,综合等实现电路设计。
其中涉及基本的语法知识,可通过查阅相关资料进行了解。
(2) quartus软件Quartus是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHD等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
本实验以quartus为平台,完成代码的编辑,编译,综合及分配引脚等,最后下载。
(3) Altera DE2实验板DE2板具有很多特性可以允许使用者实现像从单个电路到多媒体工程的广泛的电路设计。
除了一些硬件特性,DE2还有对标准IO接口的软件支持和一个可以接入多种元件的控制平台。
并且这些软件还提供一系列展现DE2板高级性能的演示。
为了向用户提供最大的灵活性,所有的连接通过Cyclone II FPGA设备。
因此用户可以配置FPGA来实现任何系统设计。
本实验用到的电路模块如右(4) 数码管采用共阳数码管,数码管段选方式如下每一个数码管单独与FPGA连接通过并行总线控制数码管显示3.设计思路及实现方案(1)时钟分频clk10ms→ clk100ms → clk1s→clk10s→clk1min→clk10min→clk1h分频单元:六分频,十分频50MHz到100Hz分频,500000分频(2)状态机设计(3)设计框图4.代码添加及说明a)六进制分频代码//计数器实现6分频,计数到达2和5,输出始终翻转一次,且计数达到5时计数清零module count6(rst, clk, clkout, counter);input rst;input clk;output reg clkout;output reg [3:0]counter;always @(negedge clk or negedge rst) beginif (~rst) beginclkout <= 0;counter <= 0;endelse if (counter == 4’b0010) begin //计数满2输出反转clkout <= ~clkout;counter <= counter + 4'b1;endelse if (counter == 4’b0101) begin //计数满4输出反转同时清零clkout <= ~clkout;counter <= 0;endelse begincounter <= counter + 4'b1;endendendmoduleb)十进制分频代码//计数器实现10分频,计数到达4和9,输出始终翻转一次,且计数达到9时计数清零module count10(rst, clk, clkout, counter);input rst;input clk;output reg clkout;output reg [3:0]counter;always @(negedge clk or negedge rst) beginif (~rst) begin counter<=0;clkout<=0; end//计数满4输出反转else if (counter ==4'b0100) begin clkout<=~clkout;counter<=counter+1; end //计数满9输出反转同时计数清零else if (counter ==4'b1001) begin clkout<=~clkout;counter<=0; endelse begin counter<=counter+1; endendendmodulec)时钟分频代码always @(negedge clk or negedge rst10ms) beginif(~rst10ms)begin clk10msreg<=0;clk10ms<=0;endelse if(clk10msreg==249999)begin clk10ms<=~clk10ms;clk10msreg<=0;endelse begin clk10msreg<=clk10msreg+1;endd)状态机代码always @(negedge clk or negedge clear) beginif (~clear) beginstate <= idlestate; rst <= 0; rst10ms <= 0;endelse begincase (state)idlestate:begin if(~start)begin state<=prestate;rst<=0;rst10ms<=0;endelse begin state<=idlestate;endendprestate: begin state<=runstate;rst<=1;rst10ms<=1;endholdstate:begin if(~start)begin state<=runstate;rst<=1;rst10ms<=1;endelse if(~stop)begin state<=idlestate;rst<=1;rst10ms<=0;endelse begin state<=holdstate;endendrunstate:begin if(~stop)begin state<=idlestate;rst<=1;rst10ms<=0;endelse if(~hold)begin state<=holdstate;rst<=1;rst10ms<=0;endelse begin state<=runstate;endenddefault: state <= state;endcaseendende)各级分频代码count6 min10counter(rst, clk10min,clk1h, timeout[7]); //10min6分频得1hcount10 min1counter (rst, clk1min, clk10min, timeout[6]);//1min 10分频得10mincount6 sec10counter(rst, clk10s, clk1min, timeout[5]);//10s 6分频得1mincount10 sec1counter (rst, clk1s, clk10s, timeout[4]);// 1s 10分频得10scount10 ms100counter(rst, clk100ms, clk1s, timeout[3]); // 100ms10分频得1scount10 ms10counter (rst, clk10ms, clk100ms, timeout[2]); // 10ms10分频得100msassign timeout[1] = 4'b1111;assign timeout[0] = 4'b1111;5.实验结果及分析实验中共有四个控制按键分别测试其控制功能即启动,暂停,停止,清空。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于v e r i l o g数字秒表的设计实现精选文档 TTMS system office room 【TTMS16H-TTMS2A-TTMS8Q8-班级:通信13-2班姓名:闫振宇学号: 22成绩:电子与信息工程学院信息与通信工程系基于verilog数字秒表的设计实现1. 概述硬件描述语言HDL ( HardwareDescription Langyage) 是一种用形式化方法来描述数字电路和系统的语言。
数字电路系统的设计这里用这种语言可以从上层倒下层逐层描述自设计思想用一系列分层的模块来表示极其复杂的数字系统,然后用EDA 工具逐层验证,把其中需要为具体物理电路的模块组合由自动综合工具转换到门级电路网表。
Verilog HDL 是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。
被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。
数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。
使用VERILOG 进行系统设计时采用的是从顶至下的设计,自顶向下的设计是从系统机开始巴西同划分为若干个基本单元,然后再把每个单元划分为下一层的基本单元,这样下去直到可以直接用EDA 元件库中的基本元件来实现为止。
2. 设计目的及要求a.有源晶振频率:50MHZ;b.测试计时范围:00’00”00 ~ 59’59”99,显示的最长时间为59分59 秒;c.数字秒表的计时精度是10ms;d.显示工作方式:六位BCD七段数码管显示读数,两个按钮开关(一个按钮使秒表复位,另一个按钮控制秒表的启动/暂停)。
3.设计原理秒表的逻辑结构较简单,它主要由四进制计数器、十六进制计数器、分频器、数据选择器、和显示译码器等组成。
在整个秒表中最关键的是如何获得一个精确的100HZ计时脉冲,除此之外,整个秒表还需有一个启动信号和一个清零信号,以便秒表能随意停止、启动以及清零复位。
秒表有共有6个输出显示,其中6个显示输出数据,分别为百分之一秒、十分之一秒、秒、十秒、分、十分,所以共有6个计数器与之相对应;6个计数器的输出全都为BCD码输出,这样便与同显示译码器连接。
利用一块芯片完成除时钟源,按键和显示器之外的所有数字电路功能。
所有数字逻辑功能都在CPLD器件上用Verilog语言实现。
这样设计具有体积小,设计周期短,调试方便,故障率地和修改升级容易等特点。
本设计采用依次采用以下设计方法:1)按键输入缓存,键盘消抖设计;2)分频产生秒信号,产生100HZ的时钟信号设计;3)数码管动态扫描显示设计;4)3-8译码器显示(译码)设计;5)流水线式计数方法设计。
4.设计原理框图秒表计时器设计原理框图,如图4-1所示。
图4-1 秒表计时器设计原理框图根据设计原理框图4-1,以及设计的要求及目的,可以将Verilog HDL语言设计的秒表计时程序分为四大模块:1)按键输入缓存,按键消抖模块;2)分频产生100HZ的时钟信号模块;3)数码管动态扫描显示驱动模块;4)计时处理部模块。
5.软件设计按键输入缓存,按键消抖模块常在按键较少时可用硬件方法消除抖动,一般采用RS触发器作为常用的消抖电路,如果按键较多时,常用软件消除抖动。
在EDA的设计应用中,软件消抖的方法即可使用?RS?触发器进行消抖,也可通过检测按键按下的时间进行消抖。
按键输入缓存,按键消抖程序:always@(posedge count[16])beginkey_inner<=key;endalways@(posedge key_inner[0])beginkey_flag=~key_flag;end键盘消抖工作原理:设置输入信号key[1:0],设置一个模值为?4?的控制计数器key_inner,判断计数寄存器count的第16位的上升沿,检测到key_inner为高电平。
由于计数寄存器的位数为18位。
则说明在内可以检测到4次高电平。
在人工按键key=‘1’时,key_inner为‘1’,如连续?4?次检测到高电平则key_inner一直为‘1’。
4?次以上检测到高电平key_inner依旧为‘1’,也一直输出高电平。
这就确保了当按键信号持续高电平?以上按键信号才有效。
抖动期间的高电平持续时间不足以输出高电平。
如没有连续?4?次以上检测到高电平,则?key_inner为‘0’。
再判断?key_inner的上升沿(按键按下为下降沿,弹起为上升沿),每当key_inner[0]出现一次上升沿(按键按下并弹起),key_flag将取反一次(设置key_flag的初值为‘0’)。
分频产生100HZ的时钟信号模块分频产生100HZ的时钟信号程序:always@(posedge clk) begin if(count==249999) begin clk_100hz<=~clk_100hz; count<=0;endelsecount<=count+1; end分频原理图,如图5-1所示。
图5-1 分频原理图分频原理:由于开发板的输入频率为50MHZ 的时钟信号,说明1s 产生7510 个时钟信号。
每个时钟信号持续的时间为71510⨯s ,由于秒表计时器的最小单位为,所以要将50MHZ 的时钟信号进行5510⨯分频,得到100HZ 的时钟信号,即。
数码管动态扫描显示驱动模块数码管动态扫描显示驱动程序:always@(posedge count[15]) begin count3b=count3b+1; case(count3b)3'd5:dis_dat=hour[3:0]; 3'd4:dis_dat=hour[7:4];3'd3:dis_dat=hour[11:8]; 3'd2:dis_dat=hour[15:12]; 3'd1:dis_dat=hour[19:16]; 3'd0:dis_dat=hour[23:20];default:dis_dat=4'bxxxx;endcase sel=count3b;endalways@(dis_dat) begincase(dis_dat):seg = 8'b1100_0000;erilog秒表设计.2012:1517.[2]大彬哥.基于Verilog HDL的数字计时器的设计.2013:11.附件:module led_on(input[1:0]key, //输入信号input clk, //输入频率为50MHZ的时钟output reg [2:0]sel, //数码管位选output reg [7:0]seg, //数码管段选output en //3-8译码器使能);reg[2:0]count3b;reg[3:0]dis_dat; //定义显示数据寄存器reg[18:0]count; //定义计数寄存器reg[23:0]hour; //定义现在时刻寄存器reg clk_100hz; //50MHZ的时钟信号500000分频,得到100HZ的时钟信号reg key_flag; //启动/暂停的切换标志reg[1:0]key_inner;assign en=0;//(1)按键输入缓存,按键消抖设置always@(posedge count[16])//在内,扫描2的2次方,可以检测到4次高电平beginkey_inner<=key;endalways@(posedge key_inner[0])beginkey_flag=~key_flag;end//(2)秒信号产生部分,产生100HZ的时钟信号always@(posedge clk)beginif(count==249999)beginclk_100hz<=~clk_100hz;count<=0;endelsecount<=count+1;end//(3)数码管动态扫描显示部分always@(posedge count[15]) //时序逻辑,由于有6个数码管,则在一秒内扫描2的6次方begincount3b=count3b+1;case(count3b)3'd5:dis_dat=hour[3:0];3'd4:dis_dat=hour[7:4];3'd3:dis_dat=hour[11:8];3'd2:dis_dat=hour[15:12];3'd1:dis_dat=hour[19:16];3'd0:dis_dat=hour[23:20];default:dis_dat=4'bxxxx;endcasesel=count3b;endalways@(dis_dat)begincase(dis_dat)0 : seg = 8'b1100_0000;//显示“0”1 : seg = 8'b1111_1001;//显示“1”2 : seg = 8'b1010_0100;//显示“2”3 : seg = 8'b1011_0000;//显示“3”4 : seg = 8'b1001_1001;//显示“4”5 : seg = 8'b1001_0010;//显示“5”6 : seg = 8'b1000_0010;//显示“6”7 : seg = 8'b1111_1000;//显示“7”8 : seg = 8'b1000_0000;//显示“8”9 : seg = 8'b1001_0000;//显示“9”default:seg = 8'bxxxxxxxx;endcaseend//(4)计时处理部分always@(posedge clk_100hz) //计时处理beginif(~key_inner[1]&&key_flag==1) //判断是否复位键,beginhour=24'h0;endelse if(!key_flag)beginhour[3:0]=hour[3:0]+1;if(hour[3:0]==4'ha)beginhour[3:0]=4'h0;hour[7:4]=hour[7:4]+1;if(hour[7:4]==4'ha)beginhour[7:4]=4'h0;hour[11:8]=hour[11:8]+1;if(hour[11:8]==4'ha)beginhour[11:8]=4'h0;hour[15:12]=hour[15:12]+1;if(hour[15:12]==4'h6)beginhour[15:12]=4'h0;hour[19:16]=hour[19:16]+1;if(hour[19:16]==4'ha)beginhour[19:16]=4'h0;hour[23:20]=hour[23:20]+1;endif(hour[23:20]==4'h6)hour[23:20]=4'h0;endendendendendendendmodule。