Verilog24小时计数器

合集下载

24小时计时器--FPGA

24小时计时器--FPGA

课程设计任务书学生姓名:罗序森专业班级:通信gj1101______ 指导教师:胡辑伟工作单位:____信息工程学院_____ 题目: 通信工程应用技术课设——FPGA一、设计任务与要求设计一个具有系统时间设置和带闹钟功能的24小时计时器中的应用。

电子钟要求如下:(1)计时功能:4位LED数字时钟对当前时间的小时和分钟进行显示,显示的最长时间为23小时59分。

(2)设置并显示新的闹钟时间:用户先按“set”键,再用数字键“0”~“9”输入时间,然后按“alarm”键确认。

在正常计时显示状态下,用户直接按下“alarm”键,则已设置的闹钟时间显示在显示屏上。

(3)设置新的计时器时间:用户先按“set”键,再用数字键“0”-“9”输入新的时间,然后按“time”键确认。

在输入过程中;输入的数字在显示屏上从右到左依次显示。

例如,用户要设置新的时间12:00,则按顺序输入“l”,“2”,“0”,“0”键,与之对应,显示屏上依次显示的信息为:“1”,“12”;“120”,“1200”。

如果用户在输入任意几个数字后较长时间内,例如5秒,没有按任何键,则计时器恢复到正常的计时显示状态。

(4)闹钟功能:如果当前时间与设置的闹钟时间相同,则扬声器发出蜂鸣声;三.时间安排:指导教师签名:年月日系主任(或责任教师)签名:年月日目录摘要 (2)Abstract ................................................... 错误!未定义书签。

1 绪言 ..................................................... 错误!未定义书签。

1.1 课题的研究背景及意义................................ 错误!未定义书签。

1.2 闹钟系统的.......................................... 错误!未定义书签。

verilog实现简易24小时计数器

verilog实现简易24小时计数器

