用verilog HDL语法编写

1.请设计一个50进制的加法计数器(从00计到49),每1 秒加一次,用两个数码管显示计数结果,进行程序设计、软件编译、仿真分析、硬件测试。
2.请设计一个24进制的减法计数器(从24计到00),每2 秒减一次,用两个数码管显示计数结果,给出程序设计、软件编译、仿真分析、硬件测试及详细实验过程

两部分代码有不少共用模块
1Hz 分频
0-23 计数
0-49 计数
7段LED数码管译码
top_led_50
led_cnt50_sim 测试激励代码
top_led_24
led_cnt24_sim 测试激励代码

module clk_fp #
(
    parameter CLK_IN_FREQ    = 50*1000*1000    //50MHz
)
(
    input    clk,
    output    clk1s,            //1Hz
    output    clk2s            //0.5Hz
);

reg        clk1 = 0;
reg        clk2 = 0;
reg    [31:0]    cnt=0;
assign        clk1s = clk1;
assign        clk2s = clk2;

always @(posedge clk)
begin
    if(cnt < CLK_IN_FREQ-1)
        cnt    <= cnt + 1;
    else
        cnt    <= 0;
end

always @(posedge clk)
begin
    if(cnt == CLK_IN_FREQ/2-1||cnt == CLK_IN_FREQ-1)
        clk1    <= !clk1;
    else
        clk1    <= 0;
end

always @(posedge clk)
begin
    if(cnt == CLK_IN_FREQ-1)
        clk2    <= !clk2;
    else
        clk2    <= 0;
end

endmodule


module cnt_24    //0-23 同步计数器,异步清零
(
    input    clk,
    input    rst_n,
    output    [7:0]    dat
);

reg    [7:0]    cnt = 0;
assign        dat = cnt;

always @(posedge clk or negedge rst_n)    //rst_n 异步复位
begin
    if( rst_n == 0 )
        cnt <= 0;
    else if(cnt < 23)
        cnt    <= cnt + 1;
    else
        cnt <= 0;
end
endmodule

module cnt_50    //0-49 同步计数器,异步清零
(
    input    clk,
    input    rst_n,
    output    [7:0]    dat
);

reg    [7:0]    cnt = 0;
assign        dat = cnt;

always @(posedge clk or negedge rst_n)    //rst_n 异步复位
begin
    if( rst_n == 0 )
        cnt <= 0;
    else if(cnt < 49)
        cnt    <= cnt + 1;
    else
        cnt <= 0;
end
endmodule


module led_7s    //led 7 段数码管译码 0-F
(
    input        [3:0]    dat,
    output reg    [6:0]    led7s    //{a,b,c,d,e,f,g} //7段LED 排列 a->led7s[6] g->led7s[0] 
);
    always@(*)
    begin
        case(dat)
            4'b0000:led7s=7'b0111111;    //0
            4'b0001:led7s=7'b0000110;    //1
            4'b0010:led7s=7'b1011011;    //2
            4'b0011:led7s=7'b1001111;    //3
            4'b0100:led7s=7'b1100110;    //4
            4'b0101:led7s=7'b1101101;    //5
            4'b0110:led7s=7'b1111101;    //6
            4'b0111:led7s=7'b0000111;    //7
            4'b1000:led7s=7'b1111111;    //8
            4'b1001:led7s=7'b1101111;    //9
            4'b1010:led7s=7'b1110111;    //A
            4'b1011:led7s=7'b1111100;    //B
            4'b1100:led7s=7'b0111001;    //C
            4'b1101:led7s=7'b1011110;    //D
            4'b1110:led7s=7'b1111001;    //E
            4'b1111:led7s=7'b1110001;    //F
        endcase
    end
endmodule

module top_led_50
(
    input            clk,
    input            rst_n,
    output    [6:0]    led7s_a,    //个位
    output    [6:0]    led7s_b        //十位
);
wire    clk1s;
wire    clk2s;
wire    [7:0]    cnts;
wire    [3:0]    gw_dat;
wire    [3:0]    sw_dat;

clk_fp u1
(
    .clk    (clk),        //输入 50MHz
    .clk1s    (clk1s),    //输出 1Hz
    .clk2s    (clk2s)        //维护处 0.5Hz
);

cnt_50    u2    //0-49 同步计数器,异步清零
(
    .clk    (clk1s),
    .rst_n    (rst_n),
    .dat    (cnts)
);

assign    gw_dat = cnts%10;
assign    sw_dat = cnts/10;

led_7s    ua    //个位
(
    .dat    (gw_dat),
    .led7s    (led7s_a)
);

led_7s    ub    //十位位
(
    .dat    (sw_dat),
    .led7s    (led7s_b)
);

endmodule

module led_cnt50_sim();
reg             clk;
reg             rst_n;
 
initial begin
    clk        = 0;
    rst_n    = 0;
    #100 rst_n    = 1;

end
 
always #20 clk = ~clk;    //50MHz

wire    [6:0]    led7s_a;    //个位
wire    [6:0]    led7s_b;        //十位

top_led_50 u1
(
    .clk        (clk),
    .rst_n        (rst_n),
    .led7s_a    (led7s_a),
    .led7s_b    (led7s_b)
);
endmodule


module top_led_24
(
    input            clk,
    input            rst_n,
    output    [6:0]    led7s_a,    //个位
    output    [6:0]    led7s_b        //十位
);
wire    clk1s;
wire    clk2s;
wire    [7:0]    cnts;
wire    [3:0]    gw_dat;
wire    [3:0]    sw_dat;

clk_fp u1
(
    .clk    (clk),        //输入 50MHz
    .clk1s    (clk1s),    //输出 1Hz
    .clk2s    (clk2s)        //维护处 0.5Hz
);

cnt_24    u2    //0-49 同步计数器,异步清零
(
    .clk    (clk2s),
    .rst_n    (rst_n),
    .dat    (cnts)
);

assign    gw_dat = cnts%10;
assign    sw_dat = cnts/10;

led_7s    ua    //个位
(
    .dat    (gw_dat),
    .led7s    (led7s_a)
);

led_7s    ub    //十位位
(
    .dat    (sw_dat),
    .led7s    (led7s_b)
);

endmodule


`timescale 1ns / 1ns
module led_cnt24_sim();
reg             clk;
reg             rst_n;
 
initial begin
    clk        = 0;
    rst_n    = 0;
    #100 rst_n    = 1;

end
 
always #20 clk = ~clk;    //50MHz

wire    [6:0]    led7s_a;    //个位
wire    [6:0]    led7s_b;        //十位

top_led_24 u1
(
    .clk        (clk),
    .rst_n        (rst_n),
    .led7s_a    (led7s_a),
    .led7s_b    (led7s_b)
);
endmodule


50进制计数器.doc

B站 百度搜索 Quartus实现加减法计数器设计,一堆资料