基于verilog的数字秒表的设计实现

合集下载

Verilog秒表设计 精品

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语言编写的电子秒表

用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 //到此数码管驱动模块结束

基于verilog数字秒表的设计实现

基于verilog数字秒表的设计实现

生产实习报告班级:通信13-2班姓名:闫振宇学号:成绩:电子与信息工程学院信息与通信工程系基于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 码输出,这样便与同显示译码器连接。

数电自主设计实验报告——Verilog秒表

数电自主设计实验报告——Verilog秒表

姓名班级学号实验日期节次教师签字成绩基于BASYS2开发板的记忆秒表设计一、实验目的1、熟悉基于Verilog HDL语言输入方式的数字电路的设计方法。

2、掌握基于FPGA的设计流程。

3、熟悉BASYS2开发板的使用方法。

4、熟悉Xilinx ISE软件的使用方法。

5、培养自己独立自主设计并完成实验的能力。

二、总体设计方案或技术路线本实验利用BASYS2开发板的已有资源来进行设计实验,并用Xilinx ISE软件来编写和综合Verilog代码。

总体设计方案是设计一个带有记忆功能的秒表。

具体而言,该秒表通过BASYS2开发板的50M的时钟进行分频计时,最大计时时间为99.99s,用4位数码管动态显示计时时间,除了有基本的运行、暂停及复位清空功能,还有存储当前时间和查看存储时间的功能。

三、实验电路图BASYS2开发板原理图--数码管板上数码管为4位共阳极数码管,每段为低电平点亮,位选接了三极管增大驱动电流,同时为非逻辑,所以位选信号为低电平有效。

BASYS2开发板原理图--按键本实验用到了两个按键BTN0和BTN1,BTN0为复位按键,对应程序的clear信号,BTN1为存储按键,对应程序的btn[1]信号,按一次该按键数据存储一次,下一次按下时这一次存的数据将被替换掉。

BASYS2开发板原理图--开关本实验用到了两个开关SW7和SW1,SW7为运行、暂停开关,对应程序的sw[0]信号,开关打到上方为运行,下方为暂停,SW1为显示切换开关,对应程序的sw[1]信号,在计时暂停的前提下,将开关打到上方显示出存储的时间数据。

四、仪器设备名称、型号和技术指标硬件:BASYS2开发板软件:Xilinx ISE(编程)、Digilent Adept(下载)五、程序流程图六、程序源代码/////////////////////////////////////////////////////////程序文件`timescale 1ns / 1ps////////////////////////////////////////////////////////////////////////////////// // Company:// Engineer://// Create Date: 15:45:01 11/26/2014// Design Name:// Module Name: miaobiao// Project Name:// Target Devices:// Tool versions:// Description://// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments://///////////////////////////////////////////////////////////秒表的顶层模块module miaobiao(input wire clk,///////////////////////////////开发板系统时钟50MHzinput wire[1:0] btn,////////////////////////两个按键:[0]复位和[1]存时间input wire[1:0] sw,/////////////////////////两个开关:[0]运行/暂停和[1]显示存储时间output wire[7:0] smg,/////////////////////数码管的8个段选信号output wire[3:0] smg_an/////////////////数码管的4个位选信号);wire clear;assign clear=btn[0];////////////////////////////////////将复位按键信号传给clear变量wire clk_1k;clkdiv #(50000) m0(clk,clear,clk_1k);//将50MHz进行5万分频输出1kHz时钟信号wire[15:0]number;timer m1(sw[0]&clk_1k,clear,number);///////////计时器模块,输出当前时间数据wire[15:0]num_save;save m2(clk,clear,btn[1],number,num_save);//////按键按下存储当前时间wire[15:0]num_display;/////////////////////////////////////////////////////////////////////////////根据开关状态选择显示内容choose_4num m3(sw,number,num_save,num_display);display m4(clk_1k,clear,num_display,smg,smg_an);///////将数字送给数码管显示endmodule///////////////////////////////////////////////////////////////////////////////4选1数据选择器模块module choose_4num(input wire[1:0]sw,input wire[15:0]number,input wire[15:0]num_save,output reg[15:0]num_display);always@(*)case(sw)0:num_display<=number;/////////////显示内容为当前时间1:num_display<=number;/////////////。

毕业论文-基于fpga(verilog)的数字式秒表设计说明书

