FPGA project : clock

本文详细描述了一个模块化设计,对data_gen模块进行了修改,用于生成实时的数字时钟,包括秒、分钟和小时的计数,以及相应的输出信号如数据、点数、符号和段启用。

在seg_595 基础上,更改data_gen模块,的数字时钟。

module data_gen
#(
    parameter MAX_1S    = 26'd49_999_999 ,
              NINE      = 4'd9           ,
              FIVE      = 4'd5           
)(
    input           wire                sys_clk     ,
    input           wire                sys_rst_n   ,

    output          reg     [19:00]     data        ,
    output          wire    [05:00]     point       ,
    output          wire                sign        ,
    output          reg                 seg_en
);

    // reg signal define 
    reg     [25:00]     cnt_1s     ;
    reg                 add_flag   ;
    reg     [03:00]     sec_g      ;
    reg     [03:00]     sec_s      ;
    reg     [03:00]     min_g      ;
    reg     [03:00]     min_s      ;
    reg     [03:00]     hou_g      ;
    reg     [03:00]     hou_s      ;
    reg     [19:00]     data_time  ;

    // [25:00]     cnt_1s     ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            cnt_1s <= 26'd0 ;
        end else begin
            if(cnt_1s == MAX_1S) begin
                cnt_1s <= 26'd0 ;
            end else begin
                cnt_1s <= cnt_1s + 1'b1 ;
            end
        end
    end
    //             add_flag    ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            add_flag <= 1'b0 ;
        end else begin
            if(cnt_1s == ( MAX_1S - 1'b1) ) begin
                add_flag <= 1'b1;
            end else begin
                add_flag <= 1'b0 ;
            end
        end
    end
    // [03:00]     sec_g      ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            sec_g <= 4'd0 ;
        end else begin
            if(add_flag) begin
                if(sec_g == NINE) begin
                    sec_g <= 4'd0 ;
                end else begin
                    sec_g <= sec_g + 1'b1 ;
                end
            end else begin
                sec_g <= sec_g ;
            end
        end
    end
    // [03:00]     sec_s      ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            sec_s <= 4'd0 ;
        end else begin
            if(add_flag && ( sec_g == NINE) ) begin
                if(sec_s == FIVE) begin
                    sec_s <= 4'd0 ;
                end else begin
                    sec_s <= sec_s + 1'b1 ;
                end
            end else begin
                sec_s <= sec_s ;
            end
        end
    end
    // [03:00]     min_g      ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            min_g <= 4'b0 ;
        end else begin
            if(add_flag && (sec_g == NINE) && (sec_s == FIVE)) begin
                if(min_g == NINE) begin
                    min_g <= 4'd0 ;
                end else begin
                    min_g <= min_g + 1'b1 ;
                end
            end else begin
                min_g <= min_g ;
            end
        end
    end
    // [03:00]     min_s      ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            min_s <= 4'd0 ;
        end else begin
            if(add_flag && (sec_g == NINE) && (sec_s == FIVE) && (min_g == NINE)) begin
                if(min_s == FIVE) begin
                    min_s <= 4'd0 ;
                end else begin
                    min_s <= min_s + 1'b1 ;
                end
            end else begin
                min_s <= min_s ;
            end
        end
    end
    // [03:00]     hou_g      ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            hou_g <= 4'd0 ;
        end else begin
            if(add_flag && (sec_g == NINE) && (sec_s == FIVE) && (min_g == NINE) && (min_s == FIVE)) begin
                if( ((hou_s == 4'd2) && (hou_g == 4'd3)) || (hou_s != 4'd2) && (hou_g == NINE) ) begin
                    hou_g <= 4'd0 ;
                end else begin
                    hou_g <= hou_g + 1'b1 ;
                end
            end else begin
                hou_g <= hou_g ;
            end
        end
    end
    // [03:00]     hou_s      ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            hou_s <= 4'd0 ;
        end else begin
            if(hou_s == 4'd2) begin
                if(add_flag && (sec_g == NINE) && (sec_s == FIVE) && (min_g == NINE) && (min_s == FIVE) && (hou_g == 4'd3)) begin
                    hou_s <= 4'd0 ;
                end else begin
                    hou_s <= hou_s ;
                end
            end else begin
                if(add_flag && (sec_g == NINE) && (sec_s == FIVE) && (min_g == NINE) && (min_s == FIVE) && (hou_g == NINE)) begin
                    hou_s <= hou_s +1'b1 ;
                end else begin
                    hou_s <= hou_s ;
                end
            end
            
        end
    end
    // [19:00]     data_time  ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            data_time <= 20'd0 ;
        end else begin
            data_time <= sec_g + sec_s * 10 + min_g * 100 + min_s * 1000 + hou_g * 1000_0 + hou_s * 1000_00 ;
        end
    end
    // output 
    // data
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            data <= 20'd0 ;
        end else begin
            data <= data_time ;
        end
    end
    // point
    assign point = 6'b001010 ;
    // sign
    assign sign  = 1'b0 ;
    // seg_en
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            seg_en <= 1'b0 ;
        end else begin
            seg_en <= 1'b1 ;
        end
    end


endmodule

`timescale 1ns/1ns
module test_data_gen();
    reg                 sys_clk     ;
    reg                 sys_rst_n   ;

    wire    [19:00]     data        ;
    wire    [05:00]     point       ;
    wire                sign        ;
    wire                seg_en      ;


data_gen
#(
    .MAX_1S                 ( 23'd5         ),
    .NINE                   ( 4'd9          ),
    .FIVE                   ( 4'd5          )         
)
data_gen_insert
(
    .sys_clk                ( sys_clk     ) ,
    .sys_rst_n              ( sys_rst_n   ) ,

    .data                   ( data        ) ,
    .point                  ( point       ) ,
    .sign                   ( sign        ) ,
    .seg_en                 ( seg_en      )
);
  
    parameter CYCLE = 20 ;

    initial begin
        sys_clk    = 1'b1 ;
        sys_rst_n <= 1'b0 ;
        #( CYCLE * 10 )   ;
        sys_rst_n <= 1'b1 ;
        #( 210 )          ;
        sys_rst_n <= 1'b0 ;
        #( 10 )           ;
        #( CYCLE * 10 )   ;
        sys_rst_n <= 1'b1 ;
        #( CYCLE * 1000 ) ;
        $stop ;
    end

    always #( CYCLE / 2 ) sys_clk = ~sys_clk ;

endmodule

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值