• verilog实验2:基于FPGA的59秒计时器设计


    一、实验任务

           利用四个数码管显示59秒计时器。

    二、代码实现

           将开发板的48M晶振分频出1M,然后计数器累加,将计数器结果显示在数码管上。低位逢十进一,第二位逢五进一,依次构成59秒计时器。

           部分代码展示:

           

    module cnt59(clk,rst_n,dataout,en);
    
    input clk,rst_n;
    output[7:0] dataout;
    output[3:0] en;//COM使能输出
    
    reg[7:0] dataout;//各段数据输出
    reg[3:0] en;
    
    reg[15:0] cnt_scan;//扫描频率计数器
    reg[3:0] dataout_buf;
    
    wire clk1m;
    wire clk1000;
    wire clk1;
    
    //产生时钟
    defparam Gen_ClkDiv3.divdFACTOR=500,Gen_ClkDiv3.divdWIDTH=8;//分频时钟
    div Gen_ClkDiv3(.reset(rst_n),.clkin(clk1000),.clkout(clk1));//端口名称关联
    
    always@(posedge clk or negedge  rst_n)
    begin
        if(!rst_n) 
            begin //低电平复位
                cnt_scan<=0;
             end
        else 
            begin
                cnt_scan<=cnt_scan+1;
            end
    end
    
    always @(cnt_scan)//段码扫描频率
    begin 
      case(cnt_scan[15:14])
          2'b00 :
              en = 4'b1110;
          2'b01 :
              en = 4'b1101;
          2'b10 :
              en = 4'b1011;
          2'b11 :
              en = 4'b0111;
          default :
              en = 4'b1110;
        endcase
    end
    
    reg [3:0] cnt1;
    reg [3:0] cnt2;
    reg [3:0] cnt3;
    reg [3:0] cnt4;
    
    always@(posedge clk1 or negedge  rst_n)
    begin
      if(!rst_n)
        begin
        cnt1 <= 4'b0000;
        cnt2 <= 4'b0000;
        cnt3 <= 4'b0000;
        cnt4 <= 4'b0000;
        end
        else 
        begin
        cnt1 <= (cnt1<9)? cnt1+1'b1:4'd0;
        cnt2 <= (cnt2<5)? (cnt1==9)?cnt2+1'b1:cnt2 : (cnt1==9)?4'd0:cnt2;
        cnt3 <= (cnt3<9)? (cnt2==5 && cnt1==9)?cnt3+1'b1:cnt3 : (cnt2==5 && cnt1==9)?4'd0:cnt3;
        cnt4 <= (cnt4<5)? (cnt3==9 && cnt2==5 && cnt1==9)?cnt4+1'b1:cnt4 : (cnt3==9 && cnt2==5 && cnt1==9)?4'd0:cnt4;
        end
    end    
    
    always@(en) //对应COM信号给出各段数据,段码
    begin
        case(en)
            4'b1110:
                dataout_buf<=cnt1;//输入将要显示的数字
            4'b1101:
                dataout_buf<=cnt2;
            4'b1011:
                dataout_buf<=cnt3;
            4'b0111:
                dataout_buf<=cnt4;   
            default:
                dataout_buf<=8;
         endcase
    end
    
    always@(dataout_buf)
    begin
        case(dataout_buf)  //将要显示的数字译成段码
            4'b0000://0
                dataout=8'b0000_0011;
            4'b0001://1
                dataout=8'b1001_1111;
            4'b0010://2
                dataout=8'b0010_0101;
            4'b0011://3
                dataout=8'b0000_1101;
            4'b0100://4
                dataout=8'b1001_1001;
            4'b0101://5
                dataout=8'b0100_1001;
            4'b0110://6
                dataout=8'b0100_0001;
            4'b0111://7
                dataout=8'b0001_1111;
            4'b1000://8
                dataout=8'b0000_0001;
            4'b1001://9
                dataout=8'b0000_1001;
           default://这里仅编译了0-9这几个数字
                dataout=8'b1111_1111;//全灭
         endcase
    end
    
    endmodule

    三、感悟

           相比于其他小程序来说,这篇是一个很简单的应用,包括程序也很简单。但是在编写之时,会有一些细节没有把握住,致使烧写结果出问题。希望自己以后思考问题可以更加全面。比如59秒在进位时,是要有两个判断条件,一位为5一位为9才能进位,而由于自己的粗心大意,编程时只想着为5就进位,结果9秒为5的时候一直在进位。这也为我以后思考问题提了个醒。如何更为全面细致认真的思考。就比如说如果要实现一个功能,要同时满足几个条件。这也是程序员思维缜密之所在。加油。

  • 相关阅读:
    爬取校园新闻首页的新闻的详情,使用正则表达式,函数抽离
    爬取校园新闻首页的新闻
    中文词频统计
    综合练习:英文词频统计
    字符串练习
    1.用Hive对爬虫大作业产生的文本文件2.用Hive对爬虫大作业产生的csv文件进行数据分析,写一篇博客描述你的分析过程和分析结果。
    Hadoop综合大作业加上以前漏掉的作业
    爬虫大作业
    获取全部校园新闻
    爬取校园新闻首页的新闻
  • 原文地址:https://www.cnblogs.com/amberwang2018/p/8440085.html
Copyright © 2020-2023  润新知