基于verilog的数字秒表的设计实现1
FPGA电子秒表计时器verilog实验报告

华中科技大学《电子线路设计、测试与实验》实验报告实验名称:用EDA技术设计多功能数字钟院(系):电子信息与通信学院专业班级:姓名:学号:时间:地点:实验成绩:指导教师:2018 年 3 月 27 日一. 实验任务及要求基本要求:电子秒表1)可计时的范围0.00s~99.99s(显示用七段数码管,显示小数点)。
2)能够暂停,能够在计时结束使用灯光或者声音报警提示。
提高要求: PWM波产生器1)可输出占空比按10%递进的PWM波(示波器测量查看)。
二.实验条件实验板:Nexys4 DDR实验软件:ISE14.7,ModelSim三.预习要求1.NEXYS 4 DDR开发板说明。
2.有限状态机。
3.数码管扫描显示。
四.实验原理1.电子秒表设计框图模块分析1)分频模块(Divider.v)将系统给定的100MHZ 的频率通过分频模块变成100Hz 的clk(用来计时)和4000Hz的clk_seg(用来扫描数码管)。
代码如下:原理:输入的100MHz 的信号为CLK_100MHz,每当CLK_100MHz 上升沿来时,Count_DIV 计数加1,且每当Count_DIV =100M/(2*100)=0.5M 时,CLK_Out取反一次并且Count_DIV <=0,这样会得到一个100Hz 的信号。
当需要得到4000Hz的clk_seg时,在顶层模块中修改parameter OUT_Freq=4000;这样,每当Count_DIV=100M/(2*4000)=12500时,CLK_Out取反一次并且Count_DIV <=0,这样会得到一个4000Hz 的信号。
在主程序中修改参数如下:仿真时,为便于观察,在testbench中,将CLK_100MHz的周期设为2ns:always #1 CLK_100MHz <= ~CLK_100MHz;并修改参数如下,验证分频模块的正确性(图中数字16,8,1只表示频率的倍数关系,并非真正的频率)其仿真图如下图:从图中可以看出,CLK_100MHz的周期为2ns,clk_seg的周期为4ns,clk的周期为32ns,符合倍数关系,故分频模块的正确性得到验证。
用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秒表

姓名班级学号实验日期节次教师签字成绩基于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;/////////////。
简单的数字时钟(verilog设计)

设计目标与要求
设计一个简单的数字 时钟,能够显示时、 分、秒。
时钟应具有可靠性、 稳定性和可扩展性。
要求使用Verilog语 言实现,并能够在 FPGA或ASIC上实现。
设计思路及流程
• 设计思路:采用模块化设计方法,将数字时钟划分为不同的模 块,如计数器模块、显示模块等。每个模块负责实现特定的功 能,并通过接口与其他模块进行通信。
设计思路及流程
设计流程 1. 确定设计需求和目标。 2. 制定设计方案和计划。
设计思路及流程
3. 编写Verilog代码,实现各个模块的功能。 5. 根据测试结果进行调试和优化。
未来改进方向探讨
提高计时精度
通过改进算法或采用更高 性能的硬件平台,提高数
字时钟的计时精度。
降低资源占用
优化代码结构,减少不 必要的资源占用,提高 时钟系统的运行效率。
增加实用功能
拓展应用领域
考虑增加闹钟、定时器 等实用功能,使数字时 钟更加符合用户需求。
探索将数字时钟应用于 更多领域,如智能家居、
数据类型与运算符
Verilog中的数据类型包括
整型、实型、时间型、数组、结构体等。
Verilog中的运算符包括
算术运算符、关系运算符、逻辑运算符、位运算符等。
顺序语句与并行语句
Verilog中的顺序语句包括
赋值语句、条件语句、循环语句等,用于描述电路的时序行为。
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秒表设计姓名学号指导教师二О一一年月日一.设计任务设计一个秒表,要求精度达到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四.总结及心得这次课程设计主要碰到的是编程问题。
基于FPGA的数字秒表的设计与实现