毕业论文-基于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语言编程的数字秒表设计

基于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 下载电路到核心芯片,驱动硬件工作。

秒表vhdl

秒表vhdl

EDA实验报告秒表一、实验目的实现秒表功能, 要求有分,秒,1%秒显示.二、实验原理:一百进制的十毫秒,分计数器和六十进制的秒计数器;以及十毫秒,秒,分的译码显示部分。

输入:p_clk 100Hz 基准时钟输入IO30p_rst 复位输入IO41p_ena 秒表启/停IO40输出:s100l 1%秒低位显示IO08..IO11 s100h 1%秒高位显示IO12..IO15 s1l 秒低位显示IO16..IO19 s1h 秒高位显示IO20..IO22 m1l 分低位显示IO32..IO35 m1h 分高位显示IO36..IO38三、试验仪器EDA试验箱、PC机四、试验步骤1破解软件2、新建工程3、程序输入及编译新建文件并输入程序并进行编译。

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY EX18 ISPORT (p_clk: IN STD_LOGIC; -- 100Hz -- IO30(P125)p_rst: IN STD_LOGIC; -- IO41(P119)p_ena: IN STD_LOGIC; -- IO40(P118)s100l: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -- IO11..IO08 (P59, P51, P49, P48) s100h: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -- IO15..IO12 (P64, P63, P62, P60) s1h : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); -- IO22..IO20 (P73, P72, P70)s1l : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -- IO19..IO16 (P69, P68, P67, P65) m1h : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); -- IO38..IO36 (P116, P114, P113)m1l : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) -- IO35..IO32 (P112, P111, P110, P109) );END EX18;ARCHITECTURE behv OF EX18 ISSIGNAL clks10 : STD_LOGIC;SIGNAL clks1 : STD_LOGIC;SIGNAL clk10s : STD_LOGIC;SIGNAL clk1m : STD_LOGIC;SIGNAL clk10m : STD_LOGIC;COMPONENT cnt10PORT (clk : IN STD_LOGIC;rst : IN STD_LOGIC;ena : IN STD_LOGIC;outy: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); cout: OUT STD_LOGIC);END COMPONENT;COMPONENT cnt6PORT (clk : IN STD_LOGIC;rst : IN STD_LOGIC;ena : IN STD_LOGIC;outy: OUT STD_LOGIC_VECTOR(2 DOWNTO 0); cout: OUT STD_LOGIC);END COMPONENT;BEGINu_s100l:cnt10 PORT MAP (clk => p_clk ,rst => p_rst ,ena => p_ena ,outy => s100l ,cout => clks10);u_s100h:cnt10 PORT MAP (clk => clks10,rst => p_rst ,ena => p_ena , outy => s100h , cout => clks1 );u_s1l:cnt10 PORT MAP ( clk => clks1 , rst => p_rst , ena => p_ena , outy => s1l , cout => clk10s );u_s1h:cnt6 PORT MAP ( clk => clk10s, rst => p_rst , ena => p_ena , outy => s1h , cout => clk1m );u_m1l:cnt10 PORT MAP ( clk => clk1m , rst => p_rst , ena => p_ena , outy => m1l , cout => clk10m );u_m1h:cnt6 PORT MAP ( clk => clk10m, rst => p_rst , ena => p_ena , outy => m1h );END behv;4、时序仿真打开波形编辑器,设置仿真时间区域仿真结果RLT电路cl k ena rstcout out y 30cl k ena rstcout out y 30cl k ena rstcout out y 30cl k ena rstcout out y 20cl k ena rstcout out y 30cl k ena rstout y 20cnt 6:u _s1hs100l [3.0]s1h[2.0]s1l [3.0]m1h[2.0]m1l [3.0]cnt 10:u _s1lp_rstp_ena cnt 10:u _s100ls100h[3.0]cnt 6:u _m1hp_cl k cnt 10:u _s100hcnt 10:u _m1l5、管脚分配与锁定程序通过编译成功后,根据模式18电路的连接方法,出现如下界面:六、配置文件下载连接好试验线路,打开电源开关。

EDA基于Verilog数字秒表

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进一,同时将秒位、十分秒位和百分秒位清零;当十秒位计数到五时,将所有位清零。

秒表计时电路设计verilog

秒表计时电路设计verilog