verilog实现简易24⼩时计数器1.顶层数码管显⽰模块`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company:// Engineer://// Create Date: 18:57:45 08/18/2019// Design Name:// Module Name: dynamic_seg_top// Project Name:// Target Devices:// Tool versions:// Description: //实现简易时钟计数功能//// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments://module dynamc_seg_top//---------------------<端⼝声明>---------------------------------------(input clk_50MHZ , //时钟,50Mhzinput rst_n , //复位,低电平有效output reg [ 7:0] seg_sel , //数码管位选output reg [ 7:0] seg_data //数码管段选,即内容显⽰);//---------------------<信号定义>---------------------------------------wire clk_1KHZ ;reg [3:0] data_tmp ;reg [7:0] cnt ;wire [23:0] data ;//----------------------------------------------------------------------// 1k分频例化,扫描⼀个数码管时间为1ms//----------------------------------------------------------------------CLK_DIV #(.width(16),.cnt(50_000))uut(.clk_50MHZ(clk_50MHZ),.rst_n(rst_n),.clk_out(clk_1KHZ));//======================================================================////时,分,秒计数例化////======================================================================clock_cntclk_cnt_uut(.clk_50MHZ(clk_50MHZ),.rst_n(rst_n),.data(data));//----------------------------------------------------------------------// 数码管扫描,8位循环扫描,频率为1k//----------------------------------------------------------------------always @(posedge clk_1KHZ or negedge rst_n)beginif(!rst_n)seg_sel <= 8'b0111_1111;else if(seg_sel==8'b1111_1110)seg_sel <= 8'b0111_1111;elseseg_sel <= ~(~seg_sel>>1);end//----------------------------------------------------------------------// 位选,不同计数对应不同位选编码,也对应分割的不同数据//----------------------------------------------------------------------always @(*)begincase(seg_sel)8'b0111_1111: data_tmp = data[ 3: 0] ; // 位18'b1011_1111: data_tmp = data[ 7: 4] ; // 位28'b1101_1111: data_tmp = 4'ha ; // 位38'b1110_1111: data_tmp = data[11:8] ; // 位48'b1111_0111: data_tmp = data[15:12] ; // 位58'b1111_1011: data_tmp = 4'hb ; // 位68'b1111_1101: data_tmp = data[19:16] ; // 位78'b1111_1110: data_tmp = data[23:20] ; // 位8default: data_tmp = 4'b0000 ;endcaseend//----------------------------------------------------------------------// 段选,将不同分割数据进⾏段选编码,实验平台为2个4位⼀体共阳数码管//----------------------------------------------------------------------always @(*)begincase(data_tmp)4'h0: seg_data = 9'hc0;4'h1: seg_data = 9'hf9;4'h2: seg_data = 9'ha4;4'h3: seg_data = 9'hb0;4'h4: seg_data = 9'h99;4'h5: seg_data = 9'h92;4'h6: seg_data = 9'h82;4'h7: seg_data = 9'hf8;4'h8: seg_data = 9'h80;4'h9: seg_data = 9'h90;4'ha: seg_data = 9'hbf;//4'hb: seg_data = 9'hbf;//第三位和第六位显⽰时钟的分隔线default:seg_data = 9'hc0;endcaseendendmodule2.时分秒计数模块`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company:// Engineer://// Create Date: 19:51:36 02/25/2020// Design Name:// Module Name: clock_cnt// Project Name:// Target Devices:// Tool versions:// Description://// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments:////////////////////////////////////////////////////////////////////////////////////module clock_cnt(input clk_50MHZ,input rst_n,output [23:0]data);reg [7:0] second ;//时钟“秒”reg [7:0] minute ;//时钟“分”reg [7:0] hour ;//时钟“⼩时”wire clk_1HZ ;//----------------------------------------------------------------------//-- 例化计数分频产⽣1HZ时钟//----------------------------------------------------------------------CLK_DIV #(.width(28),.cnt(50_000_000))uut(.clk_50MHZ(clk_50MHZ),.rst_n(rst_n),.clk_out(clk_1HZ));//----------------------------------------------------------------------//-- 秒计数,从0-59计数,1秒加⼀,到59清零//----------------------------------------------------------------------always @(posedge clk_1HZ or negedge rst_n)beginif(!rst_n)second<=8'd0;else if (second[3:0]==4'd9)beginsecond[3:0]<=8'd0;if(second[7:4]==4'd5)second[7:4]<=4'd0;elsesecond[7:4]<=second[7:4]+4'd1;endelsesecond[3:0]<=second[3:0]+4'd1;end//----------------------------------------------------------------------//-- 分计数,从0-59计数,1分钟加⼀,到59清零//----------------------------------------------------------------------always @(posedge clk_1HZ or negedge rst_n)beginif(!rst_n)minute<=8'd0;else if ((second[3:0]==4'd9)&(second[7:4]==4'd5))beginif(minute[3:0]==4'd9)beginminute[3:0] <=4'd0;if(minute[7:4]==4'd5)minute[7:4] <=4'd0;elseminute[7:4] <=minute[7:4]+4'd1;endelsebeginminute[3:0]<=minute[3:0]+4'd1;endendelseminute<=minute;end//----------------------------------------------------------------------//-- ⼩时计数,从0-23计数,1⼩时加⼀,到23清零//----------------------------------------------------------------------always @(posedge clk_1HZ or negedge rst_n)beginif(!rst_n)hour<=8'd0;else if ((second[3:0]==4'd9)&(second[7:4]==4'd5)&(minute[3:0]==4'd9)&(minute[7:4]==4'd5)) beginif(hour[7:4]==4'd2)beginif(hour[3:0]==4'd3)beginhour[3:0] <=4'd0;hour[7:4]<=4'd0;endelsebeginhour[7:4]<=hour[7:4];hour[3:0] <=hour[3:0]+4'd1;endendelsebeginif(hour[3:0]==4'd9)beginhour[3:0] <=4'd0;hour[7:4] <=hour[7:4]+4'd1;endelsebeginhour[3:0] <=hour[3:0]+4'd1;hour[7:4] <=hour[7:4];endendendelsehour<=hour;endassign data[3:0] =second [3:0];//将“秒”的个位数送到数码管第⼀位assign data[7:4] =second [7:4];//将“秒”的⼗位数送到数码管第⼆位assign data[11:8] =minute [3:0];//将“分“的个位数送到数码管第四位assign data[15:12] =minute [7:4];//将”分”的⼗位数送到数码管第五位assign data[19:16] =hour [3:0];//将“时“的个位数送到数码管第七位assign data[23:20] =hour [7:4];//将”时”的个位数送到数码管第⼋位endmodule3.任意时钟分频模块`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company:// Engineer://// Create Date: 18:54:40 02/25/2020// Design Name:// Module Name: CLK_DIV// Project Name:// Target Devices:// Tool versions:// Description: //任意时钟分频模块//// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments:////////////////////////////////////////////////////////////////////////////////////module CLK_DIV #(parameter width = 28,parameter cnt = 50_000_000)(input clk_50MHZ,input rst_n ,output clk_out);reg [width-1:0] cnt_p;reg cnt_n;reg clk_p;reg clk_n;//上升沿计数器,实现0-49_999_999计数always@(posedge clk_50MHZ or negedge rst_n)beginif(!rst_n)cnt_p <= 1'b0;else if(cnt_p == (cnt-1))cnt_p <= 1'b0;elsecnt_p <= cnt_p + 1'b1;end//上升沿触发时钟分频,实现1HZ时钟输出always@(posedge clk_50MHZ or negedge rst_n)beginif(!rst_n)clk_p<=1'b0;else if(cnt_p<(cnt>>1))clk_p<=1'b0;elseclk_p<=1'b1;endalways@(negedge clk_50MHZ or negedge rst_n)beginif(!rst_n)cnt_n <= 1'b0;else if(cnt_n == (cnt-1))cnt_n <= 1'b0;elsecnt_n <= cnt_n + 1'b1;endalways@(negedge clk_50MHZ or negedge rst_n)beginif(!rst_n)clk_n<=1'b0;else if(cnt_n<(cnt>>1))clk_n<=1'b0;elseclk_n<=1'b1;endwire clk1=clk_50MHZ; //当分频系数为1时,输出时钟wire clk2=clk_p; //当分频系数为偶数时,输出等于clk_pwire clk3=clk_p&clk_n;//当分频系数为奇数时,输出等于clk_p&clk_n assign clk_out=(cnt==1)?clk1:(cnt[0]? clk2:clk3);endmodule4.时分秒仿真testbench⽂件`timescale 100ps / 1ps////////////////////////////////////////////////////////////////////////////////// Company:// Engineer://// Create Date: 22:18:22 02/25/2020// Design Name: clock_cnt// Module Name: C:/mydesign/dybamic_seg1/clk_tb.v// Project Name: dybamic_seg// Target Device:// Tool versions:// Description://// Verilog Test Fixture created by ISE for module: clock_cnt//// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments://////////////////////////////////////////////////////////////////////////////////module clk_tb;// Inputsreg clk_50MHZ;reg rst_n;// Outputswire [23:0] data;// Instantiate the Unit Under Test (UUT)clock_cnt uut (.clk_50MHZ(clk_50MHZ),.rst_n(rst_n),.data(data));initial begin// Initialize Inputsclk_50MHZ = 0;rst_n = 0;// Wait 100 ns for global reset to finish#10;rst_n = 1;#10;// Add stimulus hereendalways #1 clk_50MHZ=~clk_50MHZ;endmodule5.显⽰模块仿真testbench⽂件`timescale 1ns / 1ps////////////////////////////////////////////////////////////////////////////////// Company:// Engineer://// Create Date: 15:11:16 02/26/2020// Design Name: dynamc_seg_top// Module Name: C:/mydesign/dybamic_seg1/dy_segtb.v// Project Name: dybamic_seg// Target Device:// Tool versions:// Description://// Verilog Test Fixture created by ISE for module: dynamc_seg_top //// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments://////////////////////////////////////////////////////////////////////////////////module dy_segtb;// Inputsreg clk_50MHZ;reg rst_n;// Outputswire [7:0] seg_sel;wire [7:0] seg_data;// Instantiate the Unit Under Test (UUT)dynamc_seg_top uut (.clk_50MHZ(clk_50MHZ),.rst_n(rst_n),.seg_sel(seg_sel),.seg_data(seg_data));initial begin// Initialize Inputsclk_50MHZ = 0;rst_n = 0;// Wait 100 ns for global reset to finish#10;rst_n = 1;#10;// Add stimulus hereendalways #1 clk_50MHZ=~clk_50MHZ;endmodule。

