特级茶叶 2022-10-27 13:39 采纳率: 78.6%
浏览 75
已结题

用verilog HDL语法编写

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

  • 写回答

3条回答 默认 最新

  • 老皮芽子 2022-10-27 18:14
    关注

    两部分代码有不少共用模块
    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
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月4日
  • 已采纳回答 10月27日
  • 创建了问题 10月27日

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条