现代电子技术综合实验一、性能指标(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;主要语句: 功能: 在输入信号的作用下,输出信号发生翻转,产生控制计数器的使能控制信号。
verilogEDA数字秒表设计quartus

课程考查报告课程名称 EDA技术题目名称数字电子钟学生学院信息工程学院专业班级通信工程09(1)班学号 310900xx 学生姓名陈 XX 任课教师李学易2013 年12月27日电子钟设计目的:根据实验板的资源和利用Quartus II软件编译、仿真可以实现电子钟的数字系统设计。
设计内容:数字电子钟的功能:1、时钟显示功能(显示时、分、秒)2、时钟调整功能(小时、分钟的校准)3、闹钟设置功能设计方案:根据程序设计需要,信号的定义如下:Clk:标准时钟信号,频率为4HzClk_1k:产生闹铃声、报时声的时钟信号,频率为1024HzMode:功能控制信号,为0:计时功能;1:闹钟功能;2:手动校时功能Turn:接按键,在手动校时功能时,选择的是校准小时,还是分钟;若长时间按该键,可使秒信号清零Change:接按键,在手动校时时,每按一次,计数器加一若长按,则连续快速加一Hour,min,sec:此三信号分别输出并显示时、分、秒信号Alert:输出到扬声器的信号,产生闹钟音和报时音;闹钟音为持续20秒的“嘀嘀嘀”音,若按住change键,则可屏蔽该音;报时音为“嘀嘀嘀嘀嘟”四短一长音。
Ld_alert:接发光二极管,指示是否设置了闹钟功能Ld_hour:接发光二极管,指示当前调整的是小时信号Ld_min:接发光二极管,指示当前调整的是分钟信号实验结果:时序仿真图:RTL图:心得体会:经过一周的EDA课程设计,对用verilog语言设计数字系统有了一定认识。
设计过程当然有点累,可是当完成这个设计时,内心是无比的高兴。
通过这次的课程设计,很好地把课堂理论和实践结合起来,认识更深刻了。
设计中遇到过很多问题,这时耐心、细心是不可缺少的,通过查阅网上资料和其他参考文献以及和别人交流,最终都把问题解决了。
当然其中也缺少不了庞老师的耐心指导,在此,感谢庞老师的教导!参考文献:《Verilog数字系统设计教程》第2版夏宇闻编著《Verilog的135个经典设计实例》王金明编著源代码:module digital_watch(clk,clk_1k,mode,change,turn,alert,hour,min,sec,LD_alert,LD_hour,LD_min);input clk,clk_1k,mode,change,turn;output alert,LD_alert,LD_hour,LD_min;output[7:0] hour,min,sec;reg[7:0] hour,min,sec,hour1,min1,sec1,ahour,amin;reg[1:0] m,fm,num1,num2,num3,num4;reg[1:0] loop1,loop2,loop3,loop4,sound;reg LD_hour,LD_min;reg clk_1Hz,clk_2Hz,minclk,hclk;reg alert1,alert2,ear;reg count1,count2,counta,countb;wire ct1,ct2,cta,ctb,m_clk,h_clk;always @(posedge clk)beginclk_2Hz<=~clk_2Hz;if(sound==3) begin sound<=0; ear<=1; end//ear 信号用于产生或屏蔽声音else begin sound<=sound+1; ear<=0; endendalways @(posedge clk_2Hz) //由4Hz 的输入时钟产生1Hz 的时基信号clk_1Hz<=~clk_1Hz;always @(posedge mode) //mode 信号控制系统在三种功能间转换begin if(m==2) m<=0; else m<=m+1; endalways @(posedge turn)fm<=~fm;always //该进程产生count1,count2,counta,countb 四个信号begincase(m)2: beginif(fm)begin count1<=change; {LD_min,LD_hour}<=2; end elsebegin counta<=change; {LD_min,LD_hour}<=1; end {count2,countb}<=0;end1: beginif(fm)begin count2<=change; {LD_min,LD_hour}<=2; end elsebegin countb<=change; {LD_min,LD_hour}<=1; end {count1,counta}<=2'b00;enddefault: {count1,count2,counta,countb,LD_min,LD_hour}<=0;endcaseendalways @(negedge clk)//如果长时间按下“change”键,则生成“num1”信号用于连续快速加1if(count2)beginif(loop1==3) num1<=1;elsebegin loop1<=loop1+1; num1<=0; endendelse begin loop1<=0; num1<=0; endalways @(negedge clk) //产生num2 信号if(countb)beginif(loop2==3) num2<=1;elsebegin loop2<=loop2+1; num2<=0; endendelse begin loop2<=0; num2<=0; endalways @(negedge clk)if(count1)beginif(loop3==3) num3<=1;elsebegin loop3<=loop3+1; num3<=0; endendelse begin loop3<=0; num3<=0; endalways @(negedge clk)if(counta)beginif(loop4==3) num4<=1;elsebegin loop4<=loop4+1; num4<=0; endendelse begin loop4<=0; num4<=0; endassign ct1=(num3&clk)|(!num3&m_clk); //ct1 用于计时、校时中的分钟计数assign ct2=(num1&clk)|(!num1&count2); //ct2 用于定时状态下调整分钟信号assign cta=(num4&clk)|(!num4&h_clk); //cta 用于计时、校时中的小时计数assign ctb=(num2&clk)|(!num2&countb); //ctb 用于定时状态下调整小时信号always @(posedge clk_1Hz) //秒计时和秒调整进程if(!(sec1^8'h59)|turn&(!m))beginsec1<=0; if(!(turn&(!m))) minclk<=1;end//按住“turn”按键一段时间,秒信号可清零,该功能用于手动精确调时else beginif(sec1[3:0]==4'b1001)begin sec1[3:0]<=4'b0000; sec1[7:4]<=sec1[7:4]+1; endelse sec1[3:0]<=sec1[3:0]+1; minclk<=0;endassign m_clk=minclk||count1;always @(posedge ct1) //分计时和分调整进程beginif(min1==8'h59) begin min1<=0; hclk<=1; endelse beginif(min1[3:0]==9)begin min1[3:0]<=0; min1[7:4]<=min1[7:4]+1; endelse min1[3:0]<=min1[3:0]+1; hclk<=0;endendassign h_clk=hclk||counta;always @(posedge cta) //小时计时和小时调整进程if(hour1==8'h23) hour1<=0;else if(hour1[3:0]==9)begin hour1[7:4]<=hour1[7:4]+1; hour1[3:0]<=0; end else hour1[3:0]<=hour1[3:0]+1;always @(posedge ct2) //闹钟定时功能中的分钟调节进程if(amin==8'h59) amin<=0;else if(amin[3:0]==9)begin amin[3:0]<=0; amin[7:4]<=amin[7:4]+1; end else amin[3:0]<=amin[3:0]+1;always @(posedge ctb) //闹钟定时功能中的小时调节进程if(ahour==8'h23) ahour<=0;else if(ahour[3:0]==9)begin ahour[3:0]<=0; ahour[7:4]<=ahour[7:4]+1; end else ahour[3:0]<=ahour[3:0]+1;always //闹铃功能if((min1==amin)&&(hour1==ahour)&&(amin|ahour)&&(!change)) //若按住“change”键不放,可屏蔽闹铃音if(sec1<8'h20) alert1<=1; //控制闹铃的时间长短else alert1<=0;else alert1<=0;always //时、分、秒的显示控制case(m)3'b00: begin hour<=hour1; min<=min1; sec<=sec1; end//计时状态下的时、分、秒显示3'b01: begin hour<=ahour; min<=amin; sec<=8'hzz; end//定时状态下的时、分、秒显示3'b10: begin hour<=hour1; min<=min1; sec<=8'hzz; end//校时状态下的时、分、秒显示endcaseassign LD_alert=(ahour|amin)?1:0; //指示是否进行了闹铃定时assign alert=((alert1)?clk_1k&clk:0)|alert2; //产生闹铃音或整点报时音always //产生整点报时信号alert2beginif((min1==8'h59)&&(sec1>8'h54)||(!(min1|sec1)))if(sec1>8'h54) alert2<=ear&clk_1k; //产生短音else alert2<=!ear&clk_1k; //产生长音else alert2<=0;endendmodule。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于FPGA数字秒表的设计实现一、测试要求1 有源晶振频率:48MHZ2 测试计时范围:00’00”00 ~ 59’59”99,显示的最长时间为59分59 秒3 数字秒表的计时精度是10ms4 显示工作方式:a、用八位BCD七段数码管显示读数b、采用记忆显示方法c、用两个按钮开关(一个按钮使秒表复位,另一个按钮控制秒表的启动/暂停)二、设计要求1 设计出符合设计要求的解决方案2设计出单元电路3 利用软件对各单元电路及整体电路进行仿真4 在开发板上实现设计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时,计数器清零。
(5)、定义18位寄存器count用于存放分频和扫描用的计数值。
48MHZ的时钟信号480000分频,得到100HZ的时钟信号,而计数器已48MHZ的时钟信号218分频扫描8个七段译码器。
2 实验设计方案利用一块芯片完成除时钟源,按键和显示器之外的所有数字电路功能。
所有数字逻辑功能都在CPLD器件上用Verilog语言实现。
这样设计具有体积小,设计周期短,调试方便,故障率地和修改升级容易等特点,本设计采用依次进行消抖、分频、数码管动态扫描、显示(译码)和计数流水线的设计方法。
3 实验原理框图秒表原理框图扫描显示分频48MhzReg[1:0]]计数100hz五、软件设计与波形仿真1、秒表计数单位与对应输出信号hour[3:0] 百分之一秒hour[7:4] 十分之一秒hour[11:8] 秒Hour15:12] 十秒Hour[19:16] 分hour[23:20] 十分2、计数器总程序:`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company:// Engineer://// Create Date: 20:10:58 04/19/2012// Design Name:// Module Name: mbiao1// Project Name:// Target Devices:// Tool versions:// Description://// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments:///////////////////////////////////////////////////////////////////////////////////module mbiao1(clk_48M,dig,seg,ena,key);input[1:0] key;input clk_48M; //输入频率为48MHZ的时钟output[2:0] dig; //数码管位选output[7:0] seg; //数码管段选output ena; //3-8译码器使能reg[2:0] dig,count3b;reg[7:0] seg;reg[3:0] disp_dat; //定义显示数据寄存器reg[18:0]count; //定义计数寄存器reg[23:0]hour; //定义现在时刻寄存器reg clk100; //48MHZ的时钟信号480000分频,得到100HZ的时钟信号reg key_flag; //启动/暂停的切换标志reg [1:0]key_inner;assign ena=0;//按键输入缓存always @(posedge count[16])beginkey_inner<= key;endalways @(negedge key_inner[0])beginkey_flag=~key_flag;end//0.01秒信号产生部分,产生100HZ的时钟信号always @ (posedge clk_48M)beginif(count==239999)beginclk100<=~clk100;count<=0;endelsecount<=count+1'b1;end//数码管动态扫描显示部分always @(posedge count[10]) begincount3b=count3b+1;case(count3b)3'd0:disp_dat=hour[3:0];3'd1:disp_dat=hour[7:4];3'd2:disp_dat=4'ha;3'd3:disp_dat=hour[11:8];3'd4:disp_dat=hour[15:12];3'd5:disp_dat=4'ha;3'd6:disp_dat=hour[19:16];3'd7:disp_dat=hour[23:20];default:disp_dat=4'bxxxx;endcasedig=count3b;endalways @(disp_dat)begincase(disp_dat)4'h0:seg=8'hc0;4'h1:seg=8'hf9;4'h2:seg=8'ha4;4'h3:seg=8'hb0;4'h4:seg=8'h99;4'h5:seg=8'h92;4'h6:seg=8'h82;4'h7:seg=8'hf8;4'h8:seg=8'h80;4'h9:seg=8'h90;4'ha:seg=8'hbf;default:seg=8'bxxxxxxxx;endcaseend//计时处理部分always @(posedge clk100)//计时处理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;endendendendendendendmodule2.1计数时的仿真波形2.2清零时的仿真波形2.3暂停时的仿真波形六、硬件实现1、用ISE软件对程序进行编译,并下载到硬件FPGA板子上进行硬件实现。
板子上6个计数器与百分之一秒、十分之一秒、秒、十秒、分、十分相对应,并且开始00’00”00 ~ 59’59”99的计数,用两个数码管显示“-”用于分与十秒的间隔,十分之一秒与秒的间隔。
2、Run/stop和Reset功能键由FPGA板子上的开关栏的key[0]和key[1]代替。
按一下key[0]键,数码管上的时间停止计时,然后按下key[1]键,数码管上时间清零复位为00’00”00;接着再按一下key[0]键,数码管从新开始计时。
七、心得体会刚开始写程序时常因Verilog HDL语言的不熟悉,常出现综合错误的问题,但只要仔细检查、并经常使用该语言后,就会在很大程度上避免诸如语法错误等非逻辑问题。
在定义寄存器用于计数功能时,最好先赋初值。
对于复杂的逻辑功能的电路实现,可以采用分模块的方法,以便检查程序的正误,而对于功能较简单的电路设计,只需要一个模块,从而避免在模块间连接时出现错误。
对于需要存放的比较大数据,最好直接采用整型,而不用定义寄存器,从而避免数据溢出。
写程序时应该养成良好的书写习惯,如在关键处加备注;定义变量、工程名、文件名时应用能“望词生义”的效果;嵌套程序应对齐书写等。