module shuzi(input CLK,input sign,output reg [11:0] display_out,output HZ,output KHZ,output MHZ,output HIGH ); reg HIGH=0; // reg [11:0]display_out;//数码管 reg [10:0] display;//数码管不带小数点参数 reg HZ,KHZ,MHZ; //档位 integer A=0; reg yichu=0;//高位提醒 reg Time=0; //1hz时钟信号 reg apoint=1'b1,bpoint=1'b1,cpoint=1'b1;//档位初始化 reg count=0;//数码管显示辅助控制时间间隔参数 reg TIMS=50000;//数码管显示控制时间间隔参数 reg sel=0; reg [3:0]A3,A2,A1,A0,QQ6,QQ5,QQ4,QQ3,QQ2,QQ1,QQ0,Q6,Q5,Q4,Q3,Q2,Q1,Q0; always@(posedge CLK) //生成时钟 if(A<=50000000) A<=A+1; else begin Time<=~Time; A<=0; end always@(posedge sign) //计数1 if((Time==1)||(yichu==0)) begin if(Q0 != 4'b1001) begin Q0 <= Q0 + 4'b0001; end else begin Q0 <= 4'b0000; if(Q1 != 4'b1001) begin Q1 <= Q1 + 4'b0001; end else begin Q1 <= 4'b0000; if(Q2 != 4'b1001) begin Q2 <= Q2 + 4'b0001; end else begin Q2 <= 4'b0000; if(Q3 != 4'b1001) begin Q3 <= Q3 + 4'b0001; end else begin Q3 <= 4'b0000; if(Q4 != 4'b1001) begin Q4 <= Q4 + 4'b0001; end else begin Q4 <= 4'b0000; if(Q5 != 4'b1001) begin Q5 <= Q5 + 4'b0001;end else begin Q5<=4'b0000; if(Q6 != 4'b0010) begin Q6<= Q6 + 4'b0001;end else begin Q6 <= 4'b0000;yichu<=1; end end end end end end end end else begin Q6<=0;Q5<=0;Q4<=0;Q3<=0;Q2<=0;Q1<=0;Q0<=0;end always@(negedge sign) //计数2寄存器 begin if (Time==1) begin QQ6<=Q6;QQ5<=Q5;QQ4<=Q4;QQ3<=Q3;QQ2<=Q2;QQ1<=Q1;QQ0<=Q0; end else begin QQ6<=QQ6;QQ5<=QQ5;QQ4<=QQ4;QQ3<=QQ3;QQ2<=QQ2;QQ1<=QQ1;QQ0<=QQ60; end end always@(posedge Time) //档位与小数点 if(QQ6!=0) begin MHZ<=1; apoint<=1'b0; end else if(QQ5!=0) begin KHZ<=1; cpoint<=1'b0; end else if(QQ4!=0) begin KHZ<=1; bpoint<=1'b0; end else if(QQ3!=0) begin KHZ<=1; end else begin HZ<=0;end end
always@(posedge Time) //四舍五入 if ((MHZ==1)||(apoint==0)) //7位时的进位 begin if((QQ5==4'b1001)||(QQ4==4'b1001)||(QQ3==4'b1001)||(QQ2==4'b1001)) begin A3<=QQ6+4'b0001; A2<=4'b0000;A1<=4'b0000;A0<=4'b0000; end else if((QQ4==4'b1001)||(QQ3==4'b1001)||(QQ2==4'b1001)) begin A3<=QQ6;A2<=QQ5+4'b0001;A1<=4'b0000;A0<=4'b0000; end else if((QQ3==4'b1001)||(QQ2==4'b1001)) begin A3<=QQ6;A2<=QQ5;A1<=QQ4+4'b0001;A0<=4'b0000; end else if(QQ2==4'b1001) begin A3<=QQ6;A2<=QQ5;A1<=QQ4;A0<=QQ3+4'b0001; end else begin A3<=QQ6;A2<=QQ5;A1<=QQ4;A0<=QQ3; end end else if((KHZ==1)||(cpoint==0)) //6位时的进位 begin if((QQ4==4'b1001)||(QQ3==4'b1001)||(QQ2==4'b1001)||(QQ1==4'b1001)) begin A3<=QQ5+4'b0001;A2<=4'b0000;A1<=4'b0000;A0<=4'b0000; end else if((QQ3==4'b1001)||(QQ2==4'b1001)||(QQ1==4'b1001)) begin A3<=QQ5;A2<=QQ4+4'b0001;A1<=4'b0000;A0<=4'b0000; end else if((QQ2==4'b1001)||(QQ1==4'b1001)) begin A3<=QQ5;A2<=QQ4;A1<=QQ3+4'b0001;A0<=4'b0000; end else if(QQ1==4'b1001) begin A3<=QQ5;A2<=QQ4;A1<=QQ3;A0<=QQ2+4'b0001; end else begin A3<=QQ5;A2<=QQ4;A1<=QQ3;A0<=QQ2; end end else if((KHZ==1)||(bpoint==0)) //5位时的进位 begin if((QQ3==4'b1001)||(QQ2==4'b1001)||(QQ1==4'b1001)||(QQ0==4'b1001)) begin A3<=QQ4+4'b0001;A2<=4'b0000;A1<=4'b0000;A0<=4'b0000; end else if((QQ2==4'b1001)||(QQ1==4'b1001)||(QQ0==4'b1001)) begin A3<=QQ4;A2<=QQ3+4'b0001;A1<=4'b0000;A0<=4'b0000; end else if((QQ1==4'b1001)||(QQ0==4'b1001)) begin A3<=QQ4;A2<=QQ3;A1<=QQ2+4'b0001;A0<=4'b0000; end else if(QQ0==4'b1001) begin A3<=QQ4;A2<=QQ3;A1<=QQ2;A0<=QQ1+4'b0001; end else begin A3<=QQ4;A2<=QQ3;A1<=QQ2;A0<=QQ1; end end else begin A3<=QQ3;A2<=QQ2;A1<=QQ1;A0<=QQ0; end //4位及4位以下时的进位 always@(posedge CLK) //数码管显示之时间间隔设置 begin if(count==TIMS) begin count<=0; if(sel==4) sel<=0; else sel<=sel+1; end else count<=count+1; end always@(posedge CLK) //溢出提醒LED HIGH<=yichu; always @(posedge Time) //数码管显示 begin if(sel==0) begin case(A3) 4'b0001:display<=11'b0111_1001111; 4'b0010:display<=11'b0111_0010010; 4'b0011:display<=11'b0111_0000110; 4'b0100:display<=11'b0111_1001100; 4'b0101:display<=11'b0111_0100100; 4'b0110:display<=11'b0111_0100000; 4'b0111:display<=11'b0111_0001111; 4'b1000:display<=11'b0111_0000000; 4'b1001:display<=11'b0111_1111011; default:display<=11'b1111_1111111; endcase display_out[11]<=apoint; display_out[10:0]<=display; end else if(sel==1) begin case(A2) 4'b0001:display<=11'b1011_1001111; 4'b0010:display<=11'b1011_0010010; 4'b0011:display<=11'b1011_0000110; 4'b0100:display<=11'b1011_1001100; 4'b0101:display<=11'b1011_0100100; 4'b0110:display<=11'b1011_0100000; 4'b0111:display<=11'b1011_0001111; 4'b1000:display<=11'b1011_0000000; 4'b1001:display<=11'b1011_1111011; default:display<=11'b1111_1111111; endcase display_out[11]<=bpoint; display_out[10:0]<=display; end else if(sel==2) begin case(A1) 4'b0001:display<=11'b1101_1001111; 4'b0010:display<=11'b1101_0010010; 4'b0011:display<=11'b1101_0000110; 4'b0100:display<=11'b1101_1001100; 4'b0101:display<=11'b1101_0100100; 4'b0110:display<=11'b1101_0100000; 4'b0111:display<=11'b1101_0001111; 4'b1000:display<=11'b1101_0000000; 4'b1001:display<=11'b1101_1111011; default:display<=11'b1111_1111111; endcase display_out[11]<=cpoint; display_out[10:0]<=display; end else begin case(A0) 4'b0001:display_out<=12'b10111_1001111; 4'b0010:display_out<=12'b10111_0010010; 4'b0011:display_out<=12'b10111_0000110; 4'b0100:display_out<=12'b10111_1001100; 4'b0101:display_out<=12'b10111_0100100; 4'b0110:display_out<=12'b10111_0100000; 4'b0111:display_out<=12'b10111_0001111; 4'b1000:display_out<=12'b10111_0000000; 4'b1001:display_out<=12'b10111_1111011; default:display_out<=12'b11111_1111111; endcase end end