FPGA数码管动态显示秒表

顶层//

module clock_1
(
    input clk,
    input rst,
    input key_starte,
    input key_stop,
    output [7:0]seg_o, 
    output [5:0]sel_o
);
pro_t   
pro_t_inst
(
    .clk(clk),
    .rst(rst),
    .key_starte(key_starte),
    .key_stop(key_stop),
    .key_starte_1(key_starte_1),
    .key_stop_1(key_stop_1)
);
clv
clv_inst
(
    .clk(clk),
    .rst(rst),
    .out1(out1),
    .out2(out2)
);

wire [3:0]a1;
wire [3:0]a2;
wire [3:0]a3;
wire [3:0]a4;
wire [3:0]a5;
wire [3:0]a6;

snain_st
snain_st_inst
(
    .clk(clk),
    .rst(rst),
    .key_starte(key_starte_1),
    .key_stop(key_stop_1),
    .key1(out1),
    .a1(a1),
    .a2(a2),
    .a3(a3),
    .a4(a4),
    .a5(a5),
    .a6(a6)
);
wire [7:0]seg1;
wire [7:0]seg2;
wire [7:0]seg3;
wire [7:0]seg4;
wire [7:0]seg5;
wire [7:0]seg6;
//1
clecate_1
clecate_1_1
(
    .clk(clk),
    .rst(rst),
    .in(a1),
    .seg(seg1) 
    
);

//2
clecate_1
clecate_1_2
(
    .clk(clk),
    .rst(rst),
    .in(a2),
    .seg(seg2) 
    
);
//3
clecate_1
clecate_1_3
(
    .clk(clk),
    .rst(rst),
    .in(a3),
    .seg(seg3) 
    
);
//4
clecate_1
clecate_1_4
(
    .clk(clk),
    .rst(rst),
    .in(a4),
    .seg(seg4) 
    
);
//5
clecate_1
clecate_1_5
(
    .clk(clk),
    .rst(rst),
    .in(a5),
    .seg(seg5) 
    
);
//6
clecate_1
clecate_1_6
(
    .clk(clk),
    .rst(rst),
    .in(a6),
    .seg(seg6) 
    
);
//--------------------------------------
sm
sm_inst
(
.clk(clk),
.rst(rst),
.clock(out2),
.seg_1(seg1),
.seg_2(seg2),
.seg_3(seg3),
.seg_4(seg4),
.seg_5(seg5),
.seg_6(seg6),
.seg_8(seg_o),
.sel(sel_o)    
);
endmodule

//分频

module clv
(
    input clk,
    input rst,
    output out1,
    output out2
);
parameter PI=13'd5_000-1;   
reg [12:0]cont;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        cont<=1'b0;
    else if(cont==PI)
        cont<=1'b0;
    else
        cont<=cont+1'b1;
end

reg clk1;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        clk1<=1'b0;
    else if(cont==PI)
        clk1<=1'b1;
    else 
        clk1<=1'b0;
end
assign out1=clk1;
//------------------------------------------
reg [17:0]cont1;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        cont1<=1'b0;
    else if(cont1==30*(PI+1)-1)
        cont1<=1'b0;
    else
        cont1<=cont1+1'b1;
end

reg clk2;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        clk2<=1'b0;
    else if(cont1==30*(PI+1)-1)
        clk2<=1'b1;
    else 
        clk2<=1'b0;
end
assign out2=clk2;

endmodule

//按键

module pro_t
(
    input clk,
    input rst,
    input key_starte,
    input key_stop,
    output key_starte_1,
    output key_stop_1
);

reg pro;
wire key_starte_out;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        pro<=1'b0;
    else
        pro<=key_starte;
end

reg pro_1;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        pro_1<=1'b0;
    else
        pro_1<=pro;
end

reg pro_2;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        pro_2<=1'b0;
    else
        pro_2<=pro_1;
end

reg pro_7;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        pro_7<=1'b0;
    else
        pro_7<=pro_2&(~pro_1);
end
assign key_starte_out=pro_7;

 

reg pro_3;
wire key_stop_out;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        pro_3<=1'b0;
    else
        pro_3<=key_stop;
end

reg pro_4;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        pro_4<=1'b0;
    else
        pro_4<=pro_3;
end

reg pro_5;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        pro_5<=1'b0;
    else
        pro_5<=pro_4;
end


reg pro_6;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        pro_6<=1'b0;
    else
        pro_6<=pro_5&(~pro_4);
end

assign key_stop_out=pro_6;


assign key_starte_1=key_starte_out;
assign key_stop_1=key_stop_out;

endmodule

//状态机

module snain_st

    input clk,
    input rst,
    input key_starte,
    input key_stop,
    input key1,
    output [3:0]a1,
    output [3:0]a2,
    output [3:0]a3,
    output [3:0]a4,
    output [3:0]a5,
    output [3:0]a6
    
);

