|
- module clk(Clk0,Clk1,Change,Mkey,Hkey,SEG,DIG);
- input Clk0,Clk1,Change,Mkey,Hkey;//clk0为FPGA晶振频率,clk1为1hz时钟频率
- output [7:0] SEG,DIG;//数码管的段选和位选
- reg [12:0] CNT_R0;
- reg F_OUT;
- reg [7:0] HOUR,MIN,SEC;
- wire hclk,mclk;
- reg flag,mc,hc;
- reg [2:0] SCAN_R;
- reg [3:0] SEG_M [7:0];
- reg [7:0] SEG_DR;
- reg [7:0] SEG,DIG;
- always @(posedge Clk0)//分频
- begin
- CNT_R0 <= CNT_R0 + 1'b1;
-
- if(CNT_R0 < 4096)
- begin
- F_OUT <= 1;
- end
- else
- begin
- F_OUT <= 0;
- end
- end
- always @(posedge F_OUT)
- begin
- SCAN_R = SCAN_R + 1'b1;
-
- case(SCAN_R)
- 3'h0 : begin DIG = 8'hFE ; SEG_DR = SEG_M[0]; end
- 3'h1 : begin DIG = 8'hFD ; SEG_DR = SEG_M[1]; end
- 3'h2 : begin DIG = 8'hFB ; SEG_DR = SEG_M[2]; end
- 3'h3 : begin DIG = 8'hF7 ; SEG_DR = SEG_M[3]; end
- 3'h4 : begin DIG = 8'hEF ; SEG_DR = SEG_M[4]; end
- 3'h5 : begin DIG = 8'hDF ; SEG_DR = SEG_M[5]; end
- 3'h6 : begin DIG = 8'hBF ; SEG_DR = SEG_M[6]; end
- 3'h7 : begin DIG = 8'h7F ; SEG_DR = SEG_M[7]; end
- endcase
- end
- always @(posedge Clk0)
- begin
- case(SEG_DR)
- 4'h0 : SEG <= 8'h3F;
- 4'h1 : SEG <= 8'h06;
- 4'h2 : SEG <= 8'h5B;
- 4'h3 : SEG <= 8'h4F;
- 4'h4 : SEG <= 8'h66;
- 4'h5 : SEG <= 8'h6D;
- 4'h6 : SEG <= 8'h7D;
- 4'h7 : SEG <= 8'h07;
- 4'h8 : SEG <= 8'h7F;
- 4'h9 : SEG <= 8'h6F;
- 4'hA : SEG <= 8'h40;
- default : SEG <= 4'h00;
- endcase
- end
- always @(posedge Change)//选择手动调时还是正常计时
- begin
- if(flag==0)
- flag<=1;
- else
- flag<=0;
- end
- always @(posedge Clk1)
- begin
- if(SEC==8'b01011001)begin SEC<=0; if(flag==0)mc<=1;else mc<=mc;end
- else begin
- if(SEC[3:0]==4'b1001)
- begin SEC[3:0]<=0;SEC[7:4]<=SEC[7:4]+1'b1;if(flag==0)mc<=0;else mc<=mc;end
- else
- begin
- SEC[3:0]<=SEC[3:0]+1'b1;if(flag==0)mc<=0;else mc<=mc; end
- end
- end
- assign mclk=(flag==0)?(!flag&mc):(!mc&Mkey)|(mc&!Mkey);
- always @(posedge mclk)
- begin
- if(MIN==8'b01011001)begin MIN<=0; if(flag==0)hc<=1;else hc<=hc;end
- else begin
- if(MIN[3:0]==4'b1001)
- begin
- MIN[3:0]<=0;MIN[7:4]<=MIN[7:4]+1'b1;if(flag==0)hc<=0;else hc<=hc;end
- else
- begin
- MIN[3:0]<=MIN[3:0]+1'b1;if(flag==0)hc<=0;else hc<=hc; end
- end
- end
- assign hclk=(flag==0)?(!flag&hc):(!hc&Hkey)|(hc&!Hkey);
- always @(posedge hclk)
- begin
- if(HOUR==8'h00100011) HOUR<=0;
- else begin
- if(HOUR[3:0]==4'b1001)begin HOUR[3:0]<=0;HOUR[7:4]<=HOUR[7:4]+1'b1;end
- else
- HOUR[3:0]<=HOUR[3:0]+1'b1;
- end
- end
- always @(posedge Clk0)
- begin
- SEG_M[0] = SEC[3:0];
- SEG_M[1] = SEC[7:4];
- SEG_M[2] = 4'hA;
- SEG_M[3] = MIN[3:0];
- SEG_M[4] = MIN[7:4];
- SEG_M[5] = 4'hA;
- SEG_M[6] = HOUR[3:0];
- SEG_M[7] = HOUR[7:4];
- end
- endmodule
复制代码 |
|