各位兄弟,帮我看下我写的
电子钟,键盘校时的时候,不是1分钟加,而是按一下键就+8。我是初学者,代码如下:
/****************************************Copyright (c)**************************************************
** Dongdong Studio
**
**---------------------------------------File Info-----------------------------------------------------
** File name: SegLed_V2
** Last modified Date: 2012-12-18
** Last Version: 2.0
** Descrip
tions: SegLed
**------------------------------------------------------------------------------------------------------
** Created by: dongdong
** Created date: 2009-10-18
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions: modify hc595 driver segled to 8550
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
module SegLed_V2 (
//input
input sys_clk ,
input sys_rst_n ,
input key1 ,
input key2 ,
//output
output reg seg_c1 ,//wire macq modify
output reg seg_c2 ,
output reg seg_c3 ,
output reg seg_c4 ,
output reg seg_a ,
output reg seg_b ,
output reg seg_c ,
output reg seg_d ,
output reg seg_e ,
output reg seg_f ,
output reg seg_g ,
output reg seg_h
);
//parameter define
//parameter WIDTH2 = 26;
//parameter WIDTH = 5;
//parameter SIZE = 8;
//reg define
reg [3:0] counter;
//reg [WIDTH2-1:0] count ; //macq del
//reg [SIZE-1:0] disp_data ;//macq del
//reg [SIZE-1:0] dat ;//macq del
//reg disp_clk ;//macq del
reg [19:0] dis_cnt;
reg [27:0] clk_cnt; //时钟clock的计数器
reg [3:0] led_en;
reg [19:0] key_cnt; //扫键计数寄存器
reg segled_a ;
reg segled_b ;
reg segled_c ;
reg segled_d ;
reg segled_e ;
reg segled_f ;
reg segled_g ;
reg segled_h ;
//wire define
//////////////////////////////////////////// macq add
//reg[27:0] count;
reg[3:0] sec,min,hour;
reg[2:0] sec1,min1,hour1;
//////////////////////////////////////////////
reg [1:0] low_sw;
reg [1:0] low_sw_r; //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中
//当寄存器low_sw由1变为0时,led_ctrl的值变为高,维持一个时钟周期
wire [1:0] key_ctrl = low_sw_r[1:0] & ( ~low_sw[1:0]);
reg d1;
reg d2;
/*******************************************************************************************************
** Main Program
**
********************************************************************************************************/
always @ (posedge sys_clk or negedge sys_rst_n)
if (!sys_rst_n) //异步复位
key_cnt <= 20'd0;
else
key_cnt <= key_cnt + 1'b1;
always @(posedge sys_clk or negedge sys_rst_n)
begin
if (!sys_rst_n)
begin
low_sw <= 2'b11;
low_sw_r <= 2'b11;
end
else if (key_cnt == 20'hfffff) //满20ms,将按键值锁存到寄存器low_sw中
begin
low_sw <= {key2,key1};
low_sw_r <= low_sw;
end
if (!sys_rst_n)
begin
d1 <= 1'b0;
d2 <= 1'b0;
end
else
begin //某个按键值变化时...
if ( key_ctrl[0] ) d1 <= ~d1;
if ( key_ctrl[1] ) d2 <= ~d2;
if(d1 == 1'b1)
begin
if((hour==3)&&(hour1==2))//是否到了24小时
begin
sec<=4'd0;
sec1<=3'd0;
min<=4'd0;
min1<=3'd0;
hour<=4'd0;
hour1<=3'd0;
end
else if(hour==9)
begin
hour1<=hour1+1'b1;
hour<=4'd0;
end
else
hour <= hour + 1'b1;
end
if(d2 == 1'b1)
begin
if((min==9)&& (min1==5))
begin
min<=4'd0;
min1<=3'd0;
end
else if(min==9)
begin
min1 <= min1+1'b1;
min<=4'd0;
end
else
min <= min+1'b1;
end
end
if (sys_rst_n ==1'b0) //按键复位,如果复位电平是1位宽的二进制0(低电平复位)
begin
clk_cnt <= 28'b0;
// dis_cnt <= 20'd0;
sec <= 4'b0;//macq add
min <= 4'b0;//macq add
hour <= 4'b0;//macq add
sec1 <= 3'b0;//macq add
min1 <= 3'b0;//macq add
hour1 <= 3'b0;//macq add
end
else if (clk_cnt == 28'd50000000)// 板子晶振为50Mhz,定时 1 秒
begin
clk_cnt <=28'd0;
sec<=sec+1'b1;
/*
//校时,以每秒钟作为触发探测校时按键状态
if(key1 == 1'b0)
begin
if((hour==3)&&(hour1==2))//是否到了24小时
begin
sec<=4'd0;
sec1<=3'd0;
min<=4'd0;
min1<=3'd0;
hour<=4'd0;
hour1<=3'd0;
end
else if(hour==9)
begin
hour1<=hour1+1'b1;
hour<=4'd0;
end
else
hour <= hour + 1'b1;
end
if(key2 == 1'b0)
begin
if((min==9)&& (min1==5))
begin
min<=4'd0;
min1<=3'd0;
end
else if(min==9)
begin
min1 <= min1+1'b1;
min<=4'd0;
end
else
min <= min+1'b1;
end
//校时完
*/
if(sec==9)
begin ////////begin 4
if(sec==9&&sec1==5) //是否到分
begin//begin 3
if(min==9)
begin///////////begin 2
if(min1==5)//是否到时
begin //////////begin 1
if(hour==9)
begin
hour1<=hour+1'b1;
hour<=4'd0;
end
else if(hour==3&&hour1==2)//是否到了24小时
begin
sec<=4'd0;
sec1<=3'd0;
min<=4'd0;
min1<=3'd0;
hour<=4'd0;
hour1<=3'd0;
end
else
begin
sec<=4'd0;
sec1<=3'd0;
min<=4'd0;
min1<=3'd0;
hour<=hour+1'b1;
end
end ////////////////end 1
else
begin
sec<=4'd0;
sec1<=3'd0;
min<=4'd0;
min1<=min1+1'b1;
end
end //////end 2
else
begin
sec<=4'd0;
sec1<=3'd0;
min<=min+1'b1;
end
end////end 3
else
begin
sec<=4'd0;
sec1<=sec1+1'b1;
end
end /////////end 4
end
else
clk_cnt <= clk_cnt+1'b1;
end
always @(posedge sys_clk) //大约1到2毫秒钟的分频
begin
if(dis_cnt==100000)
begin
dis_cnt <= 20'd0;
led_en<=led_en+1'b1;
if(led_en==4)
led_en<=4'd0;
end
else
dis_cnt<=dis_cnt+1'b1;
end
always @(posedge sys_clk)
begin
case(led_en)
4'd0:
begin
//清屏
segled_a = 0 ;
segled_b = 0 ;
segled_c = 0 ;
segled_d = 0 ;
segled_e = 0;
segled_f = 0 ;
segled_g = 0 ;
segled_h = 0 ;
if(clk_cnt >= 28'd4000000)
begin
seg_c1 = 1'b1;//数码管的位选通,下同
seg_c2 = 1'b1;
seg_c3 = 1'b0;
seg_c4 = 1'b1;
segled_a = 0;
segled_b = 0 ;
segled_c = 0 ;
segled_d = 0 ;
segled_e = 0;
segled_f = 0 ;
segled_g = 0;
segled_h = 1 ;
end
end
4'd1:
begin
//清屏
segled_a = 0 ;
segled_b = 0 ;
segled_c = 0 ;
segled_d = 0 ;
segled_e = 0;
segled_f = 0 ;
segled_g = 0 ;
segled_h = 0 ;
seg_c1 = 1'b0;//数码管的位选通,下同
seg_c2 = 1'b1;
seg_c3 = 1'b1;
seg_c4 = 1'b1;
case(min)
4'd0://0
begin
segled_a = 1 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 1 ;
segled_e = 1 ;
segled_f = 1 ;
segled_g = 0 ;
segled_h = 0 ;
end
4'd1://1
begin
segled_a = 0 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 0 ;
segled_f = 0 ;
segled_g = 0 ;
segled_h = 0 ;
end
4'd2:
begin
segled_a = 1 ;
segled_b = 1 ;
segled_c = 0 ;
segled_d = 1 ;
segled_e = 1 ;
segled_f = 0 ;
segled_g = 1 ;
segled_h = 0 ;
end
4'd3:
begin
segled_a = 1 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 1 ;
segled_f = 0 ;
segled_g = 1 ;
segled_h = 0 ;
end
4'd4:
begin
segled_a = 0 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 0 ;
segled_f = 1 ;
segled_g = 1 ;
segled_h = 0 ;
end
4'd5:
begin
segled_a = 1 ;
segled_b = 0 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 1 ;
segled_f = 1 ;
segled_g = 1 ;
segled_h = 0 ;
end
4'd6:
begin
segled_a = 1 ;
segled_b = 0 ;
segled_c = 1 ;
segled_d = 1 ;
segled_e = 1 ;
segled_f = 1 ;
segled_g = 1 ;
segled_h = 0 ;
end
4'd7:
begin
segled_a = 1 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 0 ;
segled_f = 0 ;
segled_g = 0 ;
segled_h = 0 ;
end
4'd8:
begin
segled_a = 1 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 1 ;
segled_e = 1 ;
segled_f = 1 ;
segled_g = 1 ;
segled_h = 0; //.
end
4'd9:
begin
segled_a = 1 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 1 ;
segled_f = 1 ;
segled_g = 1 ;
segled_h = 0 ;
end
default:
begin
segled_a = 0 ;
segled_b = 0 ;
segled_c = 0 ;
segled_d = 0 ;
segled_e = 0 ;
segled_f = 0 ;
segled_g = 0 ;
segled_h = 0 ;
end
endcase
end
4'd2:
begin
segled_a = 0 ;
segled_b = 0 ;
segled_c = 0 ;
segled_d = 0 ;
segled_e = 0;
segled_f = 0 ;
segled_g = 0 ;
segled_h = 0 ;
seg_c1 = 1'b1;
seg_c2 = 1'b0;
seg_c3 = 1'b1;
seg_c4 = 1'b1;
case(min1)
3'd0://0
begin
segled_a = 1 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 1 ;
segled_e = 1 ;
segled_f = 1 ;
segled_g = 0 ;
segled_h = 0 ;//.
end
3'd1://1
begin
segled_a = 0 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 0 ;
segled_f = 0 ;
segled_g = 0 ;
segled_h = 0 ;
end
3'd2:
begin
segled_a = 1 ;
segled_b = 1 ;
segled_c = 0 ;
segled_d = 1 ;
segled_e = 1 ;
segled_f = 0 ;
segled_g = 1 ;
segled_h = 0 ;
end
3'd3:
begin
segled_a = 1 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 1 ;
segled_f = 0 ;
segled_g = 1 ;
segled_h = 0 ;
end
3'd4:
begin
segled_a = 0 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 0 ;
segled_f = 1 ;
segled_g = 1 ;
segled_h = 0 ;
end
3'd5:
begin
segled_a = 1 ;
segled_b = 0 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 1 ;
segled_f = 1 ;
segled_g = 1 ;
segled_h = 0 ;
end
default:
begin
segled_a = 0;
segled_b = 0 ;
segled_c = 0 ;
segled_d = 0 ;
segled_e = 0 ;
segled_f = 0 ;
segled_g = 0 ;
segled_h = 0 ;
end
endcase
end
4'd3:
begin
segled_a = 0 ;
segled_b = 0 ;
segled_c = 0 ;
segled_d = 0 ;
segled_e = 0;
segled_f = 0 ;
segled_g = 0 ;
segled_h = 0 ; //en<=8'hfe; //数码管的位选通,下同
seg_c1 = 1'b1;
seg_c2 = 1'b1;
seg_c3 = 1'b0;
seg_c4 = 1'b1;
case(hour)
4'd0://0
begin
segled_a = 1 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 1 ;
segled_e = 1 ;
segled_f = 1 ;
segled_g = 0 ;
segled_h = 0;//.
end
4'd1://1
begin
segled_a = 0 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 0 ;
segled_f = 0 ;
segled_g = 0 ;
segled_h = 0 ;
end
4'd2:
begin
segled_a = 1 ;
segled_b = 1 ;
segled_c = 0 ;
segled_d = 1 ;
segled_e = 1 ;
segled_f = 0 ;
segled_g = 1 ;
segled_h = 0 ;
end
4'd3:
begin
segled_a = 1 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 1 ;
segled_f = 0 ;
segled_g = 1 ;
segled_h = 0 ;
end
4'd4:
begin
segled_a = 0 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 0 ;
segled_f = 1 ;
segled_g = 1 ;
segled_h = 0 ;
end
4'd5:
begin
segled_a = 1 ;
segled_b = 0 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 1 ;
segled_f = 1 ;
segled_g = 1 ;
segled_h = 0 ;
end
4'd6:
begin
segled_a = 1 ;
segled_b = 0 ;
segled_c = 1 ;
segled_d = 1 ;
segled_e = 1 ;
segled_f = 1 ;
segled_g = 1 ;
segled_h = 0 ;
end
4'd7:
begin
segled_a = 1 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 0 ;
segled_f = 0 ;
segled_g = 0 ;
segled_h = 0 ;
end
4'd8:
begin
segled_a = 1 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 1 ;
segled_e = 1 ;
segled_f = 1 ;
segled_g = 1 ;
segled_h = 0 ;//.
end
4'd9:
begin
segled_a = 1 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 1 ;
segled_f = 1 ;
segled_g = 1 ;
segled_h = 0 ;
end
default:
begin
segled_a = 0 ;
segled_b = 0 ;
segled_c = 0 ;
segled_d = 0 ;
segled_e = 0 ;
segled_f = 0 ;
segled_g = 0 ;
segled_h = 0 ;
end
endcase
end
4'd4:
begin
segled_a = 0 ;
segled_b = 0 ;
segled_c = 0 ;
segled_d = 0 ;
segled_e = 0;
segled_f = 0 ;
segled_g = 0 ;
segled_h = 0 ; //en<=8'hfd;
seg_c1 = 1'b1;
seg_c2 = 1'b1;
seg_c3 = 1'b1;
seg_c4 = 1'b0;
case(hour1)
3'd0://0
begin
segled_a = 1 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 1 ;
segled_e = 1 ;
segled_f = 1 ;
segled_g = 0 ;
segled_h = 0 ;//.
end
3'd1://1
begin
segled_a = 0 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 0 ;
segled_f = 0 ;
segled_g = 0 ;
segled_h = 0 ;
end
3'd2:
begin
segled_a = 1 ;
segled_b = 1 ;
segled_c = 0 ;
segled_d = 1 ;
segled_e = 1 ;
segled_f = 0 ;
segled_g = 1 ;
segled_h = 0 ;
end
3'd3:
begin
segled_a = 1 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 1 ;
segled_f = 0 ;
segled_g = 1 ;
segled_h = 0 ;
end
3'd4:
begin
segled_a = 0 ;
segled_b = 1 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 0 ;
segled_f = 1 ;
segled_g = 1 ;
segled_h = 0 ;
end
3'd5:
begin
segled_a = 1 ;
segled_b = 0 ;
segled_c = 1 ;
segled_d = 0 ;
segled_e = 1 ;
segled_f = 1 ;
segled_g = 1 ;
segled_h = 0 ;
end
default:
begin
segled_a = 0 ;
segled_b = 0 ;
segled_c = 0 ;
segled_d = 0 ;
segled_e = 0 ;
segled_f = 0 ;
segled_g = 0 ;
segled_h = 0 ;
end
endcase
end
endcase
end
always @(*)
begin
seg_a = ~segled_a ;
seg_b = ~segled_b ;
seg_c = ~segled_c ;
seg_d = ~segled_d ;
seg_e = ~segled_e ;
seg_f = ~segled_f ;
seg_g = ~segled_g ;
seg_h = ~segled_h ;
end
//assign seg_c1 = 1'b0;
//assign seg_c2 = 1'b0;
//assign seg_c3 = 1'b0;
//assign seg_c4 = 1'b0;
endmodule
//end of RTL code