前言
Verilog、Xilinx ISE 13.4、BASYS2、EDA、數(shù)字鐘
一、設(shè)計(jì)內(nèi)容
利用實(shí)驗(yàn)板設(shè)計(jì)實(shí)現(xiàn)一個能顯示時(shí)分秒的多功能電子鐘。
1.具有“秒”、“分”、“時(shí)”計(jì)時(shí)的功能,小時(shí)計(jì)數(shù)器按24小時(shí)制;
2.具有校時(shí)功能,能對“分”和“時(shí)”進(jìn)行調(diào)整;
3.具有手動輸入設(shè)置定時(shí)鬧鐘的功能,亮1分鐘;
4.可實(shí)現(xiàn)時(shí)鐘復(fù)位功能:00:00:00;
5.報(bào)整點(diǎn):幾點(diǎn)亮幾下。
二、模塊結(jié)構(gòu)
三、代碼編寫
1.頂層模塊_module top
頂層模塊包含:
分頻模塊:獲得1HZ脈沖,供計(jì)時(shí)模塊使用;
校時(shí)模塊:對時(shí)分、分秒、鬧鐘置數(shù);
計(jì)時(shí)模塊:含時(shí)、分、秒三個子模塊,用于計(jì)時(shí);
鬧鐘模塊:用于整點(diǎn)報(bào)時(shí)和定時(shí)鬧鐘;
取數(shù)模塊:決定當(dāng)前顯示的內(nèi)容(4位),并送到掃描模塊;
掃描模塊:將取到的數(shù)分成4份(1位),分時(shí)送到譯碼模塊;
譯碼模塊:將數(shù)字轉(zhuǎn)化為數(shù)碼管引腳電平,并判斷是否顯示小數(shù)點(diǎn)。
//頂層模塊
module top(
input cp,//20ns脈沖
input reset,//復(fù)位按鍵BTN0
input set,//置數(shù)按鍵BTN1
input apply,//移位按鍵BTN2
input inc,//增加按鍵BTN3
input set_enable,//校時(shí)撥碼SW7
input alarm_enable,//鬧鐘撥碼SW6
input hour_show,//時(shí)分顯示撥碼SW5
input sec_show,//分秒顯示撥碼SW4
input count_enable,//計(jì)時(shí)撥碼SW3
output [3:0] loc,//數(shù)碼管位置
output [7:0] pin,//數(shù)碼管引腳電平
output hour_alarm,//整點(diǎn)報(bào)時(shí)LD2
output alarm,//鬧鐘LD1
output sec//秒針LD0
);
wire [23:0] counter_num;//當(dāng)前時(shí)間
wire [15:0] set_num;//校時(shí)時(shí)間
wire [15:0] alarm_num;//鬧鐘時(shí)間
wire [15:0] show_num;//顯示內(nèi)容
wire [3:0] scan_num;//譯碼內(nèi)容
wire [3:0] set_loc;//置數(shù)位置
//分頻模塊
Clock P13(
.cp(cp),
.clock(clock)
);
//校時(shí)模塊
Seter P14(
.enable(set_enable),
.inc(inc),
.apply(apply),
.set_num(set_num),
.set_loc(set_loc)
);
//計(jì)時(shí)模塊
Counter P1(
.cp(clock),
.enable(count_enable),
.reset(reset),
.set(set && !alarm_enable && !set_enable),
.set_num(set_num),
.sec_show(sec_show),
.hour_show(hour_show),
.counter_num(counter_num),
.hour(hour),
.sec(sec)
);
//鬧鐘模塊
Alarm P19(
.cp(clock),
.enable(alarm_enable),
.set(set && !set_enable),
.set_num(set_num),
.hour(hour),
.counter_num(counter_num),
.alarm(alarm),
.hour_alarm(hour_alarm),
.alarm_num(alarm_num)
);
//取數(shù)模塊
Select P20(
.cp(cp),
.counter_num(counter_num),
.set_num(set_num),
.alarm_num(alarm_num),
.set_enable(set_enable),
.alarm_enable(alarm_enable),
.hour_show(hour_show),
.sec_show(sec_show),
.show_num(show_num)
);
//掃描模塊
Scan P5(
.cp(cp),
.set_enable(set_enable),
.num(show_num),
.loc(loc),
.set_loc(set_loc),
.point(point),
.scan_num(scan_num)
);
//譯碼模塊
Trans P6(
.scan_num(scan_num),
.point(point),
.pin(pin)
);
endmodule
2. 分頻模塊_module Clock
將20ns的電路板脈沖50000000分頻,輸出1s的脈沖,作為計(jì)時(shí)cp。
//分頻模塊
module Clock(
input cp,
output clock
);
parameter i = 25000000;//下載(計(jì)時(shí)頻率1Hz)
//parameter i = 5;//調(diào)試程序
reg [31:0] counter = 0;
reg clock_temp = 0;
always @(posedge cp)//上升沿觸發(fā)
begin
if (counter >= i-1)
begin
counter = 0;
clock_temp = ~clock_temp;//取反
end
else
counter = counter+1;
end
assign clock = clock_temp;
endmodule
3. 校時(shí)功能模塊_module Seter
校時(shí)模塊由4個n進(jìn)制計(jì)數(shù)器(n=10)子模塊組成,set_loc用于記錄操作哪一位計(jì)數(shù)器,set_num用于記錄校時(shí)的值。在enable撥碼為1時(shí),apply按鍵每按下一次,指針向右移一位;inc按鍵每按下一次,當(dāng)前計(jì)數(shù)器獲得一個cp,即值加1。在enable撥碼為0時(shí),該模塊不起作用。
//校時(shí)功能模塊
module Seter(
input enable,
input inc,
input apply,
output [15:0] set_num,
output [3:0] set_loc
);
//中間變量
reg [3:0] set_loc_temp = 4'b1000;//修改的位
always @(posedge apply)
begin
if (enable)
begin
set_loc_temp[0] <= set_loc_temp[1];
set_loc_temp[1] <= set_loc_temp[2];
set_loc_temp[2] <= set_loc_temp[3];
set_loc_temp[3] <= set_loc_temp[0];//移位
end
end
Count_n P15(
.cp(set_loc_temp[0] && enable && inc),
.reset(0),
.set(0),
.set_num(0),
.n(10),//十進(jìn)制
.countn_num(set_num[3:0]),
.countn_co()//輸出懸空
);
Count_n P16(
.cp(set_loc_temp[1] && enable && inc),
.reset(0),
.set(0),
.set_num(0),
.n(10),
.countn_num(set_num[7:4]),
.countn_co()
);
Count_n P17(
.cp(set_loc_temp[2] && enable && inc),
.reset(0),
.set(0),
.set_num(0),
.n(10),
.countn_num(set_num[11:8]),
.countn_co()
);
Count_n P18(
.cp(set_loc_temp[3] && enable && inc),
.reset(0),
.set(0),
.set_num(0),
.n(10),
.countn_num(set_num[15:12]),
.countn_co()
);
assign set_loc = set_loc_temp;
endmodule
4. n進(jìn)制計(jì)數(shù)器模塊_module Count_n
計(jì)數(shù)器的進(jìn)制n與計(jì)數(shù)脈沖cp由輸入給定,輸出當(dāng)前計(jì)數(shù)值和進(jìn)位。具有清零和置數(shù)的功能。
//n進(jìn)制計(jì)數(shù)器模塊
module Count_n(
input cp,
input reset,
input set,
input [3:0] set_num,//置數(shù)值
input [3:0] n,//進(jìn)制
output [3:0] countn_num,//計(jì)數(shù)值
output countn_co//進(jìn)位
);
//中間變量
reg [3:0] counter = 0;
reg countn_co_temp = 0;
always @(posedge cp, posedge reset, posedge set)
begin
//計(jì)數(shù)
if (reset)//高電平清零
begin
counter = 0;
countn_co_temp = 0;
end
else
begin
if (set)//高電平置數(shù)
begin
if (set_num < n)
begin
counter = set_num;
countn_co_temp = 0;
end
end
else
begin
counter = counter+1;//阻塞賦值,順序執(zhí)行
if (counter >= n)
begin
counter = 0;
countn_co_temp = 1;
end
else
countn_co_temp = 0;
end
end
end
assign countn_num = counter;
assign countn_co = countn_co_temp;
endmodule
5. 計(jì)時(shí)功能模塊_module Counter
計(jì)時(shí)功能模塊含秒、分、時(shí)三個子模塊,串行連接,秒針cp由分頻模塊給出,分針cp由秒進(jìn)位給出,時(shí)針cp由分針進(jìn)位給出。輸出當(dāng)前時(shí)間、秒針LED電平、分針進(jìn)位(供鬧鐘整點(diǎn)報(bào)時(shí)使用)。具有清零和置數(shù)功能。
計(jì)時(shí)功能:當(dāng)enable撥碼為1時(shí),將cp給秒針模塊;否則不進(jìn)行計(jì)數(shù)。
清零功能:reset按鍵按下,時(shí)分秒全部清零。
置數(shù)功能:當(dāng)sec_show(顯示分秒)或hour_show(顯示時(shí)分)撥碼為1時(shí),set按鍵按下,將置數(shù)值賦給分秒/時(shí)分;否則置數(shù)功能不起作用。
//計(jì)時(shí)功能模塊
module Counter(
input cp,
input reset,
input enable,
input set,
input [15:0] set_num,//置數(shù)值
input sec_show,//顯示分秒
input hour_show,//顯示時(shí)分
output [23:0] counter_num,//當(dāng)前時(shí)間
output hour,//分針進(jìn)位
output sec//秒針LED
);
//中間變量
wire co_sec;//秒進(jìn)位
wire co_min;//分進(jìn)位
wire [7:0]sec_num;//秒
wire [7:0]min_num;//分
wire [7:0]hour_num;//時(shí)
wire sec_temp;
reg [23:0] set_num_temp = 0;
reg [2:0] set_temp = 0;
//置數(shù)判斷
always @(set)
begin
if (set)
begin
if (hour_show)
begin
set_num_temp[23:8] = set_num;
set_temp = 3'b110;
end
else
if (sec_show)
begin
set_num_temp[15:0] = set_num;
set_temp = 3'b011;
end
end
else
set_temp = 0;
end
//秒針
Sec_counter P2(
.cp(cp),
.reset(reset),
.set(set_temp[0]),
.set_num(set_num_temp[7:0]),
.enable(enable),
.sec_num(sec_num),
.co_sec(co_sec),
.sec(sec_temp)
);
assign sec = sec_temp;
//分針
Min_counter P3(
.cp(co_sec),
.reset(reset),
.set(set_temp[1]),
.set_num(set_num_temp[15:8]),
.co_min(co_min),
.min_num(min_num)
);
//時(shí)針
Hour_counter P4(
.cp(co_min),
.reset(reset),
.set(set_temp[2]),
.set_num(set_num_temp[23:16]),
.hour_num(hour_num)
);
assign hour = co_min;
assign counter_num[23:16] = hour_num;
assign counter_num[15:8] = min_num;
assign counter_num[7:0] = sec_num;
endmodule
6. 秒針模塊_module Sec_counter
秒針模塊包含兩個n進(jìn)制計(jì)數(shù)器子模塊(個位n=10,十位n=6),串行連接,個位進(jìn)位接到十位cp上。cp、set、reset、置數(shù)值由父模塊給定。輸出秒LED電平、秒針數(shù)值、秒針進(jìn)位。由于當(dāng)計(jì)數(shù)使能為0時(shí),計(jì)數(shù)停止,秒LED應(yīng)不再閃爍,因此LED電平不能由分頻模塊直接提供。
//秒針模塊
module Sec_counter (
input cp,
input reset,
input set,
input [7:0] set_num,
input enable,
output [7:0] sec_num,//秒針數(shù)值
output co_sec,//進(jìn)位
output sec//秒LED
);
//中間變量
wire [1:0] co_sec_temp;
wire enable_h;
wire [7:0] sec_num_temp;
reg sec_temp = 0;
//10進(jìn)制計(jì)數(shù)器計(jì)個位
Count_n P7(
.cp(cp && enable),
.reset(reset),
.set(set),
.set_num(set_num[3:0]),
.n(10),
.countn_num(sec_num_temp[3:0]),
.countn_co(co_sec_temp[0])
);
//6進(jìn)制計(jì)數(shù)器計(jì)十位
assign enable_h = co_sec_temp[0];
Count_n P8(
.cp(enable_h),
.reset(reset),
.set(set),
.set_num(set_num[7:4]),
.n(6),
.countn_num(sec_num_temp[7:4]),
.countn_co(co_sec_temp[1])
);
assign co_sec = co_sec_temp[1];
//采取秒針LED電平
always @(sec_num_temp)
begin
if (sec_num_temp[0])
sec_temp = 1;
else
sec_temp = 0;
end
assign sec = sec_temp;
assign sec_num = sec_num_temp;
endmodule
7. 分針模塊_module Min_counter
原理同秒針模塊,不再贅述。
//分針模塊
module Min_counter(
input cp,
input reset,
input set,
input [7:0] set_num,
output co_min,
output [7:0] min_num
);
//中間變量
wire [1:0] co_min_temp;
wire [7:0] min_num_temp;
wire enable_h;
//10進(jìn)制計(jì)數(shù)器計(jì)個位
Count_n P9(
.cp(cp),
.reset(reset),
.set(set),
.set_num(set_num[3:0]),
.n(10),
.countn_num(min_num_temp[3:0]),
.countn_co(co_min_temp[0])
);
//6進(jìn)制計(jì)數(shù)器計(jì)十位
assign enable_h = co_min_temp[0];
Count_n P10(
.cp(enable_h),
.reset(reset),
.set(set),
.set_num(set_num[7:4]),
.n(6),
.countn_num(min_num_temp[7:4]),
.countn_co(co_min_temp[1])
);
assign min_num = min_num_temp;
assign co_min = co_min_temp[1];
endmodule
8. 時(shí)針模塊_module Hour_counter
十位為3進(jìn)制,個位進(jìn)制由十位數(shù)值決定,當(dāng)十位為0或1時(shí),個位為10進(jìn)制;當(dāng)十位為2時(shí),個位為4進(jìn)制。其余原理同分、秒模塊。
//時(shí)針模塊
module Hour_counter(
input cp,
input reset,
input set,
input [7:0] set_num,
output [7:0] hour_num
);
//中間變量
wire [1:0] co_hour_temp;
wire [7:0] hour_num_temp;
reg [3:0] n_low = 10;
wire enable_h;
//10-4進(jìn)制計(jì)數(shù)器計(jì)個位
Count_n P11(
.cp(cp),
.reset(reset),
.set(set),
.set_num(set_num[3:0]),
.n(n_low),
.countn_num(hour_num_temp[3:0]),
.countn_co(co_hour_temp[0])
);
assign enable_h = co_hour_temp[0];
//3進(jìn)制計(jì)數(shù)器計(jì)十位
Count_n P12(
.cp(enable_h),
.reset(reset),
.set(set),
.set_num(set_num[7:4]),
.n(3),
.countn_num(hour_num_temp[7:4]),
.countn_co(co_hour_temp[1])
);
//控制個位進(jìn)制
always @(hour_num_temp[7:4])
begin
case(hour_num_temp[7:4])
2: n_low = 4;
default: n_low = 10;
endcase
end
assign hour_num = hour_num_temp;
endmodule
9. 鬧鐘功能模塊_module Alarm
鬧鐘模塊有整點(diǎn)報(bào)時(shí)和定時(shí)鬧鐘兩個功能:
整點(diǎn)報(bào)時(shí):當(dāng)產(chǎn)生分進(jìn)位信號時(shí),根據(jù)當(dāng)前時(shí)針數(shù)值(由計(jì)時(shí)模塊給定)決定LED閃爍次數(shù),(閃爍頻率由分頻模塊給定)。
定時(shí)鬧鐘: 置數(shù)方式與計(jì)時(shí)模塊相似,當(dāng)alarm_show(顯示鬧鐘)撥碼為1時(shí),set按鍵按下,將置數(shù)值賦給鬧鐘;否則置數(shù)功能不起作用。當(dāng)前時(shí)間與鬧鐘數(shù)值相同時(shí),鬧鐘LED常亮一分鐘。
//鬧鐘功能模塊
module Alarm(
input cp,
input enable,
input set,
input [15:0] set_num,
input hour,//進(jìn)位信號
input [23:0] counter_num,
output alarm,//定時(shí)鬧鐘
output hour_alarm,//整點(diǎn)報(bào)時(shí)
output [15:0] alarm_num//鬧鐘時(shí)間
);
//中間變量
reg [7:0] hour_num = 0;//時(shí)針時(shí)間
reg [15:0] alarm_num_temp = 0;
reg hour_alarm_temp = 0;
reg alarm_temp = 0;
reg switch = 1;//控制閃爍
always @(posedge cp)
begin
//整點(diǎn)報(bào)時(shí)
if (hour && (counter_num[15:0] == 0))//裝入初值,不斷減一,直到為0
hour_num = counter_num[23:20]*10 + counter_num[19:16];
else
begin
if (hour_num > 0)
begin
if (switch)
begin
hour_num = hour_num - 1;
hour_alarm_temp = 1;
switch = ~switch;
end
else
begin
hour_alarm_temp = 0;
switch = ~switch;
end
end
else
hour_alarm_temp = 0;
end
//定時(shí)鬧鐘
if (alarm_num == counter_num[23:8])
alarm_temp = 1;
else
alarm_temp = 0;
end
assign hour_alarm = hour_alarm_temp;
assign alarm = alarm_temp;
//定時(shí)
always @(posedge set)
begin
if (enable)
alarm_num_temp = set_num;
end
assign alarm_num = alarm_num_temp;
endmodule
10. 取數(shù)模塊_module Select
按優(yōu)先級排列如下:
當(dāng)set_enable(置數(shù)使能)撥碼為1時(shí),輸出置數(shù)內(nèi)容;
當(dāng)alarm_enable(顯示鬧鐘)撥碼為1時(shí),輸出鬧鐘內(nèi)容;
當(dāng)hour_show(顯示時(shí)分)撥碼為1時(shí),輸出時(shí)分內(nèi)容;
當(dāng)sec_show(顯示分秒)撥碼為1時(shí),輸出分秒內(nèi)容。
//取數(shù)模塊
module Select(
input cp,
input [23:0] counter_num,
input [15:0] set_num,
input [15:0] alarm_num,
input set_enable,
input alarm_enable,
input hour_show,
input sec_show,
output [15:0] show_num
);
reg [15:0] show_num_temp = 0;
always @(posedge cp)
begin
if(set_enable)
show_num_temp <= set_num;
else if (alarm_enable)
show_num_temp <= alarm_num;
else if (hour_show)
show_num_temp <= counter_num[23:8];
else if (sec_show)
show_num_temp <= counter_num[15:0];
else
show_num_temp <= 0;
end
assign show_num = show_num_temp;
endmodule
11. 掃描模塊_module Scan
將取數(shù)模塊輸出值分時(shí)送到譯碼模塊。掃描頻率的計(jì)算方法與模六十計(jì)數(shù)器相同,但由于是對4個數(shù)碼管進(jìn)行動態(tài)顯示,分頻數(shù)應(yīng)是模六十計(jì)數(shù)器的一半,即2的18次方。
//掃描模塊
module Scan(
input cp,
input [15:0] num,
input set_enable,
input [3:0] set_loc,
output [3:0] loc,
output [3:0] scan_num,
output point
);
//中間變量
parameter j = 18;//控制掃描速率,仿真時(shí)取1;下載時(shí)取18(掃描頻率100Hz)
reg [33:0] scan_counter = 0;
reg [3:0] loc_temp = 4'b1111;
reg [3:0] scan_num_temp = 0;
reg point_temp = 1;
wire [15:0] num_temp;
assign num_temp = num;
always @(posedge cp)//上升沿觸發(fā)
begin
scan_counter <= scan_counter+1;
end
always @(scan_counter[j])
begin
case(scan_counter[j+1:j])
2'b00:
begin
loc_temp <= 4'b1110;
scan_num_temp <= num_temp[3:0];
point_temp <= set_loc[0];
end
2'b01:
begin
loc_temp <= 4'b1101;
scan_num_temp <= num_temp[7:4];
point_temp <= set_loc[1];
end
2'b10:
begin
loc_temp <= 4'b1011;
scan_num_temp <= num_temp[11:8];
point_temp <= set_loc[2];
end
2'b11:
begin
loc_temp <= 4'b0111;
scan_num_temp <= num_temp[15:12];
point_temp <= set_loc[3];
end
endcase
if (set_enable == 0)
point_temp <= 0;
end
assign loc = loc_temp;
assign point = point_temp;
assign scan_num = scan_num_temp;
endmodule
12. 譯碼模塊_module Trans
將掃描模塊輸入的數(shù)字轉(zhuǎn)化成對應(yīng)的數(shù)碼管電平輸出,與模六十計(jì)數(shù)器相同。但由于置數(shù)時(shí)需要用小數(shù)點(diǎn)來顯示設(shè)置的位置,當(dāng)set_enable(置數(shù)使能)撥碼為1時(shí),根據(jù)置數(shù)位置來確定是否顯示小數(shù)點(diǎn);當(dāng)set_enable(置數(shù)使能)撥碼為0時(shí),不顯示小數(shù)點(diǎn)。
//譯碼模塊
module Trans(
input [3:0] scan_num,
input point,
output [7:0] pin
);
//中間變量
wire [3:0] scan_num_temp;
assign scan_num_temp = scan_num;
reg [7:0] pin_temp;
always @(scan_num_temp, point)
begin
case(scan_num_temp)
0: pin_temp[7:1] = 7'b0000001;
1: pin_temp[7:1] = 7'b1001111;
2: pin_temp[7:1] = 7'b0010010;
3: pin_temp[7:1] = 7'b0000110;
4: pin_temp[7:1] = 7'b1001100;
5: pin_temp[7:1] = 7'b0100100;
6: pin_temp[7:1] = 7'b0100000;
7: pin_temp[7:1] = 7'b0001111;
8: pin_temp[7:1] = 7'b0000000;
9: pin_temp[7:1] = 7'b0000100;
default: pin_temp = 7'b0110000;//其他狀態(tài)顯示E
endcase
pin_temp[0] = !point;
end
assign pin = pin_temp;
endmodule
四、測試文件
仿真代碼如下:
module Test_Top;
// Inputs
reg cp;
reg reset;
reg set;
reg apply;
reg inc;
reg set_enable;
reg alarm_enable;
reg hour_show;
reg sec_show;
reg count_enable;
// Outputs
wire [3:0] loc;
wire [7:0] pin;
wire alarm;
wire hour_alarm;
wire sec;
// Instantiate the Unit Under Test (UUT)
top uut (
.cp(cp),
.reset(reset),
.set(set),
.apply(apply),
.inc(inc),
.set_enable(set_enable),
.alarm_enable(alarm_enable),
.hour_show(hour_show),
.sec_show(sec_show),
.count_enable(count_enable),
.loc(loc),
.pin(pin),
.alarm(alarm),
.hour_alarm(hour_alarm),
.sec(sec)
);
//時(shí)鐘周期20ns
parameter PERIOD = 20;
//時(shí)鐘信號
always begin
cp = 1'b0;
#(PERIOD/2)cp = 1'b1;
#(PERIOD/2);
end
initial begin
// Initialize Inputs
cp = 0;
reset = 1;
set = 0;
apply = 0;
inc = 0;
set_enable = 0;
alarm_enable = 0;
hour_show = 0;
sec_show = 0;
count_enable = 0;
// Wait 100 ns for global reset to finish
#100;
reset = 0;
// Add stimulus here
//////////////////////////////////////////////使能撥碼測試
//開始計(jì)數(shù)
#100;count_enable=1;
//顯示分秒
#100;sec_show=1;
//顯示時(shí)分
#100;hour_show=1;
//鬧鐘模式
#100;alarm_enable=1;
//置數(shù)模式
#100;set_enable=1;
//////////////////////////////////////////////鬧鐘置數(shù)測試
//鬧鐘置數(shù)1200
#100;inc=1; #20;inc=0;//1
#100;apply=1; #20;apply=0;
#100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0;//2
#100;set_enable=0;
#100;set=1; #20;set=0;
//////////////////////////////////////////////時(shí)鐘置數(shù)測試
//時(shí)分置數(shù)1100
set_enable=1;
#100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0;
#100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0;
#100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0;//1
#100;set_enable=0;alarm_enable=0;//1
#100;set=1; #20;set=0;
//分秒置數(shù)5949
set_enable=1;
#100;apply=1; #20;apply=0; #100;apply=1; #20;apply=0; #100;apply=1; #20;apply=0;
#100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0;
#100;inc=1; #20;inc=0;//5
#100;apply=1; #20;apply = 0;
#100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0;
#100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0;
#100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0;//9
#100;apply=1; #20;apply = 0;
#100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0;
#100;inc=1; #20;inc=0; //4
#100;apply=1; #20;apply=0;
#100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0;
#100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0;
#100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0;//9
#100;set_enable=0;hour_show=0;
#100;set=1; #20;set=0;
#500;
//////////////////////////////////////////////清零測試
//清零
#100;reset=1;#20;reset=0;
//////////////////////////////////////////////計(jì)時(shí)使能撥碼測試
//停止計(jì)時(shí)
#100;count_enable=0;
//////////////////////////////////////////////進(jìn)位測試
//分秒置數(shù)5949
#100;set=1; #20;set=0;
//時(shí)分置數(shù)2359
set_enable=1;
#100;apply=1; #20;apply=0;//9
#100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0;
#100;inc=1; #100;inc=0; #100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0;
#100;inc=1; #20;inc=0;//2
#100;apply=1; #20;apply=0;
#100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0; #100;inc=1; #20;inc=0;
#100;inc=1; #20;inc=0;//3
#100;apply=1; #20;apply=0;
#100;inc=1; #20;inc=0;//5
#100;set=1; #20;set=0;//空置數(shù)(當(dāng)置數(shù)使能為0時(shí),inc按鍵不應(yīng)起作用)
#100;set_enable=0;
#100;sec_show=0; #100;set=1; #20;set=0;//空置數(shù)
#100;hour_show=1; #100;set=1; #20;set=0;//時(shí)分置數(shù)
//恢復(fù)計(jì)時(shí)
#100;count_enable=1;
end
endmodule
五、波形仿真
- 變量名稱說明
cp:電路板脈沖(20ns);
clock:分頻模塊產(chǎn)生脈沖,仿真時(shí)為10分頻;
reset:清零按鍵;
set:置數(shù)按鍵;
inc:加一按鍵,在置數(shù)模式下對選定位加一;
apply:移位按鍵,在置數(shù)模式下改變選定的位置;
set_enable:置數(shù)使能撥碼;
alarm_enable:顯示鬧鐘撥碼;
hour_show:顯示時(shí)分撥碼;
sec_show:顯示分秒撥碼;
count_enable:計(jì)時(shí)使能撥碼;
set_num:置數(shù)內(nèi)容:為觀察方便,采用16進(jìn)制顯示,下同;
alarm_num:鬧鐘時(shí)間;
count_num:計(jì)時(shí)時(shí)間;
show_num:數(shù)碼管顯示內(nèi)容;
loc:掃描位置;
scan_num:掃描數(shù)字,初始值為X,因?yàn)槭侵虚g變量,不會對引腳電平產(chǎn)生影響;
pin:數(shù)碼管引腳電平,最后一位為小數(shù)點(diǎn);
sec:秒LED;
hour_alarm:整點(diǎn)報(bào)時(shí)LED;
alarm:鬧鐘LED。
2. 使能撥碼測試
初始化時(shí)關(guān)閉所有撥碼,數(shù)碼管顯示0000;逐步打開撥碼,數(shù)碼管顯示對應(yīng)內(nèi)容,如黃線所示,此時(shí)hour_show撥碼打開,顯示時(shí)分,counter_num內(nèi)容為000001,故show_num為0000。
3. 鬧鐘置數(shù)測試
通過inc和apply按鍵使置數(shù)值達(dá)到1200,關(guān)閉set_enable,此時(shí)alarm_enable優(yōu)先級最高,按下set按鍵,如黃線所示,alarm_num由0000變?yōu)?200。
4. 時(shí)鐘置數(shù)測試
用同樣的方法,先后使時(shí)鐘的時(shí)分置1100,分秒置5949,如黃線所示。
5. 清零測試
如黃線所示,reset按下后,counter_num清零。
6. 計(jì)時(shí)使能撥碼測試
如黃線所示,count_enable撥碼置0后,不再計(jì)數(shù),count_num保持不變。
7. 進(jìn)位測試
將時(shí)間置到235949,進(jìn)位正常,由235959到000000,如黃線所示。文章來源:http://www.zghlxwxcb.cn/news/detail-475179.html
總結(jié)
從電路角度去想問題
不要像我這么復(fù)雜文章來源地址http://www.zghlxwxcb.cn/news/detail-475179.html
到了這里,關(guān)于EDA數(shù)字鐘的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!