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