parameter IDLE=3'b000;
parameter WORK=3'b001;
parameter STOP=3'b010;
reg [2:0]st;
reg [2:0]st_next;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        st<=IDLE;
    else
        st<=st_next;
end
always@(*)
begin
    if(~rst)
        st_next=IDLE;
    else
        case(st)
        IDLE:if(key_starte==1)
                st_next=WORK;
            else
                st_next=IDLE;        
        WORK:if(key_stop==1)
                st_next=STOP;
            else
                st_next=WORK;
        STOP:if(key_starte==1)
                st_next=WORK;
            else
                st_next=STOP;
        default:st_next=IDLE;
        endcase
end
//-----------------------------------------------

//1
reg [3:0]cont;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        cont<=1'b0;
    else if(st_next==WORK)
    begin
        if(key1==1)
        begin
            if(cont==4'd9)
                cont<=0;
            else if(key1==1)
                cont<=cont+1'b1;    
        end
        
    end
    else 
            cont<=cont;
end
//2
reg vs;
always@(posedge clk or negedge rst)
begin
if(~rst)
    vs<=0;
else if(cont==4'd9)
    vs<=1'b1;
else 
    vs<=1'b0;
end

reg [3:0]cont1;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        cont1<=4'b0;
    else if(st_next==WORK)
    begin 
    if(vs==1&&key1==1)
        begin
            if(cont1==4'd9&&cont==4'd9)
                cont1<=0;
            else if(vs==1&&cont==4'd9) 
                cont1<=cont1+1;    
        end
    else
        cont1<=cont1;
    
    end
end

 

//3
reg vs1;
always@(posedge clk or negedge rst)
begin
if(~rst)
    vs1<=1'b0;
else if(cont1==4'd9)
    vs1<=1'b1;
else 
    vs1<=1'b0;
end

reg [3:0]cont2;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        cont2<=1'b0;
    else if(st_next==WORK)
    begin
    if(vs==1&&vs1==1&&key1==1)
        begin
        if(cont2==4'd9&&cont1==4'd9&&cont==4'd9)
            cont2<=0;
        else if(cont1==4'd9&&cont==4'd9&&vs==1)
                cont2<=cont2+1'b1; 
        end
    end
    else 
        cont2<=cont2;
end

//4
reg vs2;
always@(posedge clk or negedge rst)
begin
if(~rst)
    vs2<=0;
else if(cont2==4'd9)
    vs2<=1'b1;
else 
    vs2<=1'b0;
end

reg [3:0]cont3;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        cont3<=4'd0;
    else if(st_next==WORK)
    begin
    if(vs2==1&&vs==1&&vs1==1&&key1==1)
        begin
        if(cont3==4'd9&&cont2==4'd9&&cont1==4'd9&&cont==4'd9)
            cont3<=0;
        else if(cont2==4'd9&&cont1==4'd9&&cont==9) 
            cont3<=cont3+1'b1; 
        end
    end
    else 
        cont3<=cont3;
end
//5
reg vs3;
always@(posedge clk or negedge rst)
begin
if(~rst)
    vs3<=0;
else if(cont3==4'd9)
    vs3<=1'b1;
else 
    vs3<=1'b0;
end
reg [3:0]cont4;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        cont4<=1'b0;
    else if(st_next==WORK)
    begin
    if(vs3==1&&vs2==1&&vs1==1&&vs==1&&key1==1)
    begin
        if(cont4==4'd9&&cont3==4'd9&&cont2==4'd9&&cont1==4'd9&&cont==4'd9)
            cont4<=1'b0;
        else if(cont3==4'd9&&cont2==4'd9&&cont1==4'd9&&cont==4'd9)            
                cont4<=cont4+1'b1; 
    end
    end
    else 
        cont4<=cont4;
end
//6
reg vs4;
always@(posedge clk or negedge rst)
begin
if(~rst)
    vs4<=0;
else if(cont4==4'd9)
    vs4<=1'b1;
else 
    vs4<=1'b0;
end
reg [3:0]cont5;
always@(posedge clk)
begin
    if(~rst)
        cont5<=1'b0;
    else if(st_next==WORK)
    begin
    if(vs4==1&&vs3==1&&vs2==1&&vs1==1&&vs==1&&key1==1)
        begin
        if(cont5==4'd5&&cont4==4'd9&&cont4==4'd9&&cont3==4'd9&&cont2==4'd9&&cont1==4'd9&&cont==4'd9)
        cont5<=1'b0;
         else if(cont4==4'd9&&cont4==4'd9&&cont3==4'd9&&cont2==4'd9&&cont1==4'd9&&cont==4'd9)
                
                cont5<=cont5+1'b1; 
        end
    end
    else 
        cont5<=cont5;
end
  assign a1=cont;
  assign a2=cont1;
  assign a3=cont2;
  assign a4=cont3;
  assign a5=cont4;
  assign a6=cont5;

endmodule

 

//译码

module clecate_1
(
    input clk,
    input rst,
    input [3:0]in,
    output [7:0]seg 
);
parameter   
        S0=8'b1100_0000,
        S1=8'b1111_1001,
        S2=8'b1010_0100,
        S3=8'b1011_0000,
        S4=8'b1001_1001,
        S5=8'b1001_0010,
        S6=8'b1000_0010,
        S7=8'b1111_1000,
        S8=8'b1000_0000,
        S9=8'b1001_0000;
        

reg [7:0]seg_1;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        seg_1<=S0;
    else 
    case(in)   
        4'b0000:seg_1<=S0;
        4'b0001:seg_1<=S1;
        4'b0010:seg_1<=S2;
        4'b0011:seg_1<=S3;
        4'b0100:seg_1<=S4;
        4'b0101:seg_1<=S5;
        4'b0110:seg_1<=S6;
        4'b0111:seg_1<=S7;
        4'b1000:seg_1<=S8;
        4'b1001:seg_1<=S9;
        default:seg_1<=S0;
    endcase
end
assign seg=seg_1;
endmodule

 

//扫描

module sm
(
    input clk,
    input rst,
    input clock,//3毫秒1脉冲
    input [7:0]seg_1, 
    input [7:0]seg_2,
    input [7:0]seg_3, 
    input [7:0]seg_4,
    input [7:0]seg_5, 
    input [7:0]seg_6,
    output [7:0]seg_8,
    output [5:0]sel
);
parameter IDEL=5'b00000;
parameter S1=5'b00001;
parameter S2=5'b00010;
parameter S3=5'b00100;
parameter S4=5'b01000;
parameter S5=5'b10000;
parameter S6=5'b10001;

reg [7:0]seg_7;
reg [5:0]sel_1;
reg [2:0]cont;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        cont<=0;
    else 
    begin
    if(cont==3'd5&&clock==1'b1)
        cont<=0;
    else if(clock==1'b1)
        cont<=cont+1'b1;
    end
end

reg [4:0]current_state;
reg [4:0]next_state;
always@(posedge clk or negedge rst)
begin
if(~rst)
current_state<=IDEL;
else
current_state<=next_state;
end

always@(*)
begin
next_state=IDEL;
case(current_state)
IDEL:if(cont==0)
    next_state=S1;
S1:if(cont==3'd1)
        next_state=S2;
    else
        next_state=S1;
S2:if(cont==3'd2)
        next_state=S3;
    else
        next_state=S2;
S3:if(cont==3'd3)
        next_state=S4;
    else
        next_state=S3;
S4:if(cont==3'd4)
        next_state=S5;
    else
        next_state=S4;
S5:if(cont==3'd5)
        next_state=S6;
    else
        next_state=S5;
S6:if(cont==3'd0)
        next_state=S1;
    else
        next_state=S6;        
default:next_state=IDEL;
endcase
end

always@(posedge clk or negedge rst)
begin 
if(~rst)
begin
    seg_7<=8'b11_111_111;
    sel_1<=6'b111_111;
end
else
case(next_state)
IDEL:
begin
    seg_7<=8'b11_111_111;
    sel_1<=6'b111_111;
end
S1:
begin
    seg_7<=seg_1;
    sel_1<=6'b111_110;
end
S2:
begin
    seg_7<=seg_2;
    sel_1<=6'b111_101;
end
S3:
begin     
    seg_7<=seg_3;
    sel_1<=6'b111_011;
end
S4:
begin
    seg_7<=seg_4;
    sel_1<=6'b110_111;
end
S5:
begin
    seg_7<=seg_5;
    sel_1<=6'b101_111;
end
S6:
begin
    seg_7<=seg_6;
    sel_1<=6'b011_111;
end
default:
begin
seg_7<=11_111_111;
sel_1<=6'b111_111;
end
endcase
end
assign seg_8=seg_7;
assign sel=sel_1;
endmodule
//测试:

`timescale 1ns/1ns
module clock_1_tb;
reg clk;
reg rst;
reg key_starte;
reg key_stop;
wire [6:0]seg_1;
wire [5:0]sel_1;

initial
begin
    clk=0;
    rst=0;
    #50 rst=1;  
#2000000 $stop;
end
initial
begin
    key_stop=1;
    key_starte=1;
    #1000 key_starte=0;
    #100_000_00 key_stop=0;
end

always #10 clk<=~clk;
clock_1 
clock_1_inst
(
    .clk(clk),
    .rst(rst),
    .key_starte(key_starte),
    .key_stop(key_stop),
    .seg_o(seg_1),
    .sel_o(sel_1)
    
);

endmodule
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yang_wei_bk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值