Verilog秒表计时电路
- 格式:doc
- 大小:2.39 MB
- 文档页数:7
课程名称:数字系统设计一、实验目的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代码。
一、设计题目:基于VHDL语言的电子秒表设计(可调时,有闹钟、定时功能)二、设计目的:⑴掌握较复杂的逻辑设计和调试⑵学习用原理图+VHDL语言设计逻辑电路⑶学习数字电路模块层次设计⑷掌握QuartusII软件及Modelsim软件的使用方法三、设计内容:(一)设计要求1、具有以二十四小时计时、显示、整点报时、时间设置和闹钟的功能。
2、设计精度要求为1S。
(二).系统功能描述1 . 系统输入:系统状态及校时、定时转换的控制信号为k、set、ds;时钟信号clk,采用实验箱的50MHz;系统复位信号为reset。
输入信号均由按键产生。
系统输出:8位LED七段数码管显示输出,蜂鸣器声音信号输出。
多功能数字钟系统功能的具体描述如下:2. 计时:set=1,ds=1工作状态下,每日按24h计时制计时并显示,蜂鸣器无声,逢整点报时。
3. 校时:在set=0,ds=0状态下,按下“k键”,进入“小时”校准状态,之后按下“k键”则进入“分”校准状态,继续按下“k键”则进入“秒校准”状态,之后如此循环。
1)“小时”校准状态:在“小时”校准状态下,显示“小时”数码管以1Hz的频率递增计数。
2)“分”校准状态:在“分”校准状态下,显示“分”的数码管以1Hz的频率递增计数。
3)“秒”复零状态:在“秒复零”状态下,显示“分”的数码管以1Hz的频率递增计数。
4. 整点报时:蜂鸣器在“59”分钟的第50—59,以1秒为间隔分别发出1000Hz,500Hz的声音。
5. 显示:采用扫描显示方式驱动8个LED数码管显示小时、分、秒。
闹钟:闹钟定时时间到,蜂鸣器发出交替周期为1s的1000Hz、500Hz的声音,持续时间为一分钟;6. 闹钟定时设置:在set=0,ds=1状态下,按下“k”,进入闹钟的“时”设置状态,之后按下“k键”进入闹钟的“分”设置状态,继续按下“k 键”则进入“秒”设置状态, 之后如此循环。
1)闹钟“小时”设置状态:在闹钟“小时”设置状态下,显示“小时”的数码管以1Hz 的频率递增计数。
电子钟(FPGA设计verilog代码)//*****************************************//电子钟:24小时制时分秒////作者:yotain////clk 50M时钟 CP 1Hz输出可接LED指示灯//nCR 清零(必须接低电平异步清零)//Adj_Min (分校正低电平计时必须接)//Adj_Hour (时校正低电平计时必须接)//dataout (数码管输出)//en (数码管使能端)//(Hour Minute Second 可以不接也可以单独接数码管一位的) //修改bcd_decoder 即可修改显示////*****************************************//************ timeclock top block*************module top_clock ( Hour, Minute, Second, CP, nCR, EN, Adj_Min, Adj_Hour,clk,dataout,en) ;input clk, nCR, EN, Adj_Min, Adj_Hour;output CP;output [7:0] Hour, Minute, Second,dataout;output [3:0] en;wire [7:0] Hour, Minute, Second, dataout;supply1 Vdd;wire MinL_EN, MinH_EN, Hour_EN;//**************Hour, Minute, Second counter************counter10 U1 ( Second[3:0], nCR, EN, CP);counter6 U2 ( Second[7:4], nCR, ( Second[3:0]==4'h9), CP);assign MinL_EN = Adj_Min? Vdd : (Second==8'h59);assign MinH_EN = ( Adj_Min &&( Minute [3:0] ==4'h59))|| ( Minute[3:0]==4'h9)&& (Second == 8'h59);counter10 U3 ( Minute[3:0], nCR, MinL_EN,CP);counter6 U4 ( Minute[7:4], nCR, MinH_EN,CP);assign Hour_EN = Adj_Hour ? Vdd: ((Minute == 8'h59)&&(Second == 8'h59));counter24 U5 ( Hour[7:4], Hour[3:0], nCR, Hour_EN,CP);bcd_decoder U6 (clk,nCR,Hour[7:4],Hour[3:0],Minute[7:4],Minute[3:0],dataout,en);PULSE U7(clk,CP);endmodule//**************counter10 ( BCD 0~9 )*************module counter10 ( Q, nCR, EN, CP);input CP, nCR, EN;output [3 : 0] Q;reg [3 : 0] Q;always @ (posedge CP or negedge nCR)beginif( !nCR ) Q<=4'b0000;else if ( !EN ) Q<=Q;else if ( Q ==4'b1001) Q <= 4'b0000;else Q <= Q+1'b1;endendmodule//**************counter6 ( BCD 0~5 )************ module counter6 ( Q, nCR, EN, CP);input CP, nCR, EN;output [3:0] Q;reg [3:0] Q;always @ (posedge CP or negedge nCR ) beginif(!nCR) Q<= 4'b0000;else if (!EN) Q<=Q;else if (Q == 4'b0101) Q<=4'b0000;else Q <= Q + 1'b1;endendmodule//***************counter24 ( 0~23 )************** module counter24 ( CntH, CntL, nCR, EN, CP); input CP, nCR, EN;output[3:0] CntH,CntL;reg [3:0] CntH,CntL;reg CO;always @ (posedge CP or negedge nCR)if(!nCR) {CntH,CntL} <=8'h00;else if(!EN) {CntH,CntL} <= {CntH,CntL};else if ( (CntH>2)||(CntL>9) || ( (CntH==2)&&(CntL>=3) ) ) {CntH,CntL} <=8'h00;else if((CntH==2)&&(CntL<3))beginCntH<=CntH;CntL<=CntL+1'b1;endelse if (CntL==9)beginCntH=CntH+1'b1;CntL=4'b0000;endelse beginCntH<=CntH;CntL<=CntL+1'b1;endendendmodule//*************cnt_1Hz*****************module PULSE ( clk, clk_1Hz);input clk;output clk_1Hz;reg [24:0] cnt_1Hz;reg R_clk=0;assign clk_1Hz=R_clk;always @ (posedge clk)if (cnt_1Hz==50000000) cnt_1Hz<=0;else cnt_1Hz<=cnt_1Hz+1;endalways @ (posedge clk)beginif(cnt_1Hz<=25000000) R_clk<=1;else R_clk<=0;endendmodule//*************bcd_decoder*************module bcd_decoder (clk,nCR,A,B,C,D,dataout,en);input clk; //system clockinput nCR; //system reset,low is activeinput [3:0] A,B,C,D;output[7:0] dataout;output[3:0] en; //enable high is activereg[7:0] dataout;reg[4:0] en;reg[15:0] cnt_scan;reg[3:0] dataout_buf;always@(posedge clk or negedge nCR)beginif(!nCR) begincnt_scan<=0;endelse begincnt_scan<=cnt_scan+1; endendalways@(cnt_scan) begincase(cnt_scan[15:14]) 2'b00:en=4'b0001;2'b01:en=4'b0010;2'b10:en=4'b0100;2'b11:en=4'b1000; default:en=4'b1111; endcaseendalways@(en)begincase(en)4'b0001:dataout_buf=A;4'b0010:dataout_buf=B;4'b0100:dataout_buf=C;dataout_buf=D; default:dataout_buf=4'b0000; endcaseendalways@(dataout_buf) begincase(dataout_buf)4'b0000:dataout=8'b1111_1100; 4'b0001:dataout=8'b0110_0000; 4'b0010:dataout=8'b1101_1010; 4'b0011:dataout=8'b1111_0010; 4'b0100:dataout=8'b0110_0110; 4'b0101:dataout=8'b1011_0110; 4'b0110:dataout=8'b1011_1110; 4'b0111:dataout=8'b1110_0000; 4'b1000:dataout=8'b1111_1110; 4'b1001:dataout=8'b1110_0110;dataout=8'b1110_1110; 4'b1011:dataout=8'b0011_1110; 4'b1100:dataout=8'b1001_1100; 4'b1101:dataout=8'b0111_1010; 4'b1110:dataout=8'b1001_1110; 4'b1111:dataout=8'b1000_1110; default :dataout=8'b0000_0010; endcaseendendmodule//End of RTL code。
数字秒表设计系别:电子通信工程系专业:电子信息工程班级:学号:姓名:数字秒表(基于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 下载电路到核心芯片,驱动硬件工作。
Verilog数字时钟计数器电路设计一、引言Verilog是一种硬件描述语言,用于描述、设计和模拟数字电路。
数字时钟计数器电路是数字电子系统中常见的模块,用于产生时钟信号和计数功能。
本文将介绍如何使用Verilog语言设计数字时钟计数器电路。
二、电路功能数字时钟计数器电路的功能是产生一个稳定的时钟信号,并实现计数功能,用于驱动数字系统中的时序逻辑。
该电路通常包括时钟发生器和计数器两部分,时钟发生器用于产生稳定的时钟信号,而计数器用于对时钟信号进行计数。
三、Verilog语言简介Verilog是一种硬件描述语言,它可以用于描述数字电路的结构、行为和时序特性。
Verilog语言具有丰富的语法结构,包括模块、端口、信号、赋值语句、过程块等,可以描述数字电路中的各种逻辑和时序操作。
四、数字时钟计数器电路设计1. 模块定义我们需要使用Verilog语言定义数字时钟计数器的模块。
模块是Verilog语言中的最基本单元,用于描述数字电路的结构和行为。
以下是数字时钟计数器模块的定义:```verilogmodule clk_counter(input wire clk,input wire rst,output reg [3:0] count);```在上面的代码中,我们定义了一个名为`clk_counter`的模块,该模块包括一个时钟输入`clk`、一个复位输入`rst`和一个4位计数输出`count`。
2. 时钟发生器接下来,我们需要设计时钟发生器模块,用于产生稳定的时钟信号。
以下是时钟发生器模块的定义:```verilogmodule clk_generator(output reg clk);always #10 clk = ~clk;endmodule```在上面的代码中,我们定义了一个名为`clk_generator`的模块,该模块包括一个时钟输出`clk`。
通过`always`块和`#10`延时控制,我们实现了一个简单的时钟发生器,每10个时间单位翻转一次。
实验五秒表设计及验证一、功能介绍该SPEC指导设计一个具有秒表功能的模块,功能描述如下:·秒表计时功能。
当rst_n无效时,sw_en使能后,从00:00开始计时,当计时到达预设的定时时间,产生time_out高电平信号,计时继续;sw_en置低时计时停止,当前时间保持不变;·Pause信号有效时,当前显示时间不变,但计时仍继续。
当pause信号无效后,恢复计时,显示当前计时时间。
·Clear信号有效时,计时清零。
·计时到达59’99时,从零重新计时并且将time_out信号置为无效;·输出当前计时的秒数,精度为0.01秒(显示毫秒数的百位和个位);·全局rst_n信号(低电平有效)发生时,秒表清零,计时停止,并且将之前的time_out信号置低。
二、端口定义表1 秒表端口定义三、FPGA验证完成对上述SPEC描述的StopWatch设计,请务必保证可综合的代码风格。
该部分描述使用Virtex-5 XC5VLX50T开发板,通过PS2外接键盘控制,通过HDMI接口外接屏幕来直观的显示和验证上述设计功能的正确性。
验证要求:·FPGA输入时钟为100MHZ晶振,需要将其分频为100HZ(时间精度是0.01 second); ·用拨码开关作为rst_n信号;·使用一个按键←作为计时使能信号,模拟sw_en的功能;按一次开始计时,第二次,停止,以此类推;·使用一个按键↓作为暂停信号,模拟pause功能;计时过程中,按一次屏幕暂停计时,但stopwatch内核仍在计时,第二次,屏幕恢复计时,以此类推;·使用一个键盘键↑作为StopWatch的清零信号,按一次对计时清零;·当前计时时间显示外接屏幕上,共四个数字,前两个数显示秒数,后两个数显示毫秒数,并且显示秒数与毫秒数之间的小数点。
屏幕的显示需要一个扫描时钟,频率为25MHz,需要从100MHz的系统时钟分频得到。
用verilog-HDL多功能数字钟Verilog HDL实验报告基于Verilog HDL语言的多功能数字钟设计一、试验目的设计一个有如下功能的数字钟:(1)计时功能:包括时、分、秒。
(2)定时与闹钟功能:能在所设定的时间发出铃音。
(3)校时功能:对小时、分钟和秒钟进行手动校时。
(4)整点报时功能:每到整点能够发出“嘀嘀嘀嘀嘟”四短一长的报时。
二、试验原理ALERT HOUR[7..0]MIN[7..0]SEC[7..0]LD_ALERT LD_HOUR LD_MINCLK CLK_1K MODE TURN CHANGEclockCLK CLK_1K MODE TURN CHANGEALERTHOUR[7..0]MIN[7..0]SEC[7..0]LD_ALERT LD_HOUR LD_MIN多功能数字钟端口示意图数字钟设有五个输入端,分别为时钟输入(CLK )、模式(MODE )、产生声音的时钟信号(CLK_1K )、切换(TURN )和调时(CHANGE )键。
输出共七个,其中HOUR[7..0]、MIN[7..0]和SEC[7..0]采用BCD 计数方式,分别驱动2个数码管。
硬件电路原理图如下:三、试验内容1. 代码/*信号定义:clk: 标准时钟信号,其频率为4Hz;clk_1k:产生闹铃声、报时音的时钟信号,其频率为1024Hz;mode:功能控制信号;为0:计时功能;为1:闹钟功能;为2:手动校时功能;turn:接按键,在手动校时功能时,选择是调整小时还是分钟;若长时间按住改建,还可使秒信号清零,用于精确调时;change: 接按键,手动调整时,每按一次,计数器加1;如果长按,则连续快速加1,用于快速调时和定时;hour,min,sec:此三信号分别输出并显示时、分、秒信号,皆采用BCD码计数,分别驱动6个数码管显示时间;alert:输出到扬声器的信号,用于产生闹铃音和报时音;闹铃音为持续20秒的急促的“嘀嘀嘀”音,若按住“change”键,则可屏蔽该音;整点报时音为“嘀嘀嘀嘀嘟”四短一长音;LD_alert:接发光二极管,指示是否设置了闹钟功能;LD_hour:接发光二极管,指示当前调整的是小时信号;LD_min:接发光二极管,指示当前调整的是分钟信号*/moduleclock(clk,clk_1k,mode,change,turn,alert,hour,min,sec,LD_alert,LD_hour,LD_mi n);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:begin if(fm)begin count1<=change; {LD_min,LD_hour}<=2; endelsebegin counta<=change; {LD_min,LD_hour}<=1; end{count2,countb}<=0;end1:begin if(fm)begin count2<=change; {LD_min,LD_hour}<=2; endelsebegin 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(loop2==3) num2<=1;elsebegin loop2<=loop2+1; num2<=0;endendelse begin loop2<=0; num2<=0; endalways @(negedge clk) //产生num2信号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:0]<=hour1[7:4]+1; hour1[3:0]<=0; endelse 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; endelse 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; endelse 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;endendmodule2. 仿真图四、小结及体会为了做多功能数字钟,我借了多本关于Verilog HDL的程序设计书。
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,一个全双功串行通信口等组成。
实验报告2019 -2020 学年第2学期开课单位电子信息学院适用年级、专业2017级电子信息科学与技术Z 课程名称FPGA技术及应用-课内实验主讲教师课程序号BS6222003X3-03课程代码BS6222003X3实验名称计时器和倒计时的系统设计实验学时2学时学号姓名实验五计时器和倒计时的系统设计①掌握用Verilog HDL文本输入法设计计时电路的方法,并通过电路仿真和硬件验证,进一步了解计时器的功能和特性。
②掌握用Verilog HDL文本输入法设计倒计时电路的方法,并通过电路仿真和硬件验证,进一步了解倒计时电路的功能和特性。
二、实验原理1.计时器24小时计时器的电路框图如图8.1所示。
图8.1 24小时计时器的电路框图24小时计时器由2个60进制加计数器和1个24进制加计数器构成,输入CLK为1HZ(秒)的时钟,经过60进制加计数后产生1分钟的进位时钟信号,再经过60进制加计数后产生1小时的进位时钟信号送给24进制加计数器进行加计数,当加计数到达23:59:59后,再来-一个秒脉冲,产生时的进位输出。
将两个60进制加计数器和一个24进制加计数器的输出送数码管显示,得到计时器的显示结果。
其中,秒脉冲由EDA实调仪上的20MHz晶振分频得到。
2.倒计时器24小时倒计时器的电路框图如图8.2所示。
图8.2 24 小时倒计时器的电路框图24小时倒计时器由2个60进制减计故器和1个24进制减计数器构成,输入CLK为1Hz(秒)的时钟,经过60进制减计数后产生1分钟的借位时钟信号,再经过60进制减计数后产生I小时的借位时钟信号送给24进制减计数器进行减计数,当减计数到达00:00:00后,产生时的借位输出,同时24小时倒计时器停止倒计时,并发出提醒信号。
将两个60进制减计数器和一个24进制减计数器的输出送数码管显示,得到倒计时的显示结果。
其中,秒脉冲由EDA实训仪上的20MHz晶振分频得到。
三、实验设备①EDA实调仪1台。
数字秒表的设计实现团队成员:董婷詹磊胡鹏一、测试要求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时,计数器清零。
华中科技大学《电子线路设计、测试与实验》实验报告实验名称:用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,符合倍数关系,故分频模块的正确性得到验证。
一、实验目的(1)熟练掌握分频器、各种进制的同步计数器的设计。
(2)熟练掌握同步计数器的级联方法。
(3)掌握数码管的动态显示驱动方式。
(4)掌握计数器的功能和应用。
(5)理解开关防颤动的必要性。
(6)掌握简单控制器的设计方法。
二、实验内容和原理1、实验设计要求:(1)计时范围0’0’.0’’~59’59’.9’’,分辨率为0.1s,用数码管显示计时值。
(2)秒表有一个按键开关:当电路处于“初始”状态时,第一次按键,计时开始(“计时”状态);再次按键。
计时停止(“停止”状态);第三次按键,计时器复位为0’0’.0’’,且电路恢复到“初始”状态。
2、根据设计要求,可画出秒表电路的原理框图,如图1-2所示,秒表电路由时钟管理模块(DCM)、分频器模块、按键处理模块、控制器、计时模块和显示模块组成。
图1-2 秒表电路的原理框图(1)DCM模块由于数字钟为低速电路,而XUP Virtex-II Pro 开发系统只提供100MHz主时钟,因此需插入DCM分频模块以降低系统的工作时钟,从而提高系统的可靠性。
DCM可采用16分频,输出6.25MHz的sys_clk信号作为系统的主时钟。
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 ; 产生用于显示模块的扫描脉冲信号pulse400,频率为400Hz 。
1/10秒脉冲信号pulse10和扫描脉冲信号pulse400的脉冲宽度为一个系统主时钟信号sys_clk 的周期。
分频器模块原理框图如图1-3所示,先设计一个15625分频器,产生400Hz 的扫描信号pulse400,再由pulse400控制40分频器产生1/10秒脉冲信号pulse10。
秒表计时电路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.实验内容
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) begin
if (~rst) begin
clkout <= 0;
counter <= 0;
end
else if (counter == 4’b0010) begin //计数满2输出反转
clkout <= ~clkout;
counter <= counter + 4'b1;
end
else if (counter == 4’b0101) begin //计数满4输出反转同时清零clkout <= ~clkout;
counter <= 0;
end
else begin
counter <= counter + 4'b1;
end
end
endmodule
b)十进制分频代码
//计数器实现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) begin
if (~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; end
else begin counter<=counter+1; end
end
endmodule
c)时钟分频代码
always @(negedge clk or negedge rst10ms) begin
if(~rst10ms)begin clk10msreg<=0;clk10ms<=0;end
else if(clk10msreg==249999)begin clk10ms<=~clk10ms;clk10msreg<=0;end
else begin clk10msreg<=clk10msreg+1;
end
d)状态机代码
always @(negedge clk or negedge clear) begin
if (~clear) begin
state <= idlestate; rst <= 0; rst10ms <= 0;
end
else begin
case (state)
idlestate:begin if(~start)begin state<=prestate;rst<=0;rst10ms<=0;end
else begin state<=idlestate;end
end
prestate: begin state<=runstate;rst<=1;rst10ms<=1;end
holdstate:begin if(~start)begin state<=runstate;rst<=1;rst10ms<=1;end
else if(~stop)begin state<=idlestate;rst<=1;rst10ms<=0;end
else begin state<=holdstate;end
end
runstate:begin if(~stop)begin state<=idlestate;rst<=1;rst10ms<=0;end
else if(~hold)begin state<=holdstate;rst<=1;rst10ms<=0;end
else begin state<=runstate;end
end
default: state <= state;
endcase
end
end
e)各级分频代码
count6 min10counter(rst, clk10min,clk1h, timeout[7]); //10min6分频得1h
count10 min1counter (rst, clk1min, clk10min, timeout[6]);//1min 10分频得10min
count6 sec10counter(rst, clk10s, clk1min, timeout[5]);//10s 6分频得1min
count10 sec1counter (rst, clk1s, clk10s, timeout[4]);// 1s 10分频得10s
count10 ms100counter(rst, clk100ms, clk1s, timeout[3]); // 100ms10分频得1s
count10 ms10counter (rst, clk10ms, clk100ms, timeout[2]); // 10ms10分频得100ms
assign timeout[1] = 4'b1111;
assign timeout[0] = 4'b1111;
5.实验结果及分析
实验中共有四个控制按键分别测试其控制功能即启动,暂停,停止,清空。
当按下启动按键时计时器开始计时;
当按下暂停按键时计时器停止计数,再按启动又继续计时;
当按下停止按键时停止计时,再按启动从0开始;
无论何时只要按下清空按键计时器便清零。
其现象如下:
6.实验心得
1.编译时出现许可证问题;分析是软件并未破解,关闭软件重新破解。
2.编译出错;分析是代码有错,检查代码更正错误,重新编译。
3.通过本次实验对状态转移图有了更多的了解,对其应用方法有了基本的掌握。
4.进一步熟悉了硬件编程语言。