verilog计数器设计原理

verilog计数器设计原理

Verilog计数器设计原理1. 介绍计数器是一种常见的数字电路,用于计算和记录事件的数量。

在数字系统中,计数器通常用于生成时钟信号、控制状态机、实现频率分频等应用。

Verilog是一种硬件描述语言,可以用于设计和仿真数字电路。

本文将详细介绍与Verilog计数器设计相关的基本原理。

2. 计数器的基本概念计数器是一种能够在输入脉冲信号的作用下进行累加或递减操作的数字电路。

它通常由触发器和逻辑门组成,触发器用于存储和传递数据,逻辑门用于控制触发器的工作状态。

2.1 同步计数器同步计数器是通过时钟信号来同步各个触发器的状态转换,以实现数据的累加或递减操作。

它包含一个时钟输入端(CLK)和一个复位输入端(RST)。

2.1.1 同步正向计数器同步正向计数器是最简单的同步计数器之一,它能够在每个上升沿时钟信号到达时进行累加操作。

2.1.1.1 原理同步正向计数器由多个触发器和逻辑门组成,其中每个触发器都有一个时钟输入端和一个复位输入端。

当时钟信号的上升沿到达时,触发器的状态将根据输入信号进行更新。

具体的原理如下:1.初始化:将计数器的初始值设置为0。

2.时钟边沿检测:当时钟信号的上升沿到达时,进入下一步操作。

3.累加操作:根据触发器的当前状态进行累加操作。

如果触发器为0,则变为1;如果触发器为1,则变为0。

4.检测溢出:如果最高位触发器由1变为0,则表示计数溢出,需要将其他低位触发器进行进位操作。

2.1.1.2 Verilog代码示例以下是一个4位同步正向计数器的Verilog代码示例:module synchronous_counter(input wire clk,input wire rst,output wire [3:0] count);reg [3:0] count;always @(posedge clk or posedge rst)beginif (rst)count <= 4'b0000;elsecount <= count + 1;endendmodule2.1.2 同步递减计数器同步递减计数器是同步正向计数器的一种扩展,它能够在每个上升沿时钟信号到达时进行递减操作。

FPGA时分秒电子钟24小时计

FPGA时分秒电子钟24小时计

设计一个具有时、分、秒计时的电子钟,按24 小时计时。

要求: (1)数字钟的时间用六位数码管分别显示时、分、秒; (2)用两个控制键,对数字钟分别进行分、时校正;( 3)用Verilog HDL 语言设计,用Modelsim 软件做功能仿真,用Quartus II 综合。

(4)将设计代码和仿真代码写在作业本上。