电子科技大学通信学院秒表计时电路实验报告班级通信一班学生学号教师秒表计时电路秒表计时电路一、设计思路概述1.设计要求秒表计时功能,显示分、秒、0.01秒具有启动、暂停、停止和清空功能增加有趣的流水灯输入信号:4bit按键,50MHz时钟输出信号:6位数码管2.设计分析本设计要求秒表计时功能,显示分、秒、0.01秒,而这可以由分频电路实现,将电路的输入时钟进行分频,得到1/60Hz,1Hz,和100Hz信号,就可以达到本设计要求的显示要求了。

本设计要求具有启动、暂停、停止和清空功能,而这个可以由状态机实现,通过合理的配置状态转换,就可以达到要求。

流水灯的实现说来简单,其实也可以做的复杂,漂亮的流水灯其观赏性还是很好地,这里我们只讨论简单流水灯的实现,即单个灯从左到右逐步发光。

这实际是一个移位寄存器,我们可以通过不同的时钟来驱动它,实现不同的流水速度。

这里,我们实现了一个1Hz,和一个10Hz的流水灯电路。

二、总体设计框图及详细说明三、各部分代码设计1、500000进制计数器(分频器)设计:always @(negedge clk or negedge rst10ms)beginif (~rst10ms) beginclk10ms<=0;clk10msreg<=0;endelse if (clk10msreg == 249999) beginclk10ms<=~clk10ms ;clk10msreg<=clk10msreg+1;endelse if (clk10msreg==499999) beginclk10ms<=~clk10ms;clk10msreg<=0;endelse begin clk10msreg<=clk10msreg+1;endend2、状态机设计always @(negedge clk or negedge clear) beginif (~clear) beginstate <= idlestate; rst <= 0; rst10ms <= 0;endelse begincase (state)idlestate: beginif(~start)beginstate<= prestate; rst<=0;rst10ms<=0;endelsestate<=idlestate; endprestate: beginstate<=runstate;rst<=1;rst10ms<=1;endholdstate: beginif(~stop)beginstate<=idlestate; rst<=1;rst10ms<=0;endelse if(~start)beginstate<= runstate; rst<=1;rst10ms<=1;endelsestate<=holdstate; endrunstate: beginif(~stop)beginstate<=idlestate; rst<=1;rst10ms<=0;endelse if(~hold)beginstate<= holdstate; rst<=1;rst10ms<=0;endelsestate<=runstate;enddefault: state <= state;endcaseendend3.10进制计数器(分频器)设计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 clkout<=0;counter<=0;endelse if (counter == 4) begin clkout<=~clkout;counter<=counter+1; endelse if (counter == 9) begin clkout<=0;counter<=0; endelse begin counter<=counter+1;endendendmodule4、6进制计数器(分频器)设计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 == 2) beginclkout <= ~clkout;counter <= counter + 4'b1;endelse if (counter == 5) beginclkout <= ~clkout;counter <= 0;endelse begincounter <= counter + 4'b1;endendendmodule5、流水灯设计always @(negedge clk1s or negedge rst)beginif (~rst)ledg <= 8'b0;else if (ledg == 8'b0)ledg<=8'b10000000;elseledg<=(ledg>>1);endalways @(negedge clk100ms or negedge rst) beginif (~rst)ledr <= 18'b0;else if (ledr == 18'b0)ledr<=18'b100000000000000000;elseledr<=(ledr>>1);end6、显示译码电路设计always @(negedge clk or negedge rst) begin if (~rst) begindisplayreg <= 3'b000;segcode[0] <= 7'b1111111;segcode[1] <= 7'b1111111;segcode[2] <= 7'b1000000;segcode[3] <= 7'b1000000;segcode[4] <= 7'b1000000;segcode[5] <= 7'b1000000;segcode[6] <= 7'b1000000;segcode[7] <= 7'b1000000;endelse begincase (timeout[displayreg])0: segcode[displayreg] <= 7'b1000000;1: segcode[displayreg] <= 7'b1111001;2: segcode[displayreg] <= 7'b0100100;3: segcode[displayreg] <= 7'b0110000;4: segcode[displayreg] <= 7'b0011001;5: segcode[displayreg] <= 7'b0010010;6: segcode[displayreg] <= 7'b0000010;7: segcode[displayreg] <= 7'b1011000;8: segcode[displayreg] <= 7'b0000000;9: segcode[displayreg] <= 7'b0010000;default: segcode[displayreg] <= 7'b1111111;endcasedisplayreg <= displayreg + 3'b1;endend四、总体电路设计module today(key, ledr, ledg, hex, clk);input [3:0] key;input clk;output reg [17:0] ledr;output reg [7:0] ledg;output [55:0] hex;wire clear;wire start;wire stop;wire hold;assign clear = key[0];assign start = key[1];assign stop = key[2];assign hold = key[3];reg [19:0] clk10msreg;reg clk10ms;wire clk100ms;wire clk1s;wire clk10s;wire clk1min;wire clk10min;wire clk1h;reg [1:0] state;parameter idlestate = 2'b00, prestate = 2'b01, holdstate = 2'b10, runstate = 2'b11;reg rst;reg rst10ms;reg [2:0] displayreg;wire [3:0] timeout [7:0];reg [6:0] segcode[7:0];assign hex = {segcode[7], segcode[6], segcode[5], segcode[4], segcode[3], segcode[2], segcode[1], segcode[0]};always @(negedge clk or negedge clear) beginif (~clear) beginstate <= idlestate; rst <= 0; rst10ms <= 0;endelse begincase (state)idlestate: beginif(~start)beginstate<= prestate;rst<=0;rst10ms<=0;endelsestate<=idlestate;endprestate: beginstate<=runstate;rst<=1;rst10ms<=1;endholdstate: beginif(~stop)beginstate<=idlestate;rst<=1;rst10ms<=0;endelse if(~start)beginstate<= runstate;rst<=1;rst10ms<=1;endelsestate<=holdstate;endrunstate: beginif(~stop)beginstate<=idlestate;rst<=1;rst10ms<=0;endelse if(~hold)beginstate<= holdstate;rst<=1;rst10ms<=0;endelsestate<=runstate;enddefault: state <= state;endcaseendendalways @(negedge clk or negedge rst10ms)beginif (~rst10ms) beginclk10ms<=0;clk10msreg<=0;endelse if (clk10msreg == 249999) beginclk10ms<=~clk10ms ;clk10msreg<=clk10msreg+1;endelse if (clk10msreg==499999) beginclk10ms<=~clk10ms; clk10msreg<=0;endelse begin clk10msreg<=clk10msreg+1;endendcount6 min10counter(rst, clk10min, clk1h, timeout[7]); count10 min1counter (rst, clk1min,clk10min, timeout[6]); count6 sec10counter(rst, clk10s,clk1min, timeout[5]); count10 sec1counter (rst, clk1s, clk10s, timeout[4]); count10 ms100counter(rst, clk100ms, clk1s, timeout[3]); count10 ms10counter (rst, clk10ms, clk100ms, timeout[2]); assign timeout[1] = 4'b1111;assign timeout[0] = 4'b1111;always @(negedge clk or negedge rst) beginif (~rst) begindisplayreg <= 3'b000;segcode[0] <= 7'b1111111;segcode[1] <= 7'b1111111;segcode[2] <= 7'b1000000;segcode[3] <= 7'b1000000;segcode[4] <= 7'b1000000;segcode[5] <= 7'b1000000;segcode[6] <= 7'b1000000;segcode[7] <= 7'b1000000;endelse begincase (timeout[displayreg])0: segcode[displayreg] <= 7'b1000000;1: segcode[displayreg] <= 7'b1111001;2: segcode[displayreg] <= 7'b0100100;3: segcode[displayreg] <= 7'b0110000;4: segcode[displayreg] <= 7'b0011001;5: segcode[displayreg] <= 7'b0010010;6: segcode[displayreg] <= 7'b0000010;7: segcode[displayreg] <= 7'b1011000;8: segcode[displayreg] <= 7'b0000000;9: segcode[displayreg] <= 7'b0010000;default: segcode[displayreg] <= 7'b1111111;endcasedisplayreg <= displayreg + 3'b1;endendalways @(negedge clk1s or negedge rst)beginif (~rst)ledg <= 8'b0;else if (ledg == 8'b0)ledg<=8'b10000000;elseledg<=(ledg>>1);endalways @(negedge clk100ms or negedge rst) beginif (~rst)ledr <= 18'b0;else if (ledr == 18'b0)ledr<=18'b100000000000000000;elseledr<=(ledr>>1);endendmodulemodule count6(rst, clk, clkout, counter);input rst;input clk;output reg clkout;output reg [3:0]counter;always @(negedge clk or negedge rst) begin if (~rst) beginclkout <= 0;counter <= 0;endelse if (counter == 2) beginclkout <= ~clkout;counter <= counter + 4'b1;endelse if (counter == 5) beginclkout <= ~clkout;counter <= 0;endelse begincounter <= counter + 4'b1;endendendmodulemodule 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 clkout<=0;counter<=0;endelse if (counter == 4) begin clkout<=~clkout;counter<=counter+1; endelse if (counter == 9) begin clkout<=0;counter<=0; endelse begin counter<=counter+1;endendendmodule五、总结及心得体会通过这次试验,我们基本掌握了状态机的实现方法,进一步熟悉和掌握了Verilog HDL的基本使用方法。

verilog秒表设计【管理资料】

verilog秒表设计【管理资料】

深圳大学实验报告课程名称:数字系统设计实验项目名称:Verilog秒表设计学院:信息工程学院专业:电子信息工程指导教师:邓小莺报告人:陈耀省学号:2010130267班级:电子三班实验时间:2012年11月实验报告提交时间:2012年11月28日教务部制一、实验目的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信号有效时开始计数。

最后输出秒位与十秒位。

EDA课程设计--基于CPLD的Verilog秒表设计

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秒表

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

一、专周设计课题秒表的设计二、专周实习目的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_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语言实现

数字式秒表verilog语言实现
ISE生成DCM内核的Verilog HDL 代码:
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电子秒表设计

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 文件,观察验证所设计的电路功能。

FPGA-verilog秒表设计[合集]

FPGA-verilog秒表设计[合集]

FPGA-verilog秒表设计[合集]第一篇:FPGA-verilog秒表设计大规模集成电路秒表设计专题实习报告一、实习题目:大规模集成电路秒表设计二、模块名称:计数器,控制逻辑,译码器,数据选择器三、实习目的:对quartusII软件的使用,同时增强对Verilog HDL语言的编程与运用;将软件与硬件的使用结合起来。

掌握秒表设计的思路,各模块的设计方法,培养缜密的设计思想。

四、模块源程序:1、控制逻辑:modulemiaoobiao(CLK,CLR,PAUSE,MSH,MSL,SH,SL,MH,ML);input CLK,CLR,PAUSE;output[3:0] MSH,MSL,SH,SL,MH,ML;reg[3:0] MSH,MSL,SH,SL,MH,ML;reg cn1,cn2;always @(posedge CLK or posedge CLR)begin if(CLR)begin{MSH,MSL}<=8'h00;cn1<=0;endelse if(!PAUSE)beginif(MSL==9)begin MSL<=0;if(MSH==9)begin MSH<=0;cn1<=1;endelse MSH<=MSH+1;endelse begin MSL<=MSL+1;cn1<=0;endend end always @(posedge cn1 or posedge CLR)begin if(CLR)begin {SH,SL}<=8'h00;cn2<=0;endelseif(SL==9)begin SL<=0;if(SH==5)begin SH<=0;cn2<=1;endelseSH<=SH+1;endelse begin SL<=SL+1;cn2<=0;end end always @(posedge cn2 or posedge CLR)begin if(CLR)begin {MH,ML}<=8'h00;end elseif(ML==9)begin ML<=0;if(MH==5)MH<=0;elseMH<=MH+1;end else ML<=ML+1;end Endmodule2、计数器程序:module jishuqi(clk,state);input clk;output[2:0]state;reg [2:0]state;always @(posedge clk)if(state==5)state=0;elsestate=state+1;Endmodule3、数据选择器源程序:module mux6_1(out,in0,in1,in2,in3,in4,in5,sel);input[3:0] in0,in1,in2,in3,in4,in5;input[2:0] sel;output[3:0] out;reg[3:0] out;always @(in0 or in1 or in2 or sel)begin case(sel)3'b000:out=in1;3'b001:out=in0;3'b010:out=in3;3'b011:out=in2;3'b100:out=in5;default:out=in4;endcaseend Endmodule 4.译码器module decode47(decodeout,dec_in);input[3:0] dec_in;output[6:0] decodeout;reg[6:0] decodeout;always @(dec_in)begincase(dec_in)4'd0:decodeout=7'b1111110;4'd1:decodeout=7'b01 10000;4'd2:decodeout=7'b1101101;4'd3:decodeout=7'b111100 1;4'd4:decodeout=7'b0110011;4'd5:decodeout=7'b1011011;4'd 6:decodeout=7'b1011111;4'd7:decodeout=7'b1110000;4'd8:dec odeout=7'b1111111;4'd9:decodeout=7'b1111011;default:decod eout=7'bx;endcase end endmodule 模块图:1、控制器:2、计数器:3、6选用1选择器:4、译码器:jishu100cincin1clkrstout[7..0]coutinst9五、仿真图:六、原理图:七、心得体会:通过“秒表的设计”,书本知识与实际的融会贯通,我学到了很多: i.刚开始我什么都不懂,就抱为考试复习做准备的心态,熟悉书本知识;ii.熟悉了加法器的设计,乘法器的设计,计数器的设计,选择器的设计;iii.专周从刚开始没头绪,到从模块设计,到程序的书写,到波形的仿真,到网表生成,到引脚的定义,基本熟悉了秒表的设计过程;iv.从最基本的verilog HDL语言的基本要数,到行为语句的熟悉,一步一步的将书本的知识应用到专周的设计中;v.vi.熟悉了Quartus7.2软件的应用;Verilog HDL 过程赋值语句,“always”过程语句通常带触发条件,assign为持续赋值语句;vii.条件语句case多用于译码器,数据选择器中,一般case(敏感表达式);viii.ix.x.复习了同步清零和异步清零的区别;中间我们遇到的问题是怎么选位和怎么选段;以及怎么将编辑的模块联系起来;第二篇:实习报告-单片机秒表设计目录第1章单片机系统硬件电路 (1)1.1 实习目的..............................................................................................1 1.2 单片机型号及特性..............................................................................1 1.3 单片机开发板.. (2)第2章单片机应用系统软件 (5)2.1 STC下载软件......................................................................................5 2.2 Keil软件...............................................................................................5 2.3 外部电路驱动.. (6)第3章00-59秒计时器设计 (7)3.1 电路原理图..........................................................................................7 3.2 设计原理..............................................................................................7 3.3 实现方法. (8)第4章实习总结 (9)4.1 实习体会..............................................................................................9 4.2 设计硬件体会.. (9)参考文献.................................................................................................................10 附录 1 实物图........................................................................................................11 附录2 系统主要程序.. (12)I东北石油大学生产实习总结报告第1章单片机系统硬件电路1.1 实习目的了解单片机最小系统;了解keilc软件操作,程序下载及调试方法;掌握单片机外部电路使用;掌握键盘和数码管显示编程方法;应用单片机开发板进行实验开发;1.2 单片机型号及特性1、AT89S51单片机功能及特点5l系列单片机中典型芯片(AT89S51)采用40引脚双列直插封装(DIP)形式,内部由CPU,4kB的ROM,256 B的RAM,2个16b的定时/计数器TO和T1,4个8 b的I/O端I:IP0,P1,P2,P3,一个全双功串行通信口等组成。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《HDL语言应用与设计》
实验报告
基于Verilog HDL数字秒表的设计
班级:信科13-01班
姓名:张谊坤
学号:
教师:王冠军
基于Verilog HDL数字秒表的设计
一、秒表功能
1. 计时范围:00:00:00—59:59:99
2. 显示工作方式:八位数码管显示
3.具有暂停和清零的功能
二、实验原理
1.实验设计原理
(1)秒表的逻辑结构较简单,它主要由十进制计数器、六进制计数器、分频器、数据选择器、和显示译码器等组成。

在整个秒表中最关键的是如何获得一个精确的100HZ计时脉冲,除此之外,整个秒表还需有一个启动信号和一个清零信号,以便秒表能随意停止、启动以及清零复位。

(2)秒表有共有8个输出显示,其中6个显示输出数据,分别为百分之一秒、十分之一秒、秒、十秒、分、十分,所以共有6个计数器与之相对应;另外两个为间隔符,显示‘-’。

8个计数器的输出全都为BCD码输出,这样便与同显示译码器连接。

(3)可定义一个24位二进制的寄存器hour用于存放8个计数器的输出,寄存器从高位到低位每连续4位为一组,分别存放百分之一秒、十分之一秒、间隔符、秒、十秒、间隔符、分、十分。

由频率信。

相关文档
最新文档