Quartus编程实现时钟,具有基本的时间显示功能(00:00:00~23:59:59),以及其他附加功能:调整时间,设置闹铃,或者其它与时钟相关的功能。Modelsim实现仿真。
设计代码:
module clock(
clk, //时钟信号
rst_n, //复位信号
en, //控制时间的暂停
dout, //定时闹钟的输出
sel1, //更改定时闹钟的分的个位
sel2, //更改定时闹钟的分的十位
sel3, //更改定时闹钟的时的个位
sel4, //更改定时闹钟的时的十位
led_SG, //秒的个位
led_SS, //秒的十位
led_CG, //分的个位
led_CS, //分的十位
led_HG, //时的个位
led_HS //时的十位
);
input clk;
input rst_n;
input en;
input sel1;
input sel2;
input sel3;
input sel4;
output dout;
//秒
output led_SG;
output led_SS;
//分
output led_CG;
output led_CS;
//时
output led_HG;
output led_HS;
parameter CNT=50; //计数一秒需要的次数
parameter IDLE=3'b000;
parameter S1=3'b001;
parameter S2=3'b010;
parameter S3=3'b011;
parameter S4=3'b100; //S4为输出态
reg [8-1:0] led_SG ;
reg [8-1:0] led_SS ;
reg [8-1:0] led_CG ;
reg [8-1:0] led_CS ;
reg [8-1:0] led_HG ;
reg [8-1:0] led_HS ;
/*计数1秒的相关计数变量*/
reg [26-1:0] cnt0 ;
wire add_cnt0 ;
wire end_cnt0 ;
/*秒计数的相关变量,cnt1为秒的个位,cnt2为秒的十位*/
reg [4-1:0] cnt1 ;
wire add_cnt1 ;
wire end_cnt1 ;
reg [4-1:0] cnt2 ;
wire add_cnt2 ;
wire end_cnt2 ;
/*分计数的相关变量,cnt3为分的个位,cnt4为分的十位*/
reg [4-1:0] cnt3 ;
wire add_cnt3 ;
wire end_cnt3 ;
reg [4-1:0] cnt4 ;
wire add_cnt4 ;
wire end_cnt4 ;
/*时计数的相关变量,cnt5为时的个位,cnt6为时的十位*/
reg [4-1:0] cnt5 ;
wire add_cnt5 ;
wire end_cnt5 ;
reg [4-1:0] cnt6 ;
wire add_cnt6 ;
wire end_cnt6 ;
/*x用来确定时的个位cnt5计数的次数为10次还是4次,
当时的十位cnt6为0和1时,时的个位计数10次,
当时的十位cnt6为2时,时的个位计数4次*/
reg [3:0] x ;
wire [3:0] sel1;
wire [3:0] sel2;
wire [3:0] sel3;
wire [3:0] sel4;
wire [3:0] key;
reg [3:0] setup;
reg dout;
reg [2:0] state_c; //状态机的现态
reg [2:0] state_n; //状态机的次态
wire [2:0] idle2s1_start; //状态机初态转S1态的条件
wire [2:0] s12s2_start; //状态机S1态转S2态的条件
wire [2:0] s22s3_start; //状态机S2态转S3态的条件
wire [2:0] s32s4_start; //状态机S3态转S4态的条件
wire [2:0] s42idle; //状态机S4态转初态的条件
/**********************************************************************************************
**********************************************时钟*********************************************
**********************************************************************************************/
/*********************************
*************秒计数器**************
*********************************/
//计数1秒
always @(posedge clk or negedge rst_n)begin
if(!rst_n) begin
cnt0 |