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的时候一直在进位。这也为我以后思考问题提了个醒。如何更为全面细致认真的思考。就比如说如果要实现一个功能,要同时满足几个条件。这也是程序员思维缜密之所在。加油。

原文地址:https://www.cnblogs.com/amberwang2018/p/8440085.html