基于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 //到此数码管驱动模块结束
基于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秒表
姓名班级学号实验日期节次教师签字成绩基于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 HDL 的数字计时器的设计
EDA设计基础实验课程论文题目基于verilog HDL 的数字计时器的设计学院通信与电子工程学院专业班级电子081班学生姓名大彬哥指导教师大力会2013 年6月12 日摘要当前电子系统的设计正朝着速度快,容量大,体积小,质量轻,用电省的方向发展。
推动该潮流迅速发展的决定性因素就是使用了现代化的 EDA 设计工具。
本论文先确定了系统的逻辑功能,建立算法流程,选择电路结构,然后确定并设计电路所需的数据处理以及控制模块,在 Quartus II 上以verilog HDL为系统逻辑描述方法完成了数字计时器所需的按键输入消抖模块,控制模块,分频模块,计数模块,存储器模块,显示译码模块的设计与顶层设计和引脚分配,并讨论了 FPGA 设计中的常见的毛刺及其消除方法以及系统资源优化,利用计算机的强大运算能力在 Quartus II 上对用 VHDL 建模的复杂数字逻辑进行编译,自动综合地完成逻辑编译、逻辑化简、逻辑分割、逻辑综合及优化、逻辑行局布线、逻辑仿真,生成符合要求且在电路结构上可以实现的数字逻辑网表(Netlist),根据网表和某种工艺的器件自动生成具体电路,然后生成该工艺条件下这种具体电路的延时模型,并下载到 FPGA板上实际验证,通过本设计对数字系统自动化的基本概念、基本原理、特性及实现方法都有了较好的了解和理解,同时锻炼了计算机应用能力和 verilog HDL 语言的编程能力和 Quartus II 以及 MaxplusII 的使用能力,本设计圆满完成了用 verilog HDL 语言设计 1/10秒数字计时器并仿真和实际下载到 ALTERA 公司的 Cyclone II 系列的 EP2C8Q208C 中实现。
关键词:电子设计自动化,现场可编程门阵列/复杂可编程逻辑器件,硬件描述语言,数字系统设计。
AbstractThe current design of electronic systems is developing to fast speed, large capacity, small size, light weight, Low power consumption. What decisively promote the rapid development of this trend is the use of modern EDA design tools. In this thesis, we firstly determine the system's logic functions, build the algorithm of system, and select the circuit, then Identify and design the data processing and control module circuit requires. Complete the key input debounce module, controlmodule, frequency modules, counter modules, memory modules, display decoding module digital timer requires with verilog HDL in Quartus II, and finish the design of top-level entity and Pin assignment. Discuss the reason of glitch and the elimination of glitch in FPGA.Automatically complete compile logic, logic simplification, logic partitioning, logic synthesis and logic optimization, logic board wiring, logic simulation, generate the digital logic netlist which meets the requirements and can be implemented on the circuit, automatically generate a specific circuit according to the netlist and the device. and then build this specific delay model circuit under these conditions,then download to the FPGA board and actually verify the design. Through this design, we have better knowledge and understanding for EDA's basic concepts, basic principles, characteristics and methods, also improve the ability of using computer and Quartus II and Maxplus II and Verilog HDL programming ability. The design of digital timer based on Verilog HDL is completed successfully and has been simulated and downloaded to ALTERA's EP2C8Q208C and works Successfully.Key Words:EDA, FPGA/CPLD, verilog HDL, Digital System Desig n.目录摘要 (I)第一章引言 (1)1.1 EDA 现状 (1)1.2 硬件描述语言 (2)1.3 设计指标 (4)第 2 章 EDA设计方法及其应用 (5)2.1 分析方法 (5)2.2 描述方法 (6)2.3 实现方法 (7)第 3 章设计思想与方案论证 (8)3.1 设计思想 (8)3.2 论证分析 (8)第 4 章系统设计 (10)4.1 顶层电路设计 (10)4.2 数字秒表的设计原理 (10)4.3 键输入消抖模块 (11)4.4 时钟分频电路模块 (12)4.5 控制电路模块 (12)4.6 计时电路模块 (13)4.7 模式选择模块 (14)4.8 存储器模块 (15)4.9 动态扫描译码显示模块 (15)第5章程序设计 (17)第 6 章仿真下载实现 (20)参考文献 (22)第一章引言随着人们生活水平的日益提高,社会体系的日益完善,人们对于各种应用器材的要求也越来越高.秒表作为日常生活中,特别是体育运动中应用的特别广泛,所以精确且方便使用的秒表就被越来越多的人所选择.本秒表计时器用于体育竞赛及各种要求有较精确时的各领域,以往常利用中小规模集成电路实现,但一般体积大,使用携带不方便。
基于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实现
实验五秒表设计及验证一、功能介绍该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
电子科技大学通信学院秒表计时电路实验报告班级通信一班学生学号教师秒表计时电路秒表计时电路一、设计思路概述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秒表设计学院:信息工程学院专业:电子信息工程指导教师:邓小莺报告人:陈耀省学号: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四.总结及心得这次课程设计主要碰到的是编程问题。
基于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的脉冲。
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,一个全双功串行通信口等组成。
数字式秒表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
FPGA及数字系统设计专周报告系别:XXXXXXXX班级:XXXXX学号:XX姓名:XXXX日期:XXXX年XX月XX日一、专周设计课题秒表的设计二、专周实习目的1、熟练利用Verilog HDL语言进行数字系统设计。
2、掌握数字系统的设计方法——自顶向下的设计思想。
3、掌握计数器的设计与使用。
4、根据秒表的功能要求设计一个秒表。
5、熟练掌握用Quartus II软件进行系统原理图设计、文本设计以及进行波形仿真。
三、专周实习所需器材装有Quartus II软件的电脑一台、FPGA教学实验系统一台、下载电缆一根。
四、专周实习要求1、有秒、分计数,数码扫描显示输出。
2、有清零端和暂停端。
3、在功能允许的情况下,可自由发挥。
4、下载,检查结果是否正确。
五、专周实习原理1、功能描述秒表是一种计时的工具,有着很广泛的用途。
本实验中的秒表要求有两个功能按钮:一个是计数和停止计数按钮,当第一次按下此按钮时,秒表开始计数,再一次按下时,秒表停止计数,并显示所计的数字;另一个是清零按钮,当按下此按钮时,秒表清零。
在数码管上采用动态扫描显示输出。
2、基本原理:本设计中用到的主要元件有计数器、分频器、数据选择器、译码器、位选信号发生器等。
秒、分都是60进制计数,所以必须采用两个60进制的计数器,而百分秒择采用的是100进制;分频器主要将1KHZ的时钟信号经过10分频后,产生100HZ的单位时钟周期;数据选择器主要功能是将即将显示的数据送给译码器;译码器将BCD码转换为七段译码进行显示;位选信号发生器根据人眼暂留效应和显示的数码的个数,产生一段循环码。
原理框图如下图。
3、自顶向下的设计方法自顶向下的设计方法是数字系统设计中最常用的设计方法,也是基于芯片的系统设计的主要方法。
自顶向下的设计方法利用功能分割手段将设计由上到下进行层次话和模块化,及分层次、分模块进行设计和仿真。
功能分割时,将系统功能分解为功能块,功能块再分解为逻辑块,逻辑块再分解为更少的逻辑块和电路。
verilog电子秒表设计
华中科技大学《电子线路设计、测试与实验》实验报告实验名称:电子秒表院(系):光学与电子信息学院专业班级:光材1102姓名:***学号:U*********时间:2013.12.5地点:南一楼实验成绩:指导教师:**2013 年12 月3 日实验目的:利用层次化方法在实验板设计实现一个能显示00.00 秒(百分之一秒)到59.99 秒,当计时达到并超过1 分钟时,给出LED 常亮信号告警,计数结果停留在计数最大值(即99.99 秒)上的电子秒表。
功能要求:基本功能:6) 设计一个能显示00.00 秒到59.99 秒的电子秒表。
7) 利用实验板所提供的50MHz 信号做为时钟信号。
8) 计数结果在AN3~AN0 中提供的数码管中显示。
9) 具有继续/暂停按键和复位清零开关。
拨码开关SW0 为复位开关,当SW0 为HIGH 时,系统复位,电子秒表显示时间为0 秒;当SW0 为LOW 时,系统开始按继续/暂停按键BTN0 控制进行工作;BTN0 为继续/暂停按键,当继续/暂停按键BTN0 按下时,系统暂停计数,AN1~AN0 显示停留在所暂停时刻;当继续/暂停按键BTN0 松开时,系统正常计数,显示精度为0.01 秒。
10) 当计时达到并超过1 分钟时,LD0 闪烁告警,计数结果停留在计数最大值上。
设计步骤与要求:1) 计算并说明采用Basys2 实验板时钟50MHz 实现系统功能的基本原理。
2) 在Xilinx ISE13.1 软件中,利用层次化方法,设计实现模一百计数及显示的电路系统,设计模块间的连接调用关系,编写并输入所设计的源程序文件。
3) 对源程序进行编译及仿真分析(注意合理设置,以便能够在验证逻辑的基础上尽快得出仿真结果)。
4) 输入管脚约束文件,对设计项目进行编译与逻辑综合,生成下载所需.bit类型文件。
# PlanAhead Generated physical constraintsNET "CLK" LOC = B8;NET "CLR" LOC = P11;NET "PAUSE" LOC = G12;NET "WARN" LOC = M5;NET "display[0]" LOC = F12;NET "display[1]" LOC = J12;NET "display[2]" LOC = M13;NET "display[3]" LOC = K14;NET "out_display[0]" LOC = L14;NET "out_display[1]" LOC = H12;NET "out_display[2]" LOC = N14;NET "out_display[3]" LOC = N11;NET "out_display[4]" LOC = P12;NET "out_display[5]" LOC = L13;NET "out_display[6]" LOC = M12;NET "out_display[7]" LOC = N13;NET "CLR" CLOCK_DEDICA TED_ROUTE = FALSE;# PlanAhead Generated IO constraintsNET "CLK" IOSTANDARD = LVCMOS33;NET "CLR" IOSTANDARD = LVCMOS33;NET "PAUSE" IOSTANDARD = LVCMOS33;NET "WARN" IOSTANDARD = LVCMOS33;NET "display[0]" IOSTANDARD = LVCMOS33;NET "display[1]" IOSTANDARD = LVCMOS33;NET "display[2]" IOSTANDARD = LVCMOS33;NET "display[3]" IOSTANDARD = LVCMOS33;NET "out_display[0]" IOSTANDARD = LVCMOS33;NET "out_display[1]" IOSTANDARD = LVCMOS33;NET "out_display[2]" IOSTANDARD = LVCMOS33;NET "out_display[3]" IOSTANDARD = LVCMOS33;NET "out_display[4]" IOSTANDARD = LVCMOS33;NET "out_display[5]" IOSTANDARD = LVCMOS33;NET "out_display[6]" IOSTANDARD = LVCMOS33;NET "out_display[7]" IOSTANDARD = LVCMOS33;NET "CLK" DRIVE = 12;5) 在Basys2 实验板上下载所生成的.bit 文件,观察验证所设计的电路功能。
Verilog秒表计时电路
秒表计时电路1.实验内容1.秒表计时功能,显示分、秒、0.01秒2.具有启动、暂停、停止和清空功能3.增加有趣的流水灯4.输入信号:4bit按键,50MHz时钟5.输出信号:6位数码管2.实验原理(1) Verilog语言Verilog HDL是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。
本实验使用Verilog语言编写代码,通过编译,综合等实现电路设计。
其中涉及基本的语法知识,可通过查阅相关资料进行了解。
(2) quartus软件Quartus是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHD等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
本实验以quartus为平台,完成代码的编辑,编译,综合及分配引脚等,最后下载。
(3) Altera DE2实验板DE2板具有很多特性可以允许使用者实现像从单个电路到多媒体工程的广泛的电路设计。
除了一些硬件特性,DE2还有对标准IO接口的软件支持和一个可以接入多种元件的控制平台。
并且这些软件还提供一系列展现DE2板高级性能的演示。
为了向用户提供最大的灵活性,所有的连接通过Cyclone II FPGA设备。
因此用户可以配置FPGA来实现任何系统设计。
本实验用到的电路模块如右(4) 数码管采用共阳数码管,数码管段选方式如下每一个数码管单独与FPGA连接通过并行总线控制数码管显示3.设计思路及实现方案(1)时钟分频clk10ms→ clk100ms → clk1s→clk10s→clk1min→clk10min→clk1h分频单元:六分频,十分频50MHz到100Hz分频,500000分频(2)状态机设计(3)设计框图4.代码添加及说明a)六进制分频代码//计数器实现6分频,计数到达2和5,输出始终翻转一次,且计数达到5时计数清零module count6(rst, clk, clkout, counter);input rst;input clk;output reg clkout;output reg [3:0]counter;always @(negedge clk or negedge rst) beginif (~rst) beginclkout <= 0;counter <= 0;endelse if (counter == 4’b0010) begin //计数满2输出反转clkout <= ~clkout;counter <= counter + 4'b1;endelse if (counter == 4’b0101) begin //计数满4输出反转同时清零clkout <= ~clkout;counter <= 0;endelse begincounter <= counter + 4'b1;endendendmoduleb)十进制分频代码//计数器实现10分频,计数到达4和9,输出始终翻转一次,且计数达到9时计数清零module count10(rst, clk, clkout, counter);input rst;input clk;output reg clkout;output reg [3:0]counter;always @(negedge clk or negedge rst) beginif (~rst) begin counter<=0;clkout<=0; end//计数满4输出反转else if (counter ==4'b0100) begin clkout<=~clkout;counter<=counter+1; end //计数满9输出反转同时计数清零else if (counter ==4'b1001) begin clkout<=~clkout;counter<=0; endelse begin counter<=counter+1; endendendmodulec)时钟分频代码always @(negedge clk or negedge rst10ms) beginif(~rst10ms)begin clk10msreg<=0;clk10ms<=0;endelse if(clk10msreg==249999)begin clk10ms<=~clk10ms;clk10msreg<=0;endelse begin clk10msreg<=clk10msreg+1;endd)状态机代码always @(negedge clk or negedge clear) beginif (~clear) beginstate <= idlestate; rst <= 0; rst10ms <= 0;endelse begincase (state)idlestate:begin if(~start)begin state<=prestate;rst<=0;rst10ms<=0;endelse begin state<=idlestate;endendprestate: begin state<=runstate;rst<=1;rst10ms<=1;endholdstate:begin if(~start)begin state<=runstate;rst<=1;rst10ms<=1;endelse if(~stop)begin state<=idlestate;rst<=1;rst10ms<=0;endelse begin state<=holdstate;endendrunstate:begin if(~stop)begin state<=idlestate;rst<=1;rst10ms<=0;endelse if(~hold)begin state<=holdstate;rst<=1;rst10ms<=0;endelse begin state<=runstate;endenddefault: state <= state;endcaseendende)各级分频代码count6 min10counter(rst, clk10min,clk1h, timeout[7]); //10min6分频得1hcount10 min1counter (rst, clk1min, clk10min, timeout[6]);//1min 10分频得10mincount6 sec10counter(rst, clk10s, clk1min, timeout[5]);//10s 6分频得1mincount10 sec1counter (rst, clk1s, clk10s, timeout[4]);// 1s 10分频得10scount10 ms100counter(rst, clk100ms, clk1s, timeout[3]); // 100ms10分频得1scount10 ms10counter (rst, clk10ms, clk100ms, timeout[2]); // 10ms10分频得100msassign timeout[1] = 4'b1111;assign timeout[0] = 4'b1111;5.实验结果及分析实验中共有四个控制按键分别测试其控制功能即启动,暂停,停止,清空。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
生产实习报告班级:通信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 码输出,这样便与同显示译码器连接。
利用一块芯片完成除时钟源,按键和显示器之外的所有数字电路功能。
所有数字逻辑功能都在CPLD器件上用Verilog语言实现。
这样设计具有体积小,设计周期短,调试方便,故障率地和修改升级容易等特点。
本设计采用依次采用以下设计方法:1)按键输入缓存,键盘消抖设计;2)分频产生秒信号,产生100HZ的时钟信号设计;3)数码管动态扫描显示设计;4)3-8译码器显示(译码)设计;5)流水线式计数方法设计。
4.设计原理框图秒表计时器设计原理框图,如图4-1所示。
图4-1 秒表计时器设计原理框图根据设计原理框图4-1,以及设计的要求及目的,可以将Verilog HDL语言设计的秒表计时程序分为四大模块:1)按键输入缓存,按键消抖模块;2)分频产生100HZ的时钟信号模块;3)数码管动态扫描显示驱动模块;4)计时处理部模块。
5.软件设计按键输入缓存,按键消抖模块常在按键较少时可用硬件方法消除抖动,一般采用RS触发器作为常用的消抖电路,如果按键较多时,常用软件消除抖动。
在EDA的设计应用中,软件消抖的方法即可使用RS触发器进行消抖,也可通过检测按键按下的时间进行消抖。
按键输入缓存,按键消抖程序:always@(posedge count[16])beginkey_inner<=key;endalways@(posedge key_inner[0])beginkey_flag=~key_flag;end键盘消抖工作原理:设置输入信号key[1:0],设置一个模值为4的控制计数器key_inner,判断计数寄存器count的第16位的上升沿,检测到key_inner为高电平。
由于计数寄存器的位数为18位。
则说明在内可以检测到4次高电平。
在人工按键key=‘1’时,key_inner为‘1’,如连续4次检测到高电平则key_inner一直为‘1’。
4次以上检测到高电平key_inner依旧为‘1’,也一直输出高电平。
这就确保了当按键信号持续高电平以上按键信号才有效。
抖动期间的高电平持续时间不足以输出高电平。
如没有连续4次以上检测到高电平,则key_inner为‘0’。
再判断key_inner的上升沿(按键按下为下降沿,弹起为上升沿),每当key_inner[0]出现一次上升沿(按键按下并弹起),key_flag 将取反一次(设置key_flag 的初值为‘0’)。
分频产生100HZ 的时钟信号模块分频产生100HZ 的时钟信号程序:always@(posedge clk) begin if(count==249999) begin clk_100hz<=~clk_100hz; count<=0;endelsecount<=count+1;end分频原理图,如图5-1所示。
图5-1 分频原理图分频原理:由于开发板的输入频率为50MHZ 的时钟信号,说明1s 产生7510⨯个时钟信号。
每个时钟信号持续的时间为71510⨯s ,由于秒表计时器的最小单位为,所以要将50MHZ 的时钟信号进行5510⨯分频,得到100HZ 的时钟信号,即。
数码管动态扫描显示驱动模块数码管动态扫描显示驱动程序:always@(posedge count[15])begincount3b=count3b+1;case(count3b)3'd5:dis_dat=hour[3:0];3'd4:dis_dat=hour[7:4];3'd3:dis_dat=hour[11:8];3'd2:dis_dat=hour[15:12];3'd1:dis_dat=hour[19:16];3'd0:dis_dat=hour[23:20];default:dis_dat=4'bxxxx;endcasesel=count3b;endalways@(dis_dat)begincase(dis_dat)0 : seg = 8'b1100_0000;erilog秒表设计.2012:15:17.[2]大彬哥.基于Verilog HDL的数字计时器的设计.2013:11.附件:module led_on(input[1:0]key, //输入信号input clk, //输入频率为50MHZ的时钟output reg [2:0]sel, //数码管位选output reg [7:0]seg, //数码管段选output en //3-8译码器使能);reg[2:0]count3b;reg[3:0]dis_dat; //定义显示数据寄存器reg[18:0]count; //定义计数寄存器reg[23:0]hour; //定义现在时刻寄存器reg clk_100hz; //50MHZ的时钟信号500000分频,得到100HZ的时钟信号reg key_flag; //启动/暂停的切换标志reg[1:0]key_inner;assign en=0;//(1)按键输入缓存,按键消抖设置always@(posedge count[16])//在内,扫描2的2次方,可以检测到4次高电平beginkey_inner<=key;endalways@(posedge key_inner[0])beginkey_flag=~key_flag;end//(2)秒信号产生部分,产生100HZ的时钟信号always@(posedge clk)beginif(count==249999)beginclk_100hz<=~clk_100hz;count<=0;endelsecount<=count+1;end//(3)数码管动态扫描显示部分always@(posedge count[15]) //时序逻辑,由于有6个数码管,则在一秒内扫描2的6次方begincount3b=count3b+1;case(count3b)3'd5:dis_dat=hour[3:0];3'd4:dis_dat=hour[7:4];3'd3:dis_dat=hour[11:8];3'd2:dis_dat=hour[15:12];3'd1:dis_dat=hour[19:16];3'd0:dis_dat=hour[23:20];default:dis_dat=4'bxxxx;endcasesel=count3b;endalways@(dis_dat)begincase(dis_dat)0 : seg = 8'b1100_0000;//显示“0”1 : seg = 8'b1111_1001;//显示“1”2 : seg = 8'b1010_0100;//显示“2”3 : seg = 8'b1011_0000;//显示“3”4 : seg = 8'b1001_1001;//显示“4”5 : seg = 8'b1001_0010;//显示“5”6 : seg = 8'b1000_0010;//显示“6”7 : seg = 8'b1111_1000;//显示“7”8 : seg = 8'b1000_0000;//显示“8”9 : seg = 8'b1001_0000;//显示“9”default:seg = 8'bxxxxxxxx;endcaseend//(4)计时处理部分always@(posedge clk_100hz) //计时处理beginif(~key_inner[1]&&key_flag==1) //判断是否复位键,beginhour=24'h0;endelse if(!key_flag)beginhour[3:0]=hour[3:0]+1;if(hour[3:0]==4'ha)beginhour[3:0]=4'h0;hour[7:4]=hour[7:4]+1;if(hour[7:4]==4'ha)beginhour[7:4]=4'h0;hour[11:8]=hour[11:8]+1;if(hour[11:8]==4'ha)beginhour[11:8]=4'h0;hour[15:12]=hour[15:12]+1;if(hour[15:12]==4'h6)beginhour[15:12]=4'h0;hour[19:16]=hour[19:16]+1;if(hour[19:16]==4'ha)beginhour[19:16]=4'h0;hour[23:20]=hour[23:20]+1;endif(hour[23:20]==4'h6)hour[23:20]=4'h0;endendendendend end endmodule。