[SugerTangYL] 简易电子时钟Verilog设计
目錄
前言
一、簡易電子時鐘的功能要求
二、設(shè)計思路&整體框架
三、完整代碼
四、仿真
總結(jié)
前言
來分享第一個案例了!簡易電子時鐘的Verilog設(shè)計,電子時鐘應(yīng)該算是走嵌入式和FPGA開發(fā)的敲門磚了叭(也可能是流水燈)。本次設(shè)計實現(xiàn)的平臺是Altera的DE2開發(fā)板。
一、簡易電子時鐘的功能要求
? ? ? ? 一個簡易的電子時鐘應(yīng)該包含以下功能:
- 正常顯示時分秒
 - 可調(diào)節(jié)時間
 
? ? ? ? 在此基礎(chǔ)上也還可以繼續(xù)擴展功能,本次由于剛?cè)腴T,便只實現(xiàn)了基本功能。?
二、設(shè)計思路&整體框架
? ? ? ? 要正常計時,我們需要一個1Hz的信號。在Verilog中采用分頻器對基準時鐘進行分頻,使用這個1Hz信號進行計數(shù),便可以產(chǎn)生時分秒。再將時分秒用數(shù)碼管顯示出來,第一個功能成功實現(xiàn);在第一個基礎(chǔ)上,設(shè)置一個撥碼開關(guān),用以區(qū)分正常模式和調(diào)時模式。當電子時鐘處于調(diào)時模式時,最低位數(shù)碼管閃爍,按下增1按鍵時數(shù)字加1;按下移位按鍵時閃爍位向高位移動。當模式調(diào)回正常模式時,從修改后的時間開始計時。
? ? ? ? 綜上,需要一個分頻器、一個時間管理模塊、需要六個數(shù)碼管顯示譯碼器。整體框圖如下:
? ? ? ? ?對于分頻器這一ip,之后會出文詳述,此處使用的是占空比50%的偶分頻。數(shù)碼管顯示譯碼模塊屬于較為簡單的模塊,讀者在看其Verilog代碼時很容易便理解。
三、完整代碼
?????????開門見山!先上整個完整能編譯的Verilog代碼!
module simple_electronic_clock(clk,key_add,key_displace,switch_mode,hour_decode,min_decode,sec_decode); input clk;//基準時鐘50MHz input key_add;//增一按鍵 input key_displace;//移位按鍵 input switch_mode;//模式開關(guān) output [13:0] hour_decode;//小時譯碼 output [13:0] min_decode;//分鐘譯碼 output [13:0] sec_decode;//秒譯碼wire clk_1Hz,clk_2Hz;//分頻后的1Hz、2Hz信號 wire [1:0] mode_cnt;//調(diào)時的閃爍位 wire [7:0] hour,min,sec;//時,分,秒divider(clk_2Hz,clk_1Hz,clk);//分頻器 time_management(clk_1Hz,switch_mode,key_add,key_displace,hour,min,sec,mode_cnt);//時間管理模塊 digital_tube_decode(clk_2Hz,mode_cnt,hour,min,sec,hour_decode,min_decode,sec_decode);//數(shù)碼管顯示譯碼模塊 endmodulemodule divider(clk_2Hz,clk_1Hz,clk);//分頻器 output reg clk_1Hz,clk_2Hz; input clk; reg [24:0] count,count2;//內(nèi)部計數(shù)單元//count計滿24999999時信號反向,產(chǎn)生1Hz信號 always@(posedge clk) begin if(count==25'd24999999)begincount<=25'b0;clk_1Hz<=~clk_1Hz;endelsecount<=count+1'b1; end//count2計滿12499999時信號反向,產(chǎn)生2Hz信號 always@(posedge clk) begin if(count==25'd12499999)begincount2<=25'b0;clk_2Hz<=~clk_2Hz;endelsecount2<=count2+1'b1; end endmodule module time_management(clk_1Hz,switch_mode,key_add,key_displace,hour,min,sec,mode_cnt);//時間管理模塊 input clk_1Hz,switch_mode,key_add,key_displace; output reg [7:0] hour,min,sec; output reg [1:0] mode_cnt;//調(diào)時的閃爍位標志//時間計時&調(diào)時 always @(posedge clk_1Hz) begincase (switch_mode)1'b0:sec[3:0] <= sec[3:0] + 1'b1;//正常模式計時1'b1:begin //調(diào)時模式if(key_add) begincase (mode_cnt)2'b00:sec[3:0] <= sec[3:0] + 1'b1;//秒時間加一2'b01:min[3:0] <= min[3:0] + 1'b1;//分時間加一2'b10:hour[3:0] <= hour[3:0] + 1'b1;//時時間加一default:;endcaseendenddefault:;endcase//以下為進位條件判斷if(sec[3:0] == 4'd10) begin sec[3:0] <= 4'b0;sec[7:4] <= sec[7:4] + 1'b1;endif(sec[7:4] == 4'd6) beginsec[7:4] <= 4'b0;min[3:0] <= min[3:0] + 1'b1;endif(min[3:0] == 4'd10) beginmin[3:0] <= 4'b0;min[7:4] <= min[7:4] + 1'b1;endif(min[7:4] == 4'd6) beginmin[7:4] <= 4'b0;hour[3:0] <= hour[3:0] + 1'b1;endif(hour[3:0] == 4'd10) beginhour[3:0] <= 4'b0;hour[7:4] <= hour[7:4] + 1'b1;endif(hour[3:0] == 4'd4 && hour[7:4] == 4'd2) beginhour[3:0] <= 4'b0;hour[7:4] <= 4'b0;end end//移位按鍵觸發(fā)移位 always @(posedge key_displace) beginif(switch_mode) beginif(mode_cnt == 2'b10) mode_cnt <= 2'b0;else mode_cnt <= mode_cnt + 1'b1;end endendmodulemodule digital_tube_decode(clk_2Hz,mode_cnt,hour,min,sec,hour_decode,min_decode,sec_decode); input clk_2Hz; input [1:0] mode_cnt; input [7:0] hour,min,sec; output reg [13:0] hour_decode,min_decode,sec_decode;reg flag;//閃爍產(chǎn)生 always @(posedge clk_2Hz) beginflag <= ~flag; end//顯示譯碼 always @(posedge clk_2Hz) begincase (mode_cnt) //根據(jù)閃爍位標志,使得閃爍位數(shù)字閃爍2'b00:beginhour_decode[6:0] <= decode(hour[3:0]);hour_decode[13:7] <= decode(hour[7:4]);min_decode[6:0] <= decode(min[3:0]);min_decode[13:7] <= decode(min[3:0]);if(flag) beginsec_decode[6:0] <= decode(sec[3:0]);sec_decode[13:7] <= decode(sec[3:0]);endelse begin //7'b1111111為數(shù)碼管全滅,下面同理sec_decode[6:0] <= 7'b1111111;sec_decode[13:7] <= 7'b1111111;endend2'b01:beginhour_decode[6:0] <= decode(hour[3:0]);hour_decode[13:7] <= decode(hour[7:4]);sec_decode[6:0] <= decode(sec[3:0]);sec_decode[13:7] <= decode(sec[7:4]);if(flag) beginmin_decode[6:0] <= decode(min[3:0]);min_decode[13:7] <= decode(min[7:4]);endelse beginmin_decode[6:0] <= 7'b1111111;min_decode[13:7] <= 7'b1111111;endend2'b10:beginsec_decode[6:0] <= decode(sec[3:0]);sec_decode[13:7] <= decode(sec[7:4]);min_decode[6:0] <= decode(min[3:0]);min_decode[13:7] <= decode(min[7:4]);if(flag) beginhour_decode[6:0] <= decode(hour[3:0]);hour_decode[13:7] <= decode(hour[7:4]);endelse beginhour_decode[6:0] <= 7'b1111111;hour_decode[13:7] <= 7'b1111111;endenddefault:;endcase end//譯碼函數(shù),便于重復(fù)調(diào)用 function [6:0] decode; input [3:0] num;begincase (num)4'd0:decode=7'b1000000;4'd1:decode=7'b1111001;4'd2:decode=7'b0100100;4'd3:decode=7'b0110000;4'd4:decode=7'b0011001;4'd5:decode=7'b0010010;4'd6:decode=7'b0000010;4'd7:decode=7'b1111000;4'd8:decode=7'b0000000;4'd9:decode=7'b0010000;default: decode=7'b1111111;endcase end endfunctionendmodule四、仿真
仿真就等我之后有空再弄叭(dog)。
總結(jié)
這篇文是我第一個Verilog案例,主要講解設(shè)計思路,當然還有更好的電子時鐘例碼,我這個算是無腦編寫QaQ
總結(jié)
以上是生活随笔為你收集整理的[SugerTangYL] 简易电子时钟Verilog设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 用汇编程序实现电子时钟
 - 下一篇: 【QT】Qt Compiler Dete