module countersmh(out,sel,dp,clock_128,clear,corr_min,corr_hour);input clock_128,clear,corr_min,corr_hour;output [6:0] out;output [2:0] sel;output dp;reg [6:0] out;reg [2:0] sel;reg [3:0] cnt_sl,cnt_sh,cnt_ml,cnt_mh,cnt_hl,cnt_hh,count;reg [15:0] fenping;wire clock_1=fenping[1];always @(posedge clock_128 or negedge clear)beginif (!clear)fenping <= 16'b0;elsefenping <= fenping + 1;end//cnt_slalways@(posedge clock_1 or negedge clear)beginif(!clear)cnt_sl<=4'b0;else if (cnt_sl == 9) cnt_sl<=4'b0;elsecnt_sl<=cnt_sl+1;end//cnt_shalways@(posedge clock_1 or negedge clear)beginif(!clear)cnt_sh<=4'b0;else if (cnt_sh == 5 && cnt_sl == 9)cnt_sh<=4'b0;else if (cnt_sl == 9)cnt_sh<=cnt_sh+1; elsecnt_sh <= cnt_sh; end //cnt_ml always@(posedge clock_1 or negedge clear) begin if(!clear) cnt_ml<=4'b0;else if (cnt_sh == 5 && cnt_sl == 9 && cnt_ml == 9) cnt_ml<=4'b0;else if (corr_min == 0)begin if(cnt_ml == 9)cnt_ml<=4'b0;else cnt_ml<=cnt_ml+1;endelse if (cnt_sh == 5 && cnt_sl == 9) cnt_ml<=cnt_ml+1;elsecnt_ml <= cnt_ml; end//cnt_mhalways@(posedge clock_1 or negedge clear) begin if(!clear)cnt_mh<=4'b0;else if (cnt_sh == 5 && cnt_sl == 9 && cnt_ml == 9 && cnt_mh == 5) cnt_mh<=4'b0;else if (corr_min == 0)beginif(cnt_mh == 5 && cnt_ml == 9) cnt_mh<=4'b0;else if(cnt_ml == 9) cnt_mh<=cnt_mh+1;else cnt_mh <= cnt_mh;endelse if (cnt_sh == 5 && cnt_sl == 9 && cnt_ml == 9) cnt_mh<=cnt_mh+1;elsecnt_mh <= cnt_mh;end//cnt_hlalways@(posedge clock_1 or negedge clear)beginif(!clear) cnt_hl<=4'b0;else if ( cnt_hh == 2 && cnt_hl == 3 && cnt_mh == 5 && cnt_ml == 9 && cnt_sh == 5 && cnt_sl == 9 )cnt_hl<=4'b0;else if ( cnt_hl == 9 && cnt_mh == 5 && cnt_ml == 9 && cnt_sh == 5 && cnt_sl == 9 ) cnt_hl<=4'b0;else if (corr_hour == 0)beginif(cnt_hh == 2 && cnt_hl == 3)cnt_hl<=4'b0;else if(cnt_hl == 9)cnt_hl<=4'b0;endelse if (cnt_mh == 5 && cnt_ml == 9 && cnt_sh == 5 && cnt_sl == 9) cnt_hl<=cnt_hl+1;elsecnt_hl <= cnt_hl;end//cnt_hhalways@(posedge clock_1 or negedge clear)beginif(!clear)cnt_hh<=4'b0;else if ( cnt_hh == 2 && cnt_hl == 3 && cnt_mh == 5 && cnt_ml == 9 && cnt_sh == 5 && cnt_sl == 9 ) cnt_hh<=4'b0;else if (corr_hour == 0)beginif(cnt_hh == 2 && cnt_hl == 3) cnt_hh<=4'b0;else if (cnt_hl == 9)cnt_hh <= cnt_hh+1;else cnt_hh <= cnt_hh;endelse if (cnt_hl == 9 && cnt_mh == 5 && cnt_ml == 9 && cnt_sh == 5 && cnt_sl == 9) cnt_hh<=cnt_hh+1;elsecnt_hh <= cnt_hh;end //selalways@(posedge clock_128 or negedge clear ) beginif(!clear)sel<=0;else if(sel==3'b101)sel <= 3'b000;elsesel <= sel+1;endalways @(sel)begincase(sel)3'b000: count=cnt_hh;3'b001: count=cnt_hl;3'b010: count=cnt_mh;3'b011: count=cnt_ml;3'b100: count=cnt_sh;default: count=0;endcaseend//decoderwire dp;assign dp = (sel == 3'b011 || sel == 3'b001)?1'b1:1'b0;always @(count)begincase(count)4'd0: out=7'b011_1111;4'd1: out=7'b000_0110;4'd2: out=7'b101_1011;4'd3: out=7'b100_1111;4'd4: out=7'b110_0110;4'd5: out=7'b110_1101;4'd6: out=7'b111_1101;4'd7: out=7'b000_0111;4'd8: out=7'b111_1111;4'd9: out=7'b110_1111;default: out=7'b000_0000;endcaseendendmodule'timescale 1ns/1ns'in clude"./co un tersmh.v"module test;reg Clock_128,Clear,Corr_min,Corr_hour;wire [6:0] Out;wire [2:0] Sel;wire Dp;initialbeginClock_128=0;Clear=1;Corr_min=1;Corr_hour=1;#50 Clear=0;#50 Clear=1;#1000 Corr_min=0;#1000 Corr_min=1;#100 Corr_hour=0;#1000 Corr_hour=1;endalways #2 Clock_128=~Clock_128;countersmhm(.out(Out),.sel(Sel),.dp(Dp),.clock_128(Clock_128),.clear(Clear),.corr_min(Corr_min),.corr_ho ur(Corr_hour));endmodule。

基于verilog HDL计时器和倒计时的系统设计

基于verilog HDL计时器和倒计时的系统设计

实验报告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台。

数码管计时 (verilog)

数码管计时 (verilog)

