基于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语言编写的电子秒表
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 //到此数码管驱动模块结束
基于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程序和原理图。
数电自主设计实验报告——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语言编程的数字秒表设计
数字秒表设计系别:电子通信工程系专业:电子信息工程班级:学号:姓名:数字秒表(基于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进一,同时将秒位、十分秒位和百分秒位清零;当十秒位计数到五时,将所有位清零。
秒表计时电路设计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的基本使用方法。
基于FPGAVerilog的数字式秒表设计
基于FPGA的数字式秒表一、设计任务及要求秒表由于其计时精确,分辨率高(秒),在各种竞技场所得到了广泛的应用,本次设计的任务就是设计一个基于 FPGA 的数字式秒表。
1、基本要求:(1)性能指标:秒表的分辨率为秒,最长计时时间为秒;(2)设置启/停开关和复位开关(计数控制器):启/停开关 S1 的使用方法与传统的机械计时器相同,即按一下启/停开关,启动计时器开始计时,再按一下启/停开关计时终止。
复位开关 S2 用来使计时器清 0,复位开关可以在任何情况下使用,即使在计时过程中,只要按一下复位开关,计时进程应立即终止,并对计时器清零。
(开关按下为 0,弹起为 1)。
(3)秒表的计时基准信号:以周期为秒(频率 100HZ)的计时脉冲作为一个比较精准的计时基准信号输入到秒位计数器的时钟端;在设计中采用分频器把 1000HZ 的时钟信号转换为 100HZ 的计时基准信号,其分频系数为 10。
(4)数码管动态显示:七段数码管采用动态扫描的方式显示,扫描需要一个比较高频率的信号,本次设计选用 1000HZ 。
为了得到 1000Hz 信号,必须对输入的时钟信号 50MHZ 进行分频。
显示模块共用 11 个管脚,其中 8 个用于连接 8 个数码管的七段 LED,还有 3 个管脚用于选择点亮哪个数码管,每隔很短的一段时间 8 个数码管交替点亮,依次循环,动态显示,由于人眼的视觉残留,可以观察到连续的测量计数器的计数值。
上电后,八个数码管中左边四个显示自己的学号后四位,在运行过程中一直不变;右边四个显示计时时间,范围 0000~9999,利用两个按钮 S1、S2 控制计时。
2、提高要求:加入小数点,计时数码管显示范围 ~。
二、 系统原理框图100Hz50MHz1000Hz 三、 电路实现四、 功能模块1、 分频器(以10分频器为例)(1)Verilog HDL 语言程序module fp10(Clk,Out10分频器);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秒表
秒表下载到目标板上显示效果,计时长度为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。
基于FPGA数字秒表设计
数字秒表设计
一、实验目的
1、理解计时器的原理与V erilog/VHDL的编程方法;
2、掌握多模块设计及层次设计的方法。
二、实验原理
秒计时器是由计数器和译码器、显示器组成,其核心是计数器与译码器。
60 秒计时器可由二个计数器分别完成:个位为十进制计数器,十位为6 进
制计数。
个位计数器的计数信号由实验开发板上主频20MHZ分频产生的1Hz
时钟信号提供, 十位计数器的计数信号由个位的进位信号提供。
然后由译码器
对计数结果进行译码,送LED 数码管进行显示。
Clr为清零,se t为开始。
三、实验框图
图2-1
四、实验任务
1、采用层次设计的方法,设计一个包括顶层及底层模块的60 秒计时器,底
层模块用Verilog/VHDL设计(或者选用原理图输入法中宏功能元件),顶层用原理图设计。
2、秒计时器应当具有系统复位功能;
3、每十秒发出提示信号及计满60 秒时发出报警信号。
(选做)
名
原
理
图
五、实验步骤
1.创建工程
2.选择目标器件
3.编写verilog hdl 程序
4.编译
5.生成符号文件
6.创建编辑原理图
7.设置顶层文件
8.编译
9.创建编辑波形图文件
10.使用波形图仿真
11.锁定管脚 12.编译 13.下载至芯片
六、实验结果
1.编译结果
名
仿
真
结
果
名
仿
真
结
果
文COUNT60.v (为了简便将分频器设置2分频的)。
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电子秒表计时器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语言实现
一、实验目的(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。
基于Verilog HDL设计的数字时钟
深圳大学考试答题纸(以论文、报告等形式考核专用)二○18 ~二○19 学年度第一学期课程编1602080001 评分刘春平课程名称主讲教师硬件描述语言与逻辑综合号学电子科学与技术16级1班姓名李思豪专业年级号设计的数字时钟Verilog HDL基于题目:摘要:本文利用V erilog HDL语言自顶向下的设计方法设计多功能数字钟,突出了其作为硬件描述语言的良好的可读性、可移植性和易理解等优点,并通过Altera QuartusⅡ6.0和cyclnoe IIEP2C35F672C6完成综合、仿真。
此程序通过下载到FPGA芯片后,可应用于实际的数字钟显示中关键词:Verilog HDL;硬件描述语言;FPGA1目录一、实验任务 (3)实验目的 (3)实验要求 (3)二、设计思路 (3)三、实验结果 (10)四、总结与收获 (14)2一、实验任务实验目的1.深入了解基于quartus ii工具的复杂时序逻辑电路的设计。
理解并熟练利用EDA工具进行综合设计。
2.熟练掌握芯片烧录的流程及步骤。
3.掌握Verilog HDL 语言的语法规范及时序电路描述方法。
4.实验要求设计一个带秒表功能的24 小时数字钟,它包括以下几个组成部分:①显示屏,由6 个七段数码管组成,用于显示当前时间(时:分,秒)或设置的秒表时间;②复位键复位所有显示和计数③设置键,用于确定新的时间设置,三个消抖按键分别用于时分秒的设置④秒表键,用于切换成秒表功能基本要求(1) 计时功能:这是本计时器设计的基本功能,每隔一秒计时一次,并在显示屏上显示当前时间。
(2) 秒表功能:设置时间,进行倒计时功能(3) 设置新的计时器时间:按下设置键后,用户能通过时分秒三个消抖按键对时间进行设置。
二、设计思路、总原理框图:13原理如上图所示,时钟由分频器模块,数码管显示模块,计时器模块三个模块构成,每个模块实现如下的不同功能,最后通过在顶层模块的调用,来实现时钟功能。
verilog秒表实验报告
一,实验原理二,各模块程序与仿真结果图。
1,分频器,将晶振的48MHz频率分频为电子秒表的最小分辨频率,周期0.01S。
同时在译码部分需要一个1KHz的扫描信号,所以分频器的功能就是产生一个100Hz信号和1kHz信号。
源代码如下:module divclk(clk,clk_100,clk_1k);input clk;output reg clk_100,clk_1k;reg[29:0]counter1,counter2;initial begin counter1<=0;counter2<=0;clk_100<=0;clk_1k<=0;endalways@(posedge clk)beginif(counter1==240000)begin counter1<=0;clk_100<=~clk_100;endelse begin counter1<=counter1+1;endif(counter2==24000)begin counter2<=0;clk_1k<=~clk_1k;endelse begin counter2<=counter2+1;endendendmodule仿真结果2,计数器秒表计数器和一般计数器不同的是进制,在0.01s__0.99s时,都是十进制的,而到了秒和分的时候,十位秒和个位秒是十进制,秒和分之间则为六十进制所以在进位时注意区分。
秒表有两个按键,一个复位按键reset,一个run/stop按键,reset按键比较好处理,因为是点触式,可以检测其下降沿部位(低电平有效),当硬件检测到,说明是有按键按下。
而run/stop按键则为,按下一次这个键,秒表run和stop切换一次可定义一个信号寄存器,在检测到这个按键按下时,自身在0和1之间翻转一次,1表示run,0表示stop。
我们知道,在按键按下一次时会有如下的毛刺信号,这个毛刺信号持续时间虽然只有1-3ms,但是这对于硬件来说,还是很长的,最关键的是,会产生很多个下降沿和电平触发。
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 文件,观察验证所设计的电路功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字秒表的设计实现团队成员:董婷詹磊胡鹏一、测试要求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时,计数器清零。
(5)定义18位寄存器count用于存放分频和扫描用的计数值。
24MHZ的时钟信号240000分频,得到100HZ的时钟信号,而计数器已24MHZ的时钟信号218分频扫描8个七段译码器。
2. 实验设计方案利用一块芯片完成除时钟源,按键和显示器之外的所有数字电路功能。
所有数字逻辑功能都在CPLD器件上用Verilog语言实现。
这样设计具有体积小,设计周期短,调试方便,故障率地和修改升级容易等特点,本设计采用依次进行消抖、分频、数码管动态扫描、显示(译码)和计数流水线的设计方法。
3. 实验原理框图秒表原理框图五、软件设计与仿真1、秒表计数单位与对应输出信号2、秒表总程序:module dapeng(clk_24M,dig,seg,ena,key); input[1:0]key;input clk_24M; //输入频率为24MHZ的时钟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; //24MHZ的时钟信号240000分频,得到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_24M)beginif(count==119999)beginclk100<=~clk100;count<=0;endelsecount<=count+1'b1;end//数码管动态扫描显示部分always@(posedge count[10])begincount3b=count3b+1;case(count3b)3'd7:disp_dat=hour[3:0];3'd6:disp_dat=hour[7:4];3'd5:disp_dat=4'ha;3'd4:disp_dat=hour[11:8];3'd3:disp_dat=hour[15:12];3'd2:disp_dat=4'ha;3'd1:disp_dat=hour[19:16];3'd0: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暂停时的仿真波形3.电路原理图的生成4.电路图的生成六.硬件实现1. 用QUARTUS II软件对程序进行编译,并下载到硬件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]键,数码管重新开始计时。
七.关于老师提问1.定义18位寄存器 reg[18:0]count; 用于存放分频和扫描用的计数值。
原因是24MHZ的时钟信号240000分频,得到100HZ的时钟信号,我们程序采用计数满后取反的原理,所以计数器最多需计数240000,182=262144,故而定义count为reg[18:0]。
2.按键消抖动部分always @(posedge count[16]),所给时钟上升沿有效,每次上升沿读取按键值赋给寄存器key-inner来存储按键key的输入信号,key-flag作为启动/暂停的转换标志,key-inner[0]出现一个下降沿时,key-flag取反一次,当key-flag为0时计数器启动,1时计数器暂停。
24000000216=0.00273s=30ms,所以在计时精度为0.01s内,连续检测4次就是在0ms,30ms,60ms,90ms处都检测到0,才算是有按键输入。
其他情况均为抖动。
八.心得体会经过这次的实验,让我们对Verilog HDL语言掌握程度加深了,对QuartusII这个软件的使用也相对开始来说更加熟悉,经过实验,对课上的知识有了进一步的熟悉。
当然,试验期间也存在许多问题,刚开始写程序时常因Verilog HDL语言的不熟悉,常出现综合错误的问题,有时程序虽然编译没有错误,但下到板子上时,却显示有误,还需要经过多次的调试。
总的来说,只要仔细检查、并经常使用该语言后,就会在很大程度上避免诸如语法错误等非逻辑问题。
在定义寄存器用于计数功能时,最好先赋初值。
对于复杂的逻辑功能的电路实现,可以采用分模块的方法,以便检查程序的正误,而对于功能较简单的电路设计,只需要一个模块,从而避免在模块间连接时出现错误。
对于需要存放的比较大数据,最好直接采用整型,而不用定义寄存器,从而避免数据溢出。
通过此次的实验,我们还认识到:写程序时应该养成良好的书写习惯,如在关键处加备注;定义变量、工程名、文件名时应用能“望词生义”的效果;嵌套程序应对齐书写等。
在小组成员的共同努力下我们完成了实验的要求,对于我们来说,此次实验的收获比在课上学到的知识更加深刻有意义,同时,非常感谢杨越老师在实验课上对我们提出问题的耐心指导与解答!。