数码管计时(verilog)学习笔记代码分析:`timescale 1ns / 1ps///////////////////////////////////////////////////////////////////// ///////////module seg7(clk,rst_n,ds_stcp,ds_shcp,ds_data);input clk; //25M输入时钟信号input rst_n; //复位信号输入,低有效output ds_stcp; //74HC595的并行时钟输入,上升沿将当前串行输入数据并行输出output ds_shcp; //74HC595的串行时钟输入,上升沿锁存当前串行输入数据output ds_data; //74HC595的串行数据输入//数码管显示 0~F 对应段选输出parameter SEG_NUM0 = 8'h3f,//c0,SEG_NUM1 = 8'h06,//f9,SEG_NUM2 = 8'h5b,//a4,SEG_NUM3 = 8'h4f,//b0,SEG_NUM4 = 8'h66,//99,SEG_NUM5 = 8'h6d,//92,SEG_NUM6 = 8'h7d,//82,SEG_NUM7 = 8'h07,//F8,SEG_NUM8 = 8'h7f,//80,SEG_NUM9 = 8'h6f,//90,SEG_NUMA = 8'h77,//88,SEG_NUMB = 8'h7c,//83,SEG_NUMC = 8'h39,//c6,SEG_NUMD = 8'h5e,//a1,SEG_NUME = 8'h79,//86,SEG_NUMF = 8'h71;//8e;//数码管位选 0~3 对应输出parameter SEG_WE0 = 4'b1110,SEG_WE1 = 4'b1101,SEG_WE2 = 4'b1011,SEG_WE3 = 4'b0111;//递增数据产生单元reg[24:0] cnt_1s; //1s计数器,0-24999999(时钟频率25MHz)reg[15:0] dis_data; //数码管显示数据,16位//1s定时计数always @(posedge clk or negedge rst_n)if(!rst_n) cnt_1s <= 25'd0;else if(cnt_1s == 25'd24_999_999) cnt_1s <= 25'd0;else cnt_1s <= cnt_1s+1'b1;wire done_1s = (cnt_1s == 25'd24_999_999); //1s定时到标志位,高有效一个时钟周期//显示数据每秒递增always @(posedge clk or negedge rst_n)if(!rst_n) dis_data <= 16'd0;else if(done_1s) dis_data <= dis_data+1'b1;//-------------------------------------------------//分时显示数据控制单元reg[7:0] seg_num; //当前显示数据reg[7:0] seg_duan; //7段数码管段选信号(包括小数点为8段)reg[3:0] seg_wei; //7段数码管位选信号reg[7:0] cnt_4; //分时计数器,每个clk自加“1”always @(posedge clk or negedge rst_n)if(!rst_n) cnt_4 <= 8'd0;else cnt_4 <= cnt_4+1'b1;//显示数据,1s内seg_num不变,直到dis_data变化此信号才发生变化always @(posedge clk or negedge rst_n)if(!rst_n) seg_num <= 8'h00;elsecase(cnt_4[7:6])2'b00: seg_num <= dis_data[3:0]; //00h~3fh2'b01: seg_num <= dis_data[7:4]; //40h~7fh2'b10: seg_num <= dis_data[11:8]; //80h~bfh2'b11: seg_num <= dis_data[15:12]; //c0h~ffhdefault: seg_num <= 8'h00;endcase//段选数据译码,由于seg_num在1s内保持不变,故此信号1s内保持不变always @(posedge clk or negedge rst_n)if(!rst_n) seg_duan <= 8'h00;elsecase(seg_num)4'h0: seg_duan <= SEG_NUM0;4'h1: seg_duan <= SEG_NUM1;4'h2: seg_duan <= SEG_NUM2;4'h3: seg_duan <= SEG_NUM3;4'h4: seg_duan <= SEG_NUM4;4'h5: seg_duan <= SEG_NUM5;4'h6: seg_duan <= SEG_NUM6;4'h7: seg_duan <= SEG_NUM7;4'h8: seg_duan <= SEG_NUM8;4'h9: seg_duan <= SEG_NUM9;4'ha: seg_duan <= SEG_NUMA;4'hb: seg_duan <= SEG_NUMB;4'hc: seg_duan <= SEG_NUMC;4'hd: seg_duan <= SEG_NUMD;4'he: seg_duan <= SEG_NUME;4'hf: seg_duan <= SEG_NUMF;default: ;endcase//位选译码,2的8次方时间分成4段,每段时间内选通一个7段led管always @ (cnt_4[7:6])case(cnt_4[7:6])2'b00: seg_wei <= SEG_WE0;2'b01: seg_wei <= SEG_WE1;2'b10: seg_wei <= SEG_WE2;2'b11: seg_wei <= SEG_WE3;default: seg_wei <= 4'b1111;endcase//-------------------------------------------------//74HC95驱动译码reg ds_stcpr; //74HC595的并行时钟输入,上升沿将当前串行输入数据并行输出reg ds_shcpr; //74HC595的串行时钟输入,上升沿锁存当前串行输入数据reg ds_datar; //74HC595的串行数据输入//串行移位时钟产生,在cnt_4所处区间上时,即每隔20H个clk周期,ds_shcpr 每个clk都会翻转一次,而剩下20H个周期保持之前的状态不变,在cnt_4的计时大周期内发生4次always @(posedge clk or negedge rst_n)if(!rst_n) ds_shcpr <= 1'b0;else if((cnt_4 > 8'h02 && cnt_4 <= 8'h22) || (cnt_4 > 8'h42 && cnt_4 <= 8'h62)|| (cnt_4 > 8'h82 && cnt_4 <= 8'ha2) || (cnt_4 > 8'hc2 && cnt_4 <= 8'he2))ds_shcpr <= ~ds_shcpr;//串行移位数据产生,在cnt_4的02—22期间,每个clk都将seg_duan,seg_wei 的1位送给ds_datar,在一个cnt_4计时大周期内总共送4次always @(posedge clk or negedge rst_n)if(!rst_n) ds_datar <= 1'b0;elsecase(cnt_4)8'h02,8'h42,8'h82,8'hc2: ds_datar <= seg_duan[7];8'h04,8'h44,8'h84,8'hc4: ds_datar <= seg_duan[6];8'h06,8'h46,8'h86,8'hc6: ds_datar <= seg_duan[5];8'h08,8'h48,8'h88,8'hc8: ds_datar <= seg_duan[4];8'h0a,8'h4a,8'h8a,8'hca: ds_datar <= seg_duan[3];8'h0c,8'h4c,8'h8c,8'hcc: ds_datar <= seg_duan[2];8'h0e,8'h4e,8'h8e,8'hce: ds_datar <= seg_duan[1];8'h10,8'h50,8'h90,8'hd0: ds_datar <= seg_duan[0];8'h1a,8'h5a,8'h9a,8'hda: ds_datar <= seg_wei[0];8'h1c,8'h5c,8'h9c,8'hdc: ds_datar <= seg_wei[1];8'h1e,8'h5e,8'h9e,8'hde: ds_datar <= seg_wei[2];8'h20,8'h60,8'ha0,8'he0: ds_datar <= seg_wei[3];default: ;endcase//并行移位时钟产生,即在23,63,a3,e3时刻置“1”,而在02,42,82,c2时刻置“0”always @(posedge clk or negedge rst_n)if(!rst_n) ds_stcpr <= 1'b0;else if((cnt_4 == 8'h02) || (cnt_4 == 8'h42) || (cnt_4 == 8'h82) || (cnt_4 == 8'hc2)) ds_stcpr <= 1'b0;else if((cnt_4 == 8'h23) || (cnt_4 == 8'h63) || (cnt_4 == 8'ha3) || (cnt_4 == 8'he3)) ds_stcpr <= 1'b1;wire ds_stcp = ds_stcpr;wire ds_shcp = ds_shcpr;wire ds_data = ds_datar;endmodule-------------------------------------------------------------------------------------------------------------------1.74HC595相关2.模块相关信号定义:2.程序设计相关①最开始参数化定义了SEG_NUM0—SEG_NUMF,对应7段数码管的显示,再定义了SEG_WE0—SEG_WE3,对应数码管的位选②时钟为25MHz,用cnt_1s完成1s计时,1s计时到了,使done_1s信号有效,并使dis_data每秒“+1”③之后的代码参考下面这张图来说明Cnt_4每个clk周期计数,其总的计数周期可以分为4段时间,分时扫描显示数据和位选信号。

24小时数字时钟的VHDL程序 2012

24小时数字时钟的VHDL程序 2012

24小时数字时钟的VHDL程序2012-4-20 23:24阅读(37)先编辑一个74LS161十进制计数器:Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity court161 isport( clk,CTT,CTP,LD,CR:in std_logic;D3,D2,D1,D0: in std_logic;Q:out std_logic_VECTOR(3 DOWNTO 0);Co: out std_logic);end court161;architecture court of court161 issignal a,b,c: std_logic ;signal D,CQI:std_logic_vector(3 downto 0);beginD<=D3&D2&D1&D0;a<=CTT and CTP;b<=(not (CQI(3) and CQI(0)))and LD; process(clk,CTT,CTP,LD,CR,D3,D2,D1,D0) beginif a='1' thenif clk'event and clk='1' thenif b='0' then CQI<=D;else CQI<=CQI+1;end if;end if;if CQI=9 then c<='1';else c<='0';end if;end if;if clk'event and clk='1' then Co<=c;end if;if CR='0' then CQI<="0000";end if;Q<=CQI ;end process; end ;再编辑一个7段数码管(共阴极)显示驱动程序:Library ieee;Use ieee.std_logic_1164.all;Entity QDLED7 isPORT(DATA:IN STD_LOGIC_VECTOR(3 DOWNTO 0);a,b,c,d,e,f,g:out std_logic);end QDLED7;Architecture LED of QDLED7 issignal y: STD_LOGIC_VECTOR(6 DOWNTO 0); beginprocess(DATA)begincase DATA iswhen "0000"=>y<="1111110" ;when "0001"=>y<="0110000" ;when "0010"=>y<="1101101" ;when "0011"=>y<="1111001" ;when "0100"=>y<="0110011" ;when "0101"=>y<="1011011" ;when "0110"=>y<="1011111" ;when "0111"=>y<="1110000" ;when "1000"=>y<="1111111" ;when "1001"=>y<="1111011" ;when others=>null;end case;a<=y(6);b<=y(5);c<=y(4);d<=y(3);e<=y(2);f<=y(1);g<=y(0);end process;end;然后在编写时钟描述语言Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity timer24 isport(CP,CR:IN STD_LOGIC;AS0,BS0,CS0,DS0,ES0,FS0,GS0,AS1,BS1,CS1,DS1,ES1,FS1 ,GS1:OUT STD_LOGIC;AM0,BM0,CM0,DM0,EM0,FM0,GM0,AM1,BM1,CM1,DM1,EM1,FM1 ,GM1:OUT STD_LOGIC;AH0,BH0,CH0,DH0,EH0,FH0,GH0,AH1,BH1,CH1,DH1,EH1,FH1 ,GH1:OUT STD_LOGIC);END TIMER24;architecture TIMER of TIMER24 issignal H1,H0,M1,M0,S1,S0:std_logic_vector(3 downto 0); SIGNAL C0,C1,C2,C3,C4,C5: std_logic ;COMPONENT court161 IS port( clk,CTT,CTP,LD,CR:in std_logic;D3,D2,D1,D0:in std_logic;Q:out std_logic_VECTOR(3 DOWNTO 0);Co: out std_logic);end COMPONENT;COMPONENT QDLED7 ISPORT(DATA:IN STD_LOGIC_VECTOR(3 DOWNTO 0);a,b,c,d,e,f,g:out std_logic);end COMPONENT;beginU0:court161 PORTMAP(CP,'1','1','1',CR,'0','0','0','0',S0,C0);U1:court161 PORT MAP(C0,'1','1',(NOT(S1(2)ANDS1(0))),CR,'0','0','0','0',S1,C1);U2:court161 PORT MAP((NOT(S1(2)ANDS1(0))),'1','1','1',CR,'0','0','0','0',M0,C2);U3:court161 PORT MAP(C2,'1','1',(NOT(M1(2)ANDM1(0))),CR,'0','0','0','0',M1,C3);U4:court161 PORT MAP(C3,'1','1','1',(CR AND(NOT(H1(1) AND H0(2)))),'0','0','0','0',H0,C4);U5:court161 PORT MAP(C4,'1','1',(NOT H1(1)),(CRAND(NOT(H1(1) AND H0(2)))),'0','0','0','0',H1,C5);U6:QDLED7 PORT MAP(S0,AS0,BS0,CS0,DS0,ES0,FS0,GS0);U7:QDLED7 PORT MAP(S1,AS1,BS1,CS1,DS1,ES1,FS1,GS1);U8:QDLED7 PORT MAP(M0,AM0,BM0,CM0,DM0,EM0,FM0,GM0);U9:QDLED7 PORT MAP(M1,AM1,BM1,CM1,DM1,EM1,FM1,GM1);U10:QDLED7 PORT MAP(H0,AH0,BH0,CH0,DH0,EH0,FH0,GH0);U11:QDLED7 PORT MAP(H1,AH1,BH1,CH1,DH1,EH1,FH1,GH1);END;接上数码管,和脉冲信号发生器,必要时要分频,分成脉冲周期为1秒的脉冲周期方可。

24小时计时器设计

24小时计时器设计

24小时计时器设计摘要:使用硬件描述语言VHDL进行编程,设计六十进制和二十四进制计数器,利用原理图输入设计方法,使用两片六十进制计数器和一片二十四进制计数器,设计出了一个24小时计时器系统。

使用QuartusII软件进行编译,时序仿真,来验证该系统的正确性。

整个系统设计简单,使用方便,具有24小时计时显示功能,可以分别对时,分,秒进行校正。

关键词:VHDL 计数器24小时计时器目录1.设计背景 (1)2.设计方案 (1)2.1.六十进制计数器设计 (2)2.2.二十四进制计数器设计 (3)3.方案实施 (5)4.仿真结果 (6)5.参考文献 (7)1.设计背景随着EDA技术的发展和应用领域的扩大,EDA技术在电子信息、通信、自动控制及计算机应用等领域的重要性日益突出。

基于EDA技术的数字系统设计,一般可以再单片PLD实现,具有功能强、功耗低,体积小、可靠性高等特点,成为当今数字系统设计的主流。

此次EDA课程大作业,我的设计课题是24小时计时器系统设计,根据要求使用平时所学VHDL语言进行编程和原理图输入设计方法来完成。

报告书主要包括设计背景、设计方案、方案实施、仿真波形。

设计方案主要介绍了我对于设计课题的大致设计思路,之后各个部分将会详细介绍设计组成及程序。

2.设计方案24小时计时器的原理图如图2.1所示。

它由两片六十进制计时器和一片二十四进制计数器构成,输入CLK为1Hz的时钟,经过60分频后产生1分钟时钟信号,再经过60分频后,产生1小时的时钟信号,最后进行24分频,得到1天的脉冲送COUT输出。

将两个60分频和一个24分频的输出送7段数码管,得到24小时的计时显示结果。

图2.1 24小时计时器的原理图图2.1中的CLK是1Hz时钟输入端;RST是复位输入端,高电平有效;JM、JF和JS分别是校秒、校分和校时的输入端,下将沿有效;QM[7..0]、QF[7..0]和QS[7..0]分别是秒、分、时的计时输出端;COUT是“天”脉冲输出端。

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

VERILOG24小时多功能数字钟的设计班级:自动化学生:XXXXX 学号:XXXXXX1 设计目标掌握可编程逻辑器件的应用开发技术——设计输入、编译、仿真和器件编程;熟悉一种EDA软件使用与实验系统介绍;掌握Verilog HDL设计方法,设计一个多功能数字钟,满足以下要求:①能显示小时、分钟、秒钟(小时以24进制,时、分用显示器,秒用LED);②能调整小时、分钟的时间;③复位;2 实验装置586计算机,MAX+plusⅡ 10.2软件,专用编程电缆,EDA Pro2K数字实验装置等。

3 设计步骤和要求①在MAX+plusⅡ 10.2软件中,输入设计的原理图,采用Verilog HDL输入方式,采用分层模块的设计方法设计电路②对电路进行仿真分析;③选择器件,分配引脚,重新对设计项目进行编译和逻辑综合;④对EDA Pro2K数字实验装置中的FPGA器件进行在系统编程,并实际测试电路的逻辑功能(用实验板上的译码显示电路显示结果);4 具体步骤4.1 建立 Quartus 工程;1.打开 Quartus II 工作环境2.点击菜单项 File->New Project Wizard 帮助新建工程3.输入工程工作路径、工程文件名以及顶层实体名4.添加设计文件5.选择设计所用器件6.设置EDA工具7.查看新建工程总结在完成新建后,Quartus II 界面中Project Navigator 的Hierarchy 标签栏中会出现用户正在设计的工程名以及所选用的器件型号4.2 使用 Verilog HDL 完成设计输入代码如下:(1)数字钟顶层模块://*****************timeclock top block(top_clock.v)***************module clock_24(CLK,CP,nCR,EN,Adj_Min,Adj_Hour,SEG7_1,SEG7_2,SEG7_3,SEG7_4);input CLK,nCR,EN,Adj_Min,Adj_Hour; //定义输入端口变量output[7:0]SEG7_1,SEG7_2,SEG7_3,SEG7_4;output CP;wire CP;wire[7:0]Hour,Minute,Second; //说明变量的类型supply1 Vdd;wire MinL_EN,MinH_EN,Hour_EN; //定义中间变量freqDiv UO(CLK,CP);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);assignMinH_EN=(Adj_Min&&(Minute[3:0]==4'h9))||(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); //分计数器十位//产生小时计数器使能信号。

Adj_Hour=1,校正小时;Adj_Hour=0,小时正常计时assign Hour_EN=Adj_Hour?Vdd:((Minute==8'h59)&&(Second==8'h59));//24进制小时计数器:调用24进制底层模块构成counter24 U5(Hour[7:4],Hour[3:0],nCR,Hour_EN,CP); //小时计数器SEG7_LUT U6(SEG7_1,Hour[7:4]);SEG7_LUT U7(SEG7_2,Hour[3:0]);SEG7_LUT U8(SEG7_3,Minute[7:4]);SEG7_LUT U9(SEG7_4,Minute[3:0]);endmodule(2)十进制计数器模块://***********counter10.v(BCD:0~5)********************************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; //nCR=0,计数器被异步清零else if(~EN)Q<=Q; //EN=0,暂停计数else if(Q==4'b1001)Q<=4'b0000;else Q<=Q+1'b1; //计数器增1计数endmodule(3)六进制计数器模块://***********counter6.v(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; //nCR=0,计数器被异步清零else if(~EN)Q<=Q; //EN=0,暂停计数else if(Q==4'b0101)Q<=4'b0000;else Q<=Q+1'b1; //计数器增1计数endendmodule(4)24进制计数器模块://***********counter24.v(BCD:0~23)*********************************module counter24(CntH,CntL,nCR,EN,CP);input CP,nCR,EN;output[3:0]CntH,CntL;reg [3:0] CntH,CntL;always@(posedge CP or negedge nCR)beginif(~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))begin CntH<=CntH; CntL<=CntL+1'b1;endelse if(CntL==9)begin CntH<=CntH+1'b1; CntL<=4'b0000;endelsebegin CntH<=CntH; CntL<=CntL+1'b1;endend(5)分频模块://***********freqDiv.v********************************* module freqDiv(in_50MHz,out_1Hz);input in_50MHz;output out_1Hz;reg out_1Hz;reg [25:0]cnt;always@(posedge in_50MHz)begincnt <= cnt + 1'B1;if(cnt < 26'd2*******)out_1Hz <=0;elsebeginif(cnt >= 26'd5*******)cnt <= 26'b0;else out_1Hz <=1;endendendmodule(6)显示模块://***********SEG7_LUT.v********************************* module SEG7_LUT(oSEG1,iDIG);input [3:0] i DIG;output [7:0] o SEG1;reg [7:0] o SEG;wire [7:0] oSEG1;always @(iDIG)begincase(iDIG)4'h0: oSEG = 8'b00111111;4'h1: oSEG = 8'b00000110;4'h2: oSEG = 8'b01011011;4'h3: oSEG = 8'b01001111;4'h4: oSEG = 8'b01100110;4'h5: oSEG = 8'b01101101;4'h6: oSEG = 8'b01111101;4'h7: oSEG = 8'b00000111;4'h8: oSEG = 8'b01111111;4'h9: oSEG = 8'b01101111;4'ha: oSEG = 8'b01110111;4'hb: oSEG = 8'b01111100;4'hc: oSEG = 8'b00111001;4'hd: oSEG = 8'b01011110;4'he: oSEG = 8'b01111001;4'hf: oSEG = 8'b01110001;endcaseendassign oSEG1=~oSEG;endmodule4.3 电路编译4.4 电路仿真选择仿真参数保存波形文件Q_DECODE_38.vwf点击菜单项Processing->Generate Functional Simulation Netlist,产生功能仿真网表点击菜单项Processing->Start Simulation 启动功能仿真4.5 器件的编程下载下载程序:在Programmer界面中,将.sof 文件列表中Program/Configure 属性勾上再点击Start 按钮,开始下载程序。

完成后,下载程序显示100%最终调试,在DE0 实验板上,扳动SW2,SW1 和SW0 开关,可以看到译码之后的LEDR7-LEDR0 红色LED 发光输出。

相关文档
最新文档