国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于高云FPGA開(kāi)發(fā)板的多功能數(shù)字時(shí)鐘

這篇具有很好參考價(jià)值的文章主要介紹了基于高云FPGA開(kāi)發(fā)板的多功能數(shù)字時(shí)鐘。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

一、數(shù)字時(shí)鐘作品的功能

二、數(shù)字時(shí)鐘作品的主體設(shè)計(jì)原理和功能說(shuō)明

三、數(shù)字時(shí)鐘的各設(shè)計(jì)模塊說(shuō)明及模塊程序代碼

1) 時(shí)鐘分頻模塊time_div、freq_div

2)按鍵消抖模塊key_db

3)控制模塊control

4)時(shí)間正常計(jì)數(shù)模塊time_count

5)時(shí)間設(shè)置模塊time_set

6)時(shí)間動(dòng)態(tài)掃描位選模塊time_display_sel

7)顯示模塊display

8)秒表模塊stop_watch

9)鬧鐘模塊alarm_clock

10)多功能數(shù)字鐘的頂層設(shè)計(jì)clock_demo

四、模塊調(diào)試和硬件下載測(cè)試

本程序進(jìn)行硬件下載測(cè)試的流程:

模塊調(diào)試:

1.時(shí)間正常顯示模塊調(diào)試:

2.時(shí)間設(shè)置模塊調(diào)試:

3.秒表模塊調(diào)試:

4、鬧鐘模塊調(diào)試

五、遇到的問(wèn)題及解決方法

六、課程學(xué)習(xí)總結(jié)


一、數(shù)字時(shí)鐘作品的功能

本作品是一款基于FPGA開(kāi)發(fā)設(shè)計(jì)的多功能數(shù)字時(shí)鐘,在結(jié)合利用高云開(kāi)發(fā)板的相關(guān)硬件資源的情況下,設(shè)計(jì)了這樣的一款多功能數(shù)字時(shí)鐘。該數(shù)字時(shí)鐘具備有以下的相關(guān)功能:

1、具有基本走時(shí)功能,時(shí)間范圍是00:00:00~23:59:59。

2、具有暫停計(jì)時(shí)和清零功能。

3、具有調(diào)節(jié)時(shí)間功能。

4、鬧鐘功能,定時(shí)時(shí)間可調(diào),可以發(fā)出提示信號(hào)。

5、秒表功能,具有清0和暫停。

二、數(shù)字時(shí)鐘作品的主體設(shè)計(jì)原理和功能說(shuō)明

數(shù)字時(shí)鐘作品設(shè)計(jì)的基礎(chǔ)語(yǔ)言是Verilog,在高云軟件(Gowin V1.9.8.11 Education)上面完成程序的編寫(xiě),并進(jìn)行系統(tǒng)的仿真,最后將代碼下載到高云FPGA實(shí)物開(kāi)發(fā)板上面測(cè)試,驗(yàn)證數(shù)字時(shí)鐘的功能,最終完成本次的課程設(shè)計(jì)。?

根據(jù)項(xiàng)目的設(shè)計(jì)要求,多功能數(shù)字時(shí)鐘主要完成了基本的時(shí)間顯示功能、時(shí)間設(shè)置功能、鬧鐘功能及秒表功能。在各種功能之間,需要進(jìn)行界面的轉(zhuǎn)換,因此需要設(shè)定外部功能按鍵,用來(lái)控制界面跳轉(zhuǎn)和設(shè)置參數(shù)。同時(shí),在不同的界面下,需要完成各種小的功能實(shí)現(xiàn),以實(shí)現(xiàn)對(duì)時(shí)間的設(shè)置、秒表、鬧鐘等等功能的設(shè)置和實(shí)現(xiàn)。

1)時(shí)間正常顯示、設(shè)置時(shí)間的狀態(tài)信息、秒表信息等功能的顯示 ??

采用四段共陽(yáng)極數(shù)碼管來(lái)完成界面信息顯示,在按鍵的控制下,實(shí)現(xiàn)時(shí)間的設(shè)置,以及在設(shè)置過(guò)程中的時(shí)間顯示、秒表計(jì)時(shí)顯示、鬧鐘時(shí)間設(shè)置與查看。

2)四個(gè)按鍵開(kāi)關(guān)的控制,對(duì)展示的界面進(jìn)行調(diào)節(jié)

(1)按鍵1(key1):

功能1,進(jìn)入時(shí)間正常顯示功能模式;

功能2,進(jìn)入時(shí)間設(shè)置功能模式;

功能3,進(jìn)入秒表功能模式;

功能4,進(jìn)入鬧鐘時(shí)間查看與設(shè)置功能模式。

(2)按鍵2(key2):

按鍵2主要實(shí)現(xiàn)時(shí)間設(shè)置、鬧鐘設(shè)置、秒表的暫停與開(kāi)始計(jì)時(shí),與按鍵1配合使用。在功能2模式時(shí),用做時(shí)、分、秒數(shù)碼管的移位,按一下,就會(huì)出現(xiàn)“時(shí)-分-秒”的依次移位,便于在特定的數(shù)碼管位置進(jìn)行時(shí)間的設(shè)置,在退出功能2模式時(shí),功能1的正常時(shí)間顯示會(huì)馬上更新為新的時(shí)間。在功能3中,當(dāng)按下按鍵時(shí),秒表將開(kāi)始計(jì)時(shí),同時(shí),在按下按鍵時(shí),停下計(jì)時(shí)。在功能4模式時(shí),用做時(shí)、分、秒的移位,按一下,就會(huì)實(shí)現(xiàn)“時(shí)-分-秒”的依次移位,便于在特定的數(shù)碼管位置進(jìn)行時(shí)間的設(shè)置。

(3)按鍵3(key3):

按鍵3主要用于鬧鐘設(shè)置、秒表和時(shí)間設(shè)置中的調(diào)整按鍵。在功能2模式時(shí),用做時(shí)、分、秒的數(shù)字調(diào)整,按一下,會(huì)使當(dāng)前按鍵2選擇的位置的數(shù)字加1。在功能4模式時(shí),用做時(shí)、分、秒的數(shù)字調(diào)整,按一下,會(huì)使當(dāng)前按鍵2選擇的位置的數(shù)字加1。

(4)按鍵4(key4):

主要與按鍵3配合使用,當(dāng)按鍵4按下時(shí),此時(shí)的相關(guān)標(biāo)志位打開(kāi),再次按下按鍵3,當(dāng)前的數(shù)碼管數(shù)字清0,再次按下按鍵4,便可以繼續(xù)實(shí)現(xiàn)按鍵3的+1操作,主要用于模式2的時(shí)間設(shè)置和模式3的秒表模式。同時(shí),在模式1中,當(dāng)按下按鍵4時(shí),此時(shí)將會(huì)暫停當(dāng)前的時(shí)間顯示,時(shí)鐘不會(huì)跳動(dòng),實(shí)現(xiàn)暫停。

3)相關(guān)提示信號(hào)和鬧鐘時(shí)間到達(dá)時(shí)的提醒信號(hào)

在模式1的正常時(shí)間顯示中,在數(shù)碼管的中間位置設(shè)置兩個(gè)小點(diǎn)的閃爍信號(hào),每隔1s的時(shí)鐘,該指示燈便會(huì)閃一下,用于提醒用戶(hù)此時(shí)正在進(jìn)行時(shí)間走時(shí)。在模式3中,秒表在正常計(jì)時(shí)的時(shí)候,對(duì)從左往右第1位數(shù)碼管和第3位數(shù)碼管設(shè)置小數(shù)點(diǎn),用于區(qū)分此時(shí)的分、秒、十分秒。同時(shí),在模式4中,當(dāng)正常時(shí)間與鬧鐘設(shè)置的之間相等時(shí),會(huì)發(fā)送一個(gè)提醒信號(hào)LED,信號(hào)的持續(xù)時(shí)長(zhǎng)為60s,起到鬧鐘的功能。

多功能數(shù)字鐘總體設(shè)計(jì)框圖如下:

基于高云FPGA開(kāi)發(fā)板的多功能數(shù)字時(shí)鐘,FPGA,fpga開(kāi)發(fā)

三、數(shù)字時(shí)鐘的各設(shè)計(jì)模塊說(shuō)明及模塊程序代碼

1) 時(shí)鐘分頻模塊time_div、freq_div

時(shí)鐘分頻模塊time_div主要利用模塊freq_div模塊來(lái)完成基準(zhǔn)時(shí)鐘clk的分頻,得到計(jì)時(shí)模塊clk1、數(shù)碼管動(dòng)態(tài)掃描模塊clk1k、秒表模塊clk10、設(shè)置時(shí)間時(shí),單獨(dú)顯示一個(gè)數(shù)碼管所需要的時(shí)鐘信號(hào)clk200,此時(shí)的時(shí)鐘分別為1Hz 、1kHz、100Hz和200Hz

其中,在time_div模塊中,將分頻系數(shù)1、1000、100、200通過(guò)下面的模塊進(jìn)行例化,并傳入freq_div模塊,便可以得到相應(yīng)的時(shí)鐘信號(hào)輸出。

程序如下所示:

//clk:系統(tǒng)基準(zhǔn)時(shí)鐘 ?27MHZ
//clk1k:動(dòng)態(tài)掃描時(shí)鐘信號(hào) ?1kHZ
//clk200:閃爍時(shí)鐘信號(hào) ?200HZ
//clk10:秒表--時(shí)鐘信號(hào) ?10HZ
//clk1:秒--時(shí)鐘信號(hào) ?1HZ=1s
module time_div(
? input ? clk, ?   ?   //系統(tǒng)的自帶時(shí)鐘 27MHz=27 000 000
? output ? clk1k, 
? output ? clk200,
? output ? clk100,
? output ? clk1 ? ?
);
localparam CLK_IN_FREQ = 27000000; ? //設(shè)備的時(shí)鐘頻率
freq_div #(     //1000HZ分頻 --硬件不同在此處的分頻隨時(shí)調(diào)整
? ? ?.DIV_RATE_2N ?(CLK_IN_FREQ/1000) 
) freq_div_i_clk1k(
? ? .clk_in_i ? ?(clk),
? ? .rst_i ? ? ? (rst),
? ? .clk_out_o ? (clk1k) ? 
);
freq_div #( ? ? ?//200HZ分頻
? ? ?.DIV_RATE_2N ?(CLK_IN_FREQ/200)
) freq_div_i_clk200(
? ? .clk_in_i ? ?(clk),
? ? .rst_i ? ? ? (rst),
? ? .clk_out_o ? (clk200) ? 
);
freq_div #( ? ? //100HZ分頻
? ? ?.DIV_RATE_2N ?(CLK_IN_FREQ/10)
) freq_div_i_clk10(
? ? .clk_in_i ? ?(clk),
? ? .rst_i ? ? ? (rst),
? ? .clk_out_o ? (clk10) ?
);
freq_div #( ? ?   //1HZ分頻
? ? ?.DIV_RATE_2N ?(CLK_IN_FREQ/1) 
) freq_div_i_clk1(
? ? .clk_in_i ? ?(clk),
? ? .rst_i ? ? ? (rst),
? ? .clk_out_o ? (clk1) ? 
);
endmodule

2)按鍵消抖模塊key_db

按鍵消抖模塊,主要實(shí)現(xiàn)外部的四個(gè)按鍵信號(hào)輸入時(shí),將輸入的按鍵信號(hào)進(jìn)行消抖,防止抖動(dòng)的誤操作。

其中,在下面的模塊例化中,將輸入的按鍵信號(hào)key1、key2key3、key4送入key_db模塊中,便可以得到4個(gè)已經(jīng)消抖之后的按鍵信號(hào)key_db1、key_db2、key_db3、key_db4。

程序如下所示:

key_db ? ?key_db_i1( // 按鍵去抖動(dòng)信1
? ?.clk ? ?(clk),
? ?.key_i ? ?(key1),
? ?.key_db_o ? ? (key_db1) ? ?
);
key_db ? ?key_db_i2( // 按鍵去抖動(dòng)信號(hào)2
? ?.clk ? ?(clk),
? ?.key_i ? ?(key2),
? ?.key_db_o ? ? (key_db2) ? ?
);
key_db ? ?key_db_i3( // 按鍵去抖動(dòng)信號(hào) 3 
? ?.clk ? ?(clk),
? ?.key_i ? ?(key3),
? ?.key_db_o ? ? (key_db3) ? ?
);
key_db ? ?key_db_i4( // 按鍵去抖動(dòng)信號(hào) 4
? ?.clk ? ?(clk),
? ?.key_i ? ?(key4),
? ?.key_db_o ? ? (key_db4) ? ?
);

3)控制模塊control

控制模塊主要是對(duì)四個(gè)功能模塊進(jìn)行整體控制,包括對(duì)時(shí)間正常顯示、時(shí)間設(shè)置、秒表和鬧鐘顯示及調(diào)整的控制,其中,四個(gè)功能模塊的轉(zhuǎn)換是通過(guò)按鍵key1實(shí)現(xiàn)的。

按鍵key1按下一次,此時(shí)在程序中控制的標(biāo)志位set_en便會(huì)+1,再在程序的下面設(shè)置合適索引值的case語(yǔ)句,就使下一個(gè)功能的使能端處于高電平狀態(tài)(表示選中),此時(shí)便會(huì)顯示該界面,再按下一次,就會(huì)轉(zhuǎn)入下一個(gè)功能,使下一個(gè)功能的使能端有效,依次類(lèi)推,便可以實(shí)現(xiàn)四個(gè)功能time_en、time_set_en、stopwatch_en、alarm_clock_en的切換。

程序如下所示:

module control(
? input key1,
? output reg time_en, ? //時(shí)間正常工作使能
? output reg time_set_en, ? //時(shí)間設(shè)置使能
? output reg stopwatch_en, ?//秒表使能
? output reg alarm_clock_en ); ? //鬧鐘設(shè)置使能 
reg [2:0] set_en; ? ?//用于功能選擇
always @(posedge key1) ? ?begin
? ? if (set_en < 3) ? ?//各種功能信號(hào)的產(chǎn)生,通過(guò)自增進(jìn)行疊加。
? ? ? set_en <= set_en + 1;
? ? else
? ? ? set_en <= 0;
? ? case (set_en) ? ? ?//根據(jù)各種功能信號(hào)產(chǎn)生相對(duì)應(yīng)的控制信號(hào),高電平有效
   ?3'b000: begin ? //時(shí)間正常工作使能
? ? ? ? ? time_en <= 1;
? ? ? ? ? time_set_en <= 0;
? ? ? ? ? stopwatch_en <= 0;
? ? ? ? ? alarm_clock_en <= 0;
? ? ? ? end
   3'b001: begin    //時(shí)間設(shè)置使能
? ? ? ? ? time_en <= 0;
? ? ? ? ? time_set_en <= 1;
? ? ? ? ? stopwatch_en <= 0;
? ? ? ? ? alarm_clock_en <= 0;
? ? ? ? end
? ? 3'b010: begin  //秒表使能
? ? ? ? ? time_en <= 0;
? ? ? ? ? time_set_en <= 0;
? ? ? ? ? stopwatch_en <= 1;
? ? ? ? ? alarm_clock_en <= 0;
? ? ? ? end
? ? 3'b011:begin    //鬧鐘使能
? ? ? ? ? time_en <= 0;
? ? ? ? ? time_set_en <= 0;
? ? ? ? ? stopwatch_en <= 0;
? ? ? ? ? alarm_clock_en <= 1;
? ? ? ? end
? ? ? default: begin ? ? ?//全部關(guān)閉
? ? ? ? ? time_en <= 0;
? ? ? ? ? time_set_en <= 0;
? ? ? ? ? stopwatch_en <= 0;
? ? ? ? ? alarm_clock_en <= 0;
? ? ? ? end
? ? endcase
? end
endmodule

4)時(shí)間正常計(jì)數(shù)模塊time_count

時(shí)間正常計(jì)數(shù)模塊主要實(shí)現(xiàn)六位數(shù)字時(shí)間的正常運(yùn)行,并將生成的數(shù)字情況發(fā)送給數(shù)碼管進(jìn)行顯示。

其中,秒和分本質(zhì)是為0~59的六十進(jìn)制計(jì)數(shù)器,小時(shí)為0~23的二十四進(jìn)制計(jì)數(shù)器。在具體進(jìn)行計(jì)數(shù)的過(guò)程中,秒的低位進(jìn)行依次+1,當(dāng)達(dá)到9時(shí),秒的低位將會(huì)清0,此時(shí)秒的高位便會(huì)+1。之后,當(dāng)秒的高位達(dá)到5,秒的低位達(dá)到9時(shí),此時(shí)便會(huì)產(chǎn)生相應(yīng)的秒向分的進(jìn)位信號(hào)cout1,分的低位便會(huì)實(shí)現(xiàn)+1,同樣,在相同的邏輯之下,分也會(huì)產(chǎn)生向小時(shí)的進(jìn)位信號(hào)cout2,小時(shí)低位也會(huì)+1,其中需要注意的是,小時(shí)高位只有2,再次進(jìn)位便會(huì)到達(dá)天的計(jì)數(shù)。

同時(shí),在時(shí)間計(jì)數(shù)模塊中,還引入時(shí)間設(shè)置的情況,用于在二者的模式進(jìn)行轉(zhuǎn)換的時(shí)候,可以將原先的計(jì)數(shù)情況進(jìn)行更新,以達(dá)到設(shè)置時(shí)間的功能。

在進(jìn)行秒的計(jì)數(shù)過(guò)程中,將秒的低位計(jì)數(shù)設(shè)置標(biāo)志位flag1,當(dāng)按鍵key4按下的時(shí)候,此時(shí)秒的低位停止計(jì)數(shù),此時(shí)正常時(shí)間顯示可以實(shí)現(xiàn)暫停的功能。

程序如下所示:

//clk1:秒功能的時(shí)鐘信號(hào),為1Hz的脈沖信號(hào)
//time_en:時(shí)間正常工作的使能信號(hào) ? ?time_set_en:時(shí)間設(shè)置使能信號(hào)
//hourh_set,hourl_set, minh_set,minl_set, sech_set,secl_set:設(shè)置后的小時(shí)、分和秒(分別兩位)
//hourh,hourl:小時(shí)的高、低位顯示 ? ? ? ? minh,minl:分的高、低位顯示
//sech,secl:秒的高、低位顯示 ? ? ?cout:進(jìn)位輸出,即計(jì)滿(mǎn)24小時(shí),向下一天產(chǎn)生的進(jìn)位輸出信號(hào)
module time_count(
? input clk1,
? input clk,
? input key4, ? ?// 添加按鍵信號(hào)
? input time_en, ?//control模塊--時(shí)間正常工作使能
? input time_set_en, ?//時(shí)間設(shè)置使能
? input alarm_clock_en,
? input [3:0] ?hourh_set, ? //小時(shí)、分和秒(分別兩位)設(shè)置
? input [3:0] ?hourl_set,
? input [3:0] ?minh_set,
? input [3:0] ?minl_set,
? input [3:0] ?sech_set,
? input [3:0] ?secl_set,
? output reg [3:0] ?hourh, ?//小時(shí)、分和秒(分別兩位)顯示
? output reg [3:0] ?hourl,
? output reg [3:0] ?minh,
? output reg [3:0] ?minl,
? output reg [3:0] ?sech,
? output reg [3:0] ?secl,
? output reg cout, ?//進(jìn)位輸出
? output reg two_points ?); ? ?//輸出數(shù)碼管中間的兩個(gè)點(diǎn) ? ? ? ? ? ? ? ? ? ? ? ? 
reg flag1;
reg cout1,cout2; ? ?//cout1和cout2分別為秒向分、分向小時(shí)的進(jìn)位
reg [31:0] counter = 0;
always @(posedge key4) ? begin ?//每次檢測(cè)key4的按下,進(jìn)行標(biāo)志位翻轉(zhuǎn)
? ? flag1 = ~flag1; ? ? ? ? ? ? ? ? ? ? ? ? ?
end
always @(posedge clk ) ?begin ? //計(jì)數(shù)器,實(shí)現(xiàn)對(duì)數(shù)碼管的中間小點(diǎn)的閃爍控制--基于系統(tǒng)時(shí)鐘27Mhz
? if (time_en)
? ? if (flag1) begin
? ? ? if (counter == 13500000) ?begin
? ? ? ? ? two_points <= ~two_points; ?// 反轉(zhuǎn)小點(diǎn)狀態(tài)
? ? ? ? ? counter <= 0; // 重置計(jì)數(shù)器
? ? ? ? end 
? ? ? else 
? ? ? ? begin
? ? ? ? ? counter <= counter + 1;
? ? ? ? end
? ? end
? else ?if (alarm_clock_en) ?begin
? ? ? ? ? ? two_points <= 0;
? ? ? ? ? end
? ? ? ? else
? ? ? ? ? begin
? ? ? ? ? ? two_points <= 1;
? ? ? ? ? end
end
always@(posedge clk1 or posedge time_set_en) ?begin
? ? if (time_set_en) begin ? //秒的設(shè)置
? ? ? ? sech<=sech_set; ? ? //設(shè)置給秒的高低兩位
? ? ? ? secl<=secl_set;
? ? ? end
? ? else ?if (time_en) ? ?begin 
? ? ? ? ? ?//秒的計(jì)數(shù)情況
? ? ? ? if (secl==9) ?//秒的低位為9時(shí)
? ? ? ? ? begin
? ? ? ? ? secl<=0; ? ? //秒低位清0
? ? ? ? ? if (sech==5) ? //秒高位為5時(shí)
? ? ? ? ? ? begin
? ? ? ? ? ? ? sech<=0; ? //秒的低位為9,秒的高位為5時(shí),秒的高位清0
? ? ? ? ? ? ? cout1<=1; ?//秒向分進(jìn)1
? ? ? ? ? ? end
? ? ? ? ? else
? ? ? ? ? ? begin
? ? ? ? ? ? ? sech<=sech+1; ?//秒高位不為5,繼續(xù)+1
? ? ? ? ? ? end
? ? ? ? ? end
? ? ? ? else if (flag1) ? //當(dāng)標(biāo)志位翻轉(zhuǎn)時(shí),秒的低位不再變化,實(shí)現(xiàn)暫停
? ? ? ? ? begin
? ? ? ? ? secl<=secl+1; ?//秒低位不為9,繼續(xù)+1
? ? ? ? ? cout1<=0;
? ? ? ? ? end ? ? ? ? ? ? ? ?
? ? ? end
? end
always@(posedge cout1 or posedge time_set_en) ?//檢測(cè)秒向分的進(jìn)位
? begin ? 
? ? if (time_set_en) ?begin ? ?//分的設(shè)置
? ? ? ? minh<=minh_set; //設(shè)置給分的高低兩位
? ? ? ? minl<=minl_set;
? ? ? end ? 
? ? else if (minl==9) ?begin ? //分的計(jì)數(shù)情況
? ? ? ? minl<=0; ? ? //分低位清0
? ? ? ? if(minh==5) ? begin //分高位為5時(shí)
? ? ? ? ? ? minh<=0; ?//分的低位為9,分的高位為5時(shí),分的高位清0
? ? ? ? ? ? cout2<=1; ?//分向時(shí)進(jìn)1
? ? ? ? ? end
? ? ? ? else
? ? ? ? ? begin
? ? ? ? ? ? minh<=minh+1; ?//分高位不為5,繼續(xù)+1
? ? ? ? ? end
? ? ? end
? ? ? else
? ? ? ? ? begin
? ? ? ? ? minl<=minl+1;
? ? ? ? ? cout2<=0;
? ? ? ? ? end
? end
always@(posedge cout2 or posedge time_set_en) ? begin ? ?//檢測(cè)分向時(shí)的進(jìn)位
? ? if(time_set_en) ? ?//小時(shí)的設(shè)置
? ? ? begin
? ? ? ? hourh<=hourh_set;
? ? ? ? hourl<=hourl_set;
? ? ? end
? ? else if ((hourh==2)&&(hourl==3)) ?begin //小時(shí)的計(jì)數(shù)情況
? ? ? ? hourh<=0; ?//時(shí)高位清0
? ? ? ? hourl<=0; ?//時(shí)低位清0
? ? ? ? cout<=1; ? //向天進(jìn)位
? ? ? end
? ? else if (hourl==9) ?begin ?//時(shí)的低位為9
? ? ? ? hourl<=0; ? //時(shí)的低位清0
? ? ? ? if(hourh==2) ?//時(shí)高位為2時(shí)
? ? ? ? ? hourh<=0; ? //時(shí)的高位清0
? ? ? ? else
? ? ? ? ? hourh<=hourh+1; ?//時(shí)的高位不為2,高位繼續(xù)+1
? ? ? end
? ? else
? ? ? begin
? ? ? hourl<=hourl+1; ?//都不滿(mǎn)足,時(shí)的低位繼續(xù)+1
? ? ? cout<=0;
? ? ? end
? ?end
endmodule

5)時(shí)間設(shè)置模塊time_set

時(shí)間設(shè)置模塊time_set的主要功能是對(duì)當(dāng)前時(shí)間的時(shí)、分和秒進(jìn)行調(diào)整,可以實(shí)現(xiàn)指定數(shù)碼管時(shí)間的更改,并將更改后的時(shí)間用于正常時(shí)間的更新。

當(dāng)time_set_en高電平有效時(shí),可以對(duì)當(dāng)前時(shí)間進(jìn)行調(diào)整,每按一下key2,位選擇信號(hào)time_display就會(huì)進(jìn)行+1,改變此時(shí)的值,當(dāng)time_display=O時(shí),對(duì)小時(shí)高位進(jìn)行調(diào)整;當(dāng)time_display=1時(shí),對(duì)小時(shí)低位進(jìn)行調(diào)整。依次類(lèi)推,直到對(duì)時(shí)、分、秒的高位和低位都調(diào)整完畢為止。

?? 其中,當(dāng)前數(shù)字的+1操作,是通過(guò)按鍵key3實(shí)現(xiàn)的,每按一次key3,就會(huì)在小時(shí)高位上+1,選擇不同的數(shù)碼管時(shí),就會(huì)在對(duì)應(yīng)的數(shù)碼管上+1。 在time_set模塊中,

加入了當(dāng)前數(shù)字的清0操作,在進(jìn)行數(shù)字+1時(shí),首先判斷標(biāo)志位flag2,當(dāng)標(biāo)志位為真時(shí),清空當(dāng)前的數(shù)碼管。

程序如下所示:

//key2:在某種功能的條件下,各種設(shè)置位的選擇信號(hào)
//key3:在設(shè)置位有效的條件下,對(duì)設(shè)置位進(jìn)行加1操作
//time_set_en:時(shí)間設(shè)置使能信號(hào)
//hourh_set,hourl_set,minh_set,minl_set,sech_set,secl_set:設(shè)置后的小時(shí)、分和秒
//time_display:設(shè)置中的數(shù)碼管選擇 ? 6個(gè)
module time_set(
? ? ? input key2, ? ? ?//各種設(shè)置位的選擇信號(hào)
? ? ? input key3, ? ? ?//+1
? ? ? input key4, ? ? ?//當(dāng)前數(shù)碼管,清0
? ? ? input time_set_en, ?//時(shí)間設(shè)置使能信號(hào)
? ? ? output reg [3:0] hourh_set, ? //設(shè)置后的小時(shí)、分和秒
? ? ? output reg [3:0] hourl_set,
? ? ? output reg [3:0] minh_set,
? ? ? output reg [3:0] minl_set,
? ? ? output reg [3:0] sech_set,
? ? ? output reg [3:0] secl_set,
? ? ? output reg [2:0] time_display ?//設(shè)置中的數(shù)碼管選擇 6個(gè)
);
reg flag2; ? //通過(guò)標(biāo)志位清0
always @(posedge key4) ? ?//每次檢測(cè)key4的按下,進(jìn)行標(biāo)志位翻轉(zhuǎn)
begin
? ? flag2 = ~flag2;
end
always@(posedge key2)
? ? ? begin
? ? ? if(time_set_en)
? ? ? ? ? ? begin ? ? ? ? //6個(gè)數(shù)碼管選擇
? ? ? ? ? ? if(time_display<5) ? //時(shí)、分、秒6位分別選擇
? ? ? ? ? ? ? ? ? time_display<=time_display+1;
? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? time_display<=0;
? ? ? ? ? ? end
? ? ? end
always@(posedge key3) ? //按下按鍵key3
? ? ? begin
? ? ? ? ? ? if (time_set_en)
? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? case(time_display)
? ? ? ? ? ? ? ? ? 3'b000: ? //設(shè)置小時(shí)高位
? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? if (flag2) ? //通過(guò)標(biāo)志位,清0小時(shí)的高位
? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? hourh_set<=0;
? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? else if(hourh_set<2) ?//小時(shí)的高位最大為2
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? hourh_set<=hourh_set+1; ?//+1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? hourh_set<=0;
? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? 3'b001: ? //設(shè)置小時(shí)低位
? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? if (flag2) ? //通過(guò)標(biāo)志位,清0小時(shí)的低位
? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? hourl_set<=0;
? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? else if(hourl_set<9) ?//小時(shí)的低位最大為9
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? hourl_set<=hourl_set+1;
? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? hourl_set<=0;
? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? 3'b010: ? //設(shè)置分高位
? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? if (flag2) ? //通過(guò)標(biāo)志位,清0分的高位
? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?minh_set<=0;
? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? else if(minh_set<5) ?//分的高位最大為5
? ? ? ? ? ? ? ? ?minh_set<=minh_set+1;
? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ?     minh_set<=0;
? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? 3'b011: ? //設(shè)置分低位
? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? if (flag2) ? //通過(guò)標(biāo)志位,清0分的低位
? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? minl_set<=0;
? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? else if(minl_set<9) ?//分的低位最大為9
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? minl_set<=minl_set+1;
? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? minl_set<=0;
? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? 3'b100: ? //設(shè)置秒高位
? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? if (flag2) ? //通過(guò)標(biāo)志位,清0秒的高位
? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sech_set<=0;
? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? else if(sech_set<5) ?//秒的高位最大為5
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sech_set<=sech_set+1;
? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sech_set<=0;
? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? 3'b101: ? ? //設(shè)置秒低位
? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? if (flag2) ? //通過(guò)標(biāo)志位,清0秒的低位
? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? secl_set<=0;
? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? else if(secl_set<9) ?//秒的低位最大為9
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? secl_set<=secl_set+1;
? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? secl_set<=0;
? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? endcase
? ? ? ? ? ? end
? ? ? end
endmodule

6)時(shí)間動(dòng)態(tài)掃描位選模塊time_display_sel

時(shí)間動(dòng)態(tài)掃描位選模塊time_display_sel主要實(shí)現(xiàn)分時(shí)顯示時(shí)間數(shù)據(jù),通過(guò)一個(gè)高頻的時(shí)鐘信號(hào)clk1k對(duì)數(shù)據(jù)進(jìn)行分時(shí)傳送,即將時(shí)、分、秒的高位和低位6個(gè)數(shù)據(jù)傳送給對(duì)應(yīng)時(shí)、分、秒的高位或低位的數(shù)碼管進(jìn)行顯示。同時(shí),在設(shè)置時(shí)間時(shí),設(shè)置一個(gè)較低的時(shí)鐘信號(hào)clk200,用于掃描單個(gè)數(shù)碼管顯示,以示區(qū)分。

在此處,應(yīng)該注意的是,正常顯示時(shí)間信息時(shí),為了能夠同時(shí)看到時(shí)、分、秒,要求高頻的時(shí)鐘頻率大于人眼的分辨率。但是也不能太高,時(shí)鐘頻率太高,會(huì)使數(shù)碼管虛亮,這時(shí)看到數(shù)碼管顯示的信息均為“8”,不能正確顯示信息;同時(shí)也不能太低,時(shí)鐘頻率太低,會(huì)產(chǎn)生閃爍現(xiàn)象,甚至不能同時(shí)看到時(shí)、分、秒的信息。

所以,高頻采用的是1kHz的時(shí)鐘信號(hào)。在進(jìn)行時(shí)間設(shè)置時(shí),要求時(shí)、分、秒是單個(gè)數(shù)碼管顯示的,因此采用的時(shí)鐘信號(hào)頻率是200Hz。在不同的使能信號(hào)之下,進(jìn)入不同的模式時(shí),便會(huì)使用不同的時(shí)鐘信號(hào)進(jìn)行顯示。

程序如下所示:

//clk1k:對(duì)時(shí)、分、秒的數(shù)據(jù)進(jìn)行分時(shí)傳送的時(shí)鐘信號(hào)

//clk200:用于閃爍的時(shí)鐘信號(hào)

//time_en:時(shí)間正常工作使能

//time_set_en:時(shí)間設(shè)置使能

//time_display:時(shí)間設(shè)置時(shí)的同步信號(hào),對(duì)位進(jìn)行閃爍顯示控制

//time_display_sel:動(dòng)態(tài)掃描位選輸出信號(hào)



module time_display_sel( ? ? ?

? ? ? input clk1k, ?//對(duì)時(shí)、分、秒的數(shù)據(jù)進(jìn)行分時(shí)傳送的時(shí)鐘信號(hào)

? ? ? input clk200, ? //閃爍的時(shí)鐘信號(hào)

? ? ? input time_en, ?//時(shí)間正常工作使能

? ? ? input time_set_en, ?//時(shí)間設(shè)置使能

? ? ? input stopwatch_en,

? ? ? input alarm_clock_en,

? ? ? input [2:0] alarm_clock_display,

? ? ? input [2:0] time_display, ?//根據(jù)數(shù)碼管的選擇位置,進(jìn)行閃爍顯示控制

? ? ? output reg [5:0] time_display_sel ?); //動(dòng)態(tài)掃描位選輸出信號(hào)(6位)

reg clk0; ? reg [2:0] sel; ? ? reg [2:0] time_sel;

always@(posedge clk1k) ? begin ?//分時(shí)傳送掃描

? ? ? ? ? ? if(time_sel<5) ? //6位數(shù)碼管 ?

? ? ? ? ? ? ? ? ? time_sel<=time_sel+1;

? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? time_sel<=0;

? ? ? end

//掃描時(shí)鐘的選擇

always@(time_en or time_set_en or clk1k or clk200

? ? ? ? ? ? ? ? ? ? ? ? or stopwatch_en or alarm_clock_en) begin

? ? ? ? ? ? if(time_en) ? begin ? //正常顯示時(shí)間信息時(shí),選擇1kHz的掃描時(shí)鐘 ?快一些

? ? ? ? ? ? ? ? ? ? ? ? clk0<=clk1k;

? ? ? ? ? ? ? ? ? ? ? ? sel<=time_sel;

? ? ? ? ? ? ? ? ? end

//設(shè)置調(diào)整時(shí)間信息時(shí),選擇200Hz的掃描時(shí)鐘 ? 慢一些

? ? ? ? ? ? else ?if(time_set_en) ? begin ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? clk0<=clk200;

? ? ? ? ? ? ? ? ? ? ? ? sel<=time_display; ? //選擇的單個(gè)數(shù)碼管

? ? ? ? ? ? ? ? ? end

? ? ? ? ? ? else if(stopwatch_en) begin ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? clk0<=clk1k;

? ? ? ? ? ? ? ? ? ? ? ? sel<=time_sel;

? ? ? ? ? ? ? ? ? end

? ? ? ? ? ? else if(alarm_clock_en) ?begin ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? clk0<=clk200;

? ? ? ? ? ? ? ? ? ? ? ? sel<=alarm_clock_display;

? ? ? ? ? ? ? ? ? end ? ? ? ? ? ?

? ? ? end

//為時(shí)、分、秒的高位和低位數(shù)據(jù)進(jìn)行動(dòng)態(tài)位選擇

always@(posedge clk0) ?begin ?

? ? ? ? ? ? case(sel) ? ? //6位分別傳送給位控信號(hào)

? ? ? ? ? ? ? ? ? 3'b000: time_display_sel<=6'b100000;

? ? ? ? ? ? ? ? ? 3'b001: time_display_sel<=6'b010000;

? ? ? ? ? ? ? ? ? 3'b010: time_display_sel<=6'b001000;

? ? ? ? ? ? ? ? ? 3'b011: time_display_sel<=6'b000100;

? ? ? ? ? ? ? ? ? 3'b100: time_display_sel<=6'b000010;

? ? ? ? ? ? ? ? ? 3'b101: time_display_sel<=6'b000001;

? ? ? ? ? ? ? ? ? default: time_display_sel<=6'b000000;

? ? ? ? ? endcase

? ? ? end

endmodule

7)顯示模塊display

顯示模塊display主要完成正常時(shí)間、時(shí)間設(shè)置、秒表功能和鬧鐘設(shè)置的時(shí)間信息用數(shù)碼管進(jìn)行顯示。?

其中,在顯示不同模式的信息時(shí),采用的方法是取不同的使能信號(hào),當(dāng)使能信號(hào)為真的時(shí)候,索引當(dāng)前的位控信息,分別發(fā)送不同的段碼信息和位控信息,以實(shí)現(xiàn)在指定的數(shù)碼管上面顯示不同的時(shí)間信息。

需要注意的是,在顯示的時(shí)候,由于采用分模塊編寫(xiě)的思想,因此要引入各模塊的當(dāng)前數(shù)字時(shí)間信息,以實(shí)現(xiàn)不同的段碼信息輸出。

程序如下所示:

//display_data:譯碼后的數(shù)據(jù),送給數(shù)碼管顯示

//display_sel:數(shù)碼管的動(dòng)態(tài)掃描位選擇信號(hào)

module display (

? input time_en, ? ? ?//時(shí)間正常工作使能

? input time_set_en, ? ?//時(shí)間設(shè)置使能信號(hào)

? input stopwatch_en, ? ?//秒表使能信號(hào)

? input alarm_clock_en, ? ?//鬧鐘的使能信號(hào)

? input [5:0] time_display_sel, ? ?//動(dòng)態(tài)掃描位選輸出信號(hào)(6位)

? input [3:0] hourh, ? ?//顯示正常時(shí)間的 時(shí)、分、秒、百分秒的高低位

? input [3:0] hourl,

? input [3:0] minh,

? input [3:0] minl,

? input [3:0] sech,

? input [3:0] secl,

? input [3:0] s100minh, ? //顯示秒表的分,秒,百分秒

? input [3:0] s100minl,

? input [3:0] s100sech,

? input [3:0] s100secl,

? input [3:0] s100h,

? input [3:0] s100l,

? input ?[3:0] alarm_hourh_set, ? //設(shè)置后的小時(shí)、分和秒

? input ?[3:0] alarm_hourl_set,

? input ?[3:0] alarm_minh_set,

? input ?[3:0] alarm_minl_set,

? input ?[3:0] alarm_sech_set,

? input ?[3:0] alarm_secl_set,

? output reg ?[5:0] display_sel, ? //數(shù)碼管的動(dòng)態(tài)掃描位選擇信號(hào)

? output reg ?[6:0] display_data ?//譯碼后的數(shù)據(jù),送給數(shù)碼管顯示

);

reg [3:0] data; ? //4位二進(jìn)制,保存時(shí)鐘每一位的數(shù)字情況

always@(time_en or time_set_en or stopwatch_en or alarm_clock_en or

? ? ? ? ? time_display_sel ? or display_sel or

? ? ? ? ? ?hourh or hourl or minh or minl or sech or secl or

? ? ? ? ? s100minh or s100minl ?or s100sech or s100secl or s100h or s100l ) begin

? ? if((time_en==1) || (time_set_en==1)) ? begin ?//正常時(shí)間和設(shè)定時(shí)間顯示

? ? ? ? display_sel<=time_display_sel;

? ? ? ? case(time_display_sel) ? ? ?//6位數(shù)碼管

? ? ? ? ? ? 6'b100000:data<=hourh;

? ? ? ? ? ? 6'b010000:data<=hourl;

? ? ? ? ? ? 6'b001000:data<=minh;

? ? ? ? ? ? 6'b000100:data<=minl;

? ? ? ? ? ? 6'b000010:data<=sech;

? ? ? ? ? ? 6'b000001:data<=secl;

? ? ? ? ? ?default:data<=4'b0;

? ? ? ? endcase

? ? ? end

? ? else if(stopwatch_en==1) ? ? ? //秒表的時(shí)間顯示

? ? ? begin

? ? ? ? display_sel<=time_display_sel;

? ? ? ? case(time_display_sel)

? ? ? ? ? ? 6'b100000:data<=s100minh;

? ? ? ? ? ? 6'b010000:data<=s100minl;

? ? ? ? ? ? 6'b001000:data<=s100sech;

? ? ? ? ? ? 6'b000100:data<=s100secl;

? ? ? ? ? ? 6'b000010:data<=s100h;

? ? ? ? ? ? 6'b000001:data<=s100l;

? ? ? ? ? ? default:data<=4'b0;

? ? ? ? endcase

? ? ? end

? ? else if(alarm_clock_en) ? ? ? ?//鬧鐘的設(shè)置時(shí)間顯示

? ? ? begin

? ? ? ? display_sel <= time_display_sel;

? ? ? ? case(time_display_sel)

? ? ? ? ? ? 6'b100000:data<=alarm_hourh_set;

? ? ? ? ? ? 6'b010000:data<=alarm_hourl_set;

? ? ? ? ? ? 6'b001000:data<=alarm_minh_set;

? ? ? ? ? ? 6'b000100:data<=alarm_minl_set;

? ? ? ? ? ? 6'b000010:data<=alarm_sech_set;

? ? ? ? ? ? 6'b000001:data<=alarm_secl_set;

? ? ? ? ? ? default:data<=4'b0;

? ? ? ? endcase

? ? ? end

? ? case(data) ? ? ? ? ?//數(shù)碼管的8位譯碼情況 ?,采用共陽(yáng)極輸出 ?

? ? ? ? ?4'b0000:display_data<= ~7'b1111110; //數(shù)字0

? ? ? ? ?4'b0001:display_data<= ~7'b0110000; //數(shù)字1

? ? ? ? ?4'b0010:display_data<= ~7'b1101101; //數(shù)字2

? ? ? ? ?4'b0011:display_data<= ~7'b1111001; //數(shù)字3

? ? ? ? ?4'b0100:display_data<= ~7'b0110011; //數(shù)字4

? ? ? ? ?4'b0101:display_data<= ~7'b1011011; //數(shù)字5

? ? ? ? ?4'b0110:display_data<= ~7'b1011111; //數(shù)字6

? ? ? ? ?4'b0111:display_data<= ~7'b1110000; //數(shù)字7

? ? ? ? ?4'b1000:display_data<= ~7'b1111111; //數(shù)字8

? ? ? ? ?4'b1001:display_data<= ~7'b1111011; //數(shù)字9

? ? ? ? ?default:display_data<= ~7'b0; //數(shù)字0

? ? endcase

? end

endmodule

8)秒表模塊stop_watch

在實(shí)際中,在此假設(shè)秒表功能需要顯示分、秒和十分秒,所以這里就需要有實(shí)現(xiàn)百分秒功能的時(shí)鐘信號(hào)clk10,用與時(shí)間正常顯示模塊相同的計(jì)數(shù)方法,分別實(shí)現(xiàn)十分秒向秒的進(jìn)位計(jì)數(shù),秒向分的進(jìn)位計(jì)數(shù),進(jìn)而完成秒表功能。

在秒表功能實(shí)現(xiàn)中,加入標(biāo)志位flag3,并與按鍵key2進(jìn)行綁定,當(dāng)按鍵按下的時(shí)候,此時(shí)的十分秒將會(huì)停止計(jì)數(shù),實(shí)現(xiàn)暫停的效果,再次按下按鍵,會(huì)繼續(xù)進(jìn)行計(jì)數(shù)。并且在每一個(gè)計(jì)數(shù)中,加入標(biāo)志位flag2并與按鍵key4進(jìn)行綁定,當(dāng)按鍵按下的時(shí)候,此時(shí)所有的數(shù)碼管的計(jì)數(shù)值將會(huì)清0

另外,在此說(shuō)明,由于在原開(kāi)發(fā)板上面進(jìn)行秒表功能實(shí)現(xiàn)的時(shí)候,時(shí)鐘信號(hào)clk10會(huì)與其他的時(shí)鐘信號(hào)產(chǎn)生同步時(shí)序混疊的情況,始終無(wú)法解決這個(gè)問(wèn)題。因此,將秒表的功能移到另一塊開(kāi)發(fā)板上面實(shí)現(xiàn),其他的數(shù)碼管掃描模塊和顯示模塊均與原開(kāi)發(fā)板相同,具體說(shuō)明可見(jiàn)下文詳述。

程序如下所示:

//秒表顯 ? 分、秒、十分秒。

//clk10:秒表時(shí)鐘信號(hào)

// key2, ? ? ?//暫停和開(kāi)始計(jì)數(shù)按鍵 ? ?key4, ? ? ?//當(dāng)前數(shù)碼管,清0

// s10minl, ?//秒表的分的低位 ? s10sech, ?//秒表的秒的高位

// s10secl, ?//秒表的秒的低位

// ?s10 ? ? ? //秒表的十分秒

module stop_watch(

? ? ? input clk10, ? //秒表時(shí)鐘信號(hào)--0.1s

? ? ? input key2, ? ? ?//暫停和開(kāi)始計(jì)數(shù)按鍵

? ? ? input key4, ? ? ?//當(dāng)前數(shù)碼管,清0

? ? ? output reg [3:0] ?s10minl, ?//秒表的分的低位

? ? ? output reg [3:0] ?s10sech, ?//秒表的秒的高位

? ? ? output reg [3:0] ?s10secl, ?//秒表的秒的低位

? ? ? output reg [3:0] ?s10 ? ? ? //秒表的十分秒

);

reg count1,cout2; ? //進(jìn)位信號(hào)

reg flag3; ? //兩個(gè)按鍵的標(biāo)志位

reg flag2; ?

always @(posedge key2) ? ?//每次檢測(cè)key3的按下,暫停和開(kāi)始

begin

? ? flag3 = ~flag3;

end

always @(posedge key4) ? ?//每次檢測(cè)key4,用于進(jìn)行清0操作

begin

? ? flag2 = ~flag2;

end

always@(posedge clk10 ?or posedge flag2) //十分秒的計(jì)數(shù) ?

begin

? ? ? if (flag2)

? ? ? ? ? ? begin

? ? ? ? ? ? s10<=0;

? ? ? ? ? ? end

? ? ? else if (s10==9) ? //十分秒到9時(shí)

? ? ? ? ? ? ? ? ? begin

? ? ? ? ? ? ? ? ? count1<=1; ?//十分秒進(jìn)位到1s

? ? ? ? ? ? ? ? ? s10<=0; ?

? ? ? ? ? ? ? ? ? end

? ? ? ? ? ? else if (flag3) ? ?//檢測(cè)按鍵的標(biāo)志位,實(shí)現(xiàn)暫停

? ? ? ? ? ? ? ? ? begin

? ? ? ? ? ? ? ? ? s10<=s10+1; ?//高位沒(méi)到時(shí),繼續(xù)+1

? ? ? ? ? ? ? ? ? count1<=0;

? ? ? ? ? ? ? ? ? end

end

always@(posedge count1 or posedge flag2) ? //秒的計(jì)數(shù)情況

begin ? ?

? ? ? if (flag2)

? ? ? begin

? ? ? ? ? ? s10secl<=0;

? ? ? ? ? ? s10sech<=0;

? ? ? end

? ? ? else if (s10secl==9) ?//秒的低位為9時(shí)

? ? ? ? ? ? begin

? ? ? ? ? ? s10secl<=0; ? ? //秒低位清0

? ? ? ? ? ? if (s10sech==5) ? //秒高位為5時(shí)

? ? ? ? ? ? ? ? ? begin

? ? ? ? ? ? ? ? ? s10sech<=0; ? //秒的低位為9,秒的高位為5時(shí),秒的高位清0

? ? ? ? ? ? ? ? ? cout2<=1; ?//秒向分進(jìn)1

? ? ? ? ? ? ? ? ? end

? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? begin

? ? ? ? ? ? ? ? ? s10sech<=s10sech+1; ?//秒高位不為5,繼續(xù)+1

? ? ? ? ? ? ? ? ? end

? ? ? ? ? ? end

? ? ? else ? ?

? ? ? ? ? ? begin

? ? ? ? ? ? s10secl<=s10secl+1; ?//秒低位不為9,繼續(xù)+1

? ? ? ? ? ? cout2<=0;

? ? ? ? ? ? end ? ? ? ? ?

end ? ?

always@(posedge cout2 or posedge flag2) ?//檢測(cè)秒向分的進(jìn)位

begin ?

? ? ? if (flag2)

? ? ? ? ? ? begin

? ? ? ? ? ? s10minl<=0;

? ? ? ? ? ? end

? ? ? else ?if (s10minl==9) ? ? ? //分低位計(jì)數(shù)情況

? ? ? ? ? ? begin

? ? ? ? ? ? s10minl<=0; ? ? ? ? ?//分低位清0

? ? ? ? ? ? end

? ? ? else

? ? ? ? ? ? begin

? ? ? ? ? ? s10minl<=s10minl+1;

? ? ? ? ? ? end

end

endmodule

9)鬧鐘模塊alarm_clock

鬧鐘模塊主要完成鬧鐘的時(shí)間設(shè)置及鬧鐘時(shí)間到后的提示。鬧鐘模塊具體的設(shè)置時(shí)間的方法與時(shí)間設(shè)置模塊time_set相同,均采用key2的按鍵疊加檢測(cè)到不同的數(shù)碼管,然后當(dāng)key3按下的時(shí)候,當(dāng)前數(shù)碼管的數(shù)字將會(huì)+1,實(shí)現(xiàn)可以調(diào)節(jié)時(shí)間的功能。同時(shí),鬧鐘設(shè)置時(shí)間與正常時(shí)間相等時(shí)會(huì)產(chǎn)生一個(gè)提示信號(hào)alarm,此信號(hào)持續(xù)60s的時(shí)間,可以將這個(gè)信號(hào)接到蜂鳴器上,用于聲音提示。在本實(shí)驗(yàn)的開(kāi)發(fā)板中,我們利用燈的亮起來(lái)近似替代。

程序如下所示:

//alarm_clock_en:鬧鐘的使能信號(hào)

//alarm:鬧鐘時(shí)間到的提示信號(hào)

//alarm_clock_display_sel:鬧鐘顯示的同步信號(hào)

module alarm_clock(

? ? ? input clk1k, ? ?//計(jì)時(shí)60s的時(shí)鐘信號(hào)

? ? ? input alarm_clock_en, ? //鬧鐘的使能信號(hào)

? ? ? input key2, ? //時(shí)、分、秒高低位依次選擇

? ? ? input key3, ? //+1

? ? ? input [3:0] hourh, ? //鬧鐘的時(shí)、分、秒高低位

? ? ? input [3:0] hourl,

? ? ? input [3:0] minh,

? ? ? input [3:0] minl,

? ? ? input [3:0] sech,

? ? ? input [3:0] secl,

? ? ? output reg [3:0] alarm_hourh_set, ? //設(shè)置后的小時(shí)、分和秒

? ? ? output reg [3:0] alarm_hourl_set,

? ? ? output reg [3:0] alarm_minh_set,

? ? ? output reg [3:0] alarm_minl_set,

? ? ? output reg [3:0] alarm_sech_set,

? ? ? output reg [3:0] alarm_secl_set,

? ? ? output reg [2:0] alarm_clock_display, ? //位選的控制信號(hào)

? ? ? output reg alarm ?); ? ?//鬧鐘時(shí)間到的提示信號(hào)

//鬧鐘信號(hào)提醒---計(jì)時(shí)60s ? ? 不進(jìn)行秒的比對(duì),只比對(duì)一分鐘 ? //只比較時(shí)、分四位

always@(hourh or hourl or minh or minl or sech or secl or alarm_hourh_set or

? ? ? alarm_hourl_set or alarm_minh_set or

? ? ? alarm_minl_set or alarm_sech_set or alarm_secl_set) ?begin

? ? ? if((alarm_minl_set==minl)&&(alarm_hourh_set==hourh)

? ? ? ? ?&&(alarm_hourl_set==hourl)&&(alarm_minh_set==minh)) ?

? ? ? ? ? ? ? ? ? alarm<=0; ? ? ? ? //當(dāng)前時(shí)間與設(shè)定的鬧鐘時(shí)間相等,發(fā)送高電平 ? ?

? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? alarm<=1; ? ? ? ? ? ?

end

always@(posedge key2) ? ? //對(duì)時(shí)、分、秒的高位和低位進(jìn)行選擇

? ? ? begin

? ? ? ? ? ? if(alarm_clock_en)

? ? ? ? ? ? ? ? ? begin

? ? ? ? ? ? ? ? ? if(alarm_clock_display<5) ?//6位選擇

? ? ? ? ? ? ? ? ? ? ? ? alarm_clock_display<=alarm_clock_display+1;

? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? alarm_clock_display<=0;

? ? ? ? ? ? ? ? ? end

? ? ? end

always@(posedge key3) ? ? //對(duì)時(shí)、分、秒的高位和低位進(jìn)行調(diào)整

? ? ? begin

? ? ? ? ?if (alarm_clock_en)

? ? ? ? ? ? begin

? ? ? ? ? ? ? ? ? case(alarm_clock_display) ?

? ? ? ? ? ? ? ? ? ? ? ? 3'b000: ?//調(diào)整小時(shí)高位

? ? ? ? ? ? ? ? ? ? ? ? begin

? ? ? ? ? ? ? ? ? ? ? ? if(alarm_hourh_set<2) ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? alarm_hourh_set<=alarm_hourh_set+1;

? ? ? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? alarm_hourh_set<=0;

? ? ? ? ? ? ? ? ? ? ? ? end

? ? ? ? ? ? ? ? ? ? ? ? 3'b001: ?//調(diào)整小時(shí)低位

? ? ? ? ? ? ? ? ? ? ? ? begin

? ? ? ? ? ? ? ? ? ? ? ? if(alarm_hourl_set<9)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? alarm_hourl_set<=alarm_hourl_set+1;

? ? ? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? alarm_hourl_set<=0;

? ? ? ? ? ? ? ? ? ? ? ? end

? ? ? ? ? ? ? ? ? ? ? ? 3'b010: ?//調(diào)整分高位

? ? ? ? ? ? ? ? ? ? ? ? begin

? ? ? ? ? ? ? ? ? ? ? ? if(alarm_minh_set<5)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? alarm_minh_set<=alarm_minh_set+1;

? ? ? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? alarm_minh_set<=0;

? ? ? ? ? ? ? ? ? ? ? ? end

? ? ? ? ? ? ? ? ? ? ? ? 3'b011: ?//調(diào)整分低位

? ? ? ? ? ? ? ? ? ? ? ? begin

? ? ? ? ? ? ? ? ? ? ? ? if(alarm_minl_set<9)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? alarm_minl_set<=alarm_minl_set+1;

? ? ? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? alarm_minl_set<=0;

? ? ? ? ? ? ? ? ? ? ? ? end

? ? ? ? ? ? ? ? ? ? ? ? 3'b100: ?//調(diào)整秒高位

? ? ? ? ? ? ? ? ? ? ? ? begin

? ? ? ? ? ? ? ? ? ? ? ? if(alarm_sech_set<5)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? alarm_sech_set<=alarm_sech_set+1;

? ? ? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? alarm_sech_set<=0;

? ? ? ? ? ? ? ? ? ? ? ? end

? ? ? ? ? ? ? ? ? ? ? ? 3'b101: ?//調(diào)整秒低位

? ? ? ? ? ? ? ? ? ? ? ? begin

? ? ? ? ? ? ? ? ? ? ? ? if(alarm_secl_set<9)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? alarm_secl_set<=alarm_secl_set+1; ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? alarm_secl_set<=0;

? ? ? ? ? ? ? ? ? ? ? ? end

? ? ? ? ? ? ? ? ? endcase

? ? ? ? ? ? end

? ? ? end

endmodule

10)多功能數(shù)字鐘的頂層設(shè)計(jì)clock_demo

多功能數(shù)字鐘的頂層設(shè)計(jì)主要的目的是將上述的所有功能模塊進(jìn)行例化,連接所有的功能模塊,保證其模塊之間的正常工作。

clock_demo模塊中,首先將四個(gè)按鍵進(jìn)行例化和輸出,用于下列的各個(gè)模塊按鍵使用。之后,時(shí)鐘例化time_div,導(dǎo)入開(kāi)發(fā)板硬件時(shí)鐘clk,完成四種其他時(shí)鐘的生成。之后,功能控制例化control,導(dǎo)入key1按鍵,用于控制四種功能模式。之后,進(jìn)行時(shí)間設(shè)置例化time_timeset,對(duì)于此模塊,我將時(shí)間計(jì)數(shù)和時(shí)間設(shè)置模塊進(jìn)行合并,以最初實(shí)現(xiàn)正常的數(shù)字時(shí)鐘功能,輸出此時(shí)的計(jì)數(shù)數(shù)字值。之后,數(shù)碼管動(dòng)態(tài)掃描例化time_display_sel,顯示模塊例化display,對(duì)應(yīng)于四種功能模式下,數(shù)碼管的顯示掃描輸出相應(yīng)的控制信息,與后續(xù)的display模塊配合,將對(duì)應(yīng)的數(shù)字段碼值進(jìn)行輸出。其間,在display模塊中,需要導(dǎo)入正常顯時(shí)、秒表時(shí)間、鬧鐘時(shí)間,實(shí)現(xiàn)段碼值display_data輸出到數(shù)碼管。例化正常時(shí)間計(jì)數(shù)模塊time_count主要完成數(shù)碼管中間兩個(gè)小點(diǎn)的輸出。最后,秒表例化和鬧鐘模塊例化stopwatchalarm_clock,秒表導(dǎo)出此時(shí)的計(jì)時(shí)情況,鬧鐘模塊需要導(dǎo)入正常的時(shí)間,輸出鬧鐘設(shè)置的時(shí)間,二者比較,輸出提醒信號(hào)alarm。

在整個(gè)模塊例化的過(guò)程中,可以看到需要很多信號(hào)的輸入和輸出,在FPGA中,實(shí)現(xiàn)各個(gè)模塊的信號(hào)連接的方式是布線(xiàn)wire,通過(guò)將所需要的輸入和輸出信號(hào)進(jìn)行其他名稱(chēng)的布線(xiàn),在連接輸出信號(hào)時(shí),此時(shí)布線(xiàn)其他的信號(hào),可以實(shí)現(xiàn)輸入。此外,如何判斷信號(hào)是輸入還是輸出,與各個(gè)模塊在編寫(xiě)時(shí)的inputoutput信號(hào)相關(guān),應(yīng)該特別注意分辨。

程序如下所示:

//1、具有基本走時(shí)功能,時(shí)間范圍是00:00:00~23:59:59。

//2、具有暫停計(jì)時(shí)和清零功能。

//3、具有調(diào)節(jié)時(shí)間功能。

//4、鬧鐘功能,定時(shí)時(shí)間可調(diào),并具有到時(shí)1min的提醒功能。

//5、秒表功能,由于同步時(shí)鐘的問(wèn)題,在另一塊開(kāi)發(fā)板上面完成。

module clock_demo(

? ? input clk,

? ? input key1, ?//時(shí)間正常顯示、時(shí)間設(shè)置、秒表、鬧鐘功能四種功能模式

? ? input key2, ?//時(shí)間設(shè)置和鬧鐘時(shí)間設(shè)置的時(shí)候,選擇不同的數(shù)碼管

? ? input key3, ?//時(shí)間設(shè)置時(shí)的數(shù)字+1操作

? ? input key4, ?//暫停正常顯示 ?當(dāng)前數(shù)碼管清0

? ? output alarm, ? //鬧鐘到時(shí)間的提醒信號(hào)

? ? output [6:0] display_data, ? //7段數(shù)碼管的譯碼

? ? output [5:0] display_sel, ? //掃描6位數(shù)碼管

? ? output two_points ? ? ?//輸出數(shù)碼管中間的兩個(gè)小點(diǎn),1s閃爍

? ? //output day_clk, ?//天數(shù)+1的信號(hào)

);

wire clk1k_1,clk200_1,clk100_1,clk1_1; ? //時(shí)鐘信號(hào)布線(xiàn)

wire t_en,t_s_en,sw_en,ac_en; ? //四種功能控制布線(xiàn)

wire [3:0] hh,hl,mh,ml,sh,sl, ? ? ?

? ? ? ? hourh,hourl,minh,minl,sech,secl, ?

? ? ? ? s100mh,s100ml,s100sh,s100sl,s100h_1,s100l_1,

? ? ? ? aahh,aahl,aamh,aaml,aash,aasl; ?//時(shí)間設(shè)置、秒表布線(xiàn)

wire [2:0] t_d; ?

wire [5:0] a_d_s,t_d_s;

key_db ? ?key_db_i1( ?// 按鍵去抖動(dòng)信號(hào) 1 ?

? ?.clk ? ?(clk),

? ?.key_i ? ?(key1),

? ?.key_db_o ? ? (key_db1) ? ?

);

key_db ? ?key_db_i2( ?// 按鍵去抖動(dòng)信號(hào) 2 ?

? ?.clk ? ?(clk),

? ?.key_i ? ?(key2),

? ?.key_db_o ? ? (key_db2) ? ?

);

key_db ? ?key_db_i3( ?// 按鍵去抖動(dòng)信號(hào) 3

? ?.clk ? ?(clk),

? ?.key_i ? ?(key3),

? ?.key_db_o ? ? (key_db3) ? ?

);

key_db ? ?key_db_i4( ?// 按鍵去抖動(dòng)信號(hào) 4

? ?.clk ? ?(clk),

? ?.key_i ? ?(key4),

? ?.key_db_o ? ? (key_db4) ? ?

);

//時(shí)鐘例化,為各選擇、顯示等等顯示時(shí)鐘

time_div #( )

time_div( ?

? ? .clk(clk), ?//clk:系統(tǒng)基準(zhǔn)時(shí)鐘 ?27MHZ

? ? .clk1k(clk1k_1), ? ?//clk1k:動(dòng)態(tài)掃描時(shí)鐘信號(hào) ?1kHZ

? ? .clk200(clk200_1), ? //clk200:閃爍時(shí)鐘信號(hào) ?200HZ

? ? .clk100(clk100_1), ?//clk100:秒表--時(shí)鐘信號(hào) ?100HZ,百分秒

? ? .clk1(clk1_1) ?); ? ? ?//clk1:秒--時(shí)鐘信號(hào) ?1HZ=1s



//功能控制例化

control #( )

control (

? ? .key1(key_db1), ? //key1:功能選擇按鍵,有4種功能

? ? .time_en(t_en), ? //time_en:時(shí)間正常工作使能

? ? .time_set_en(t_s_en), ?//time_set_en:時(shí)間設(shè)置使能

? ? .stopwatch_en(sw_en), ? //stopwatch_en:秒表使能

? ? .alarm_clock_en(ac_en) ?); ? ?//alarm_clock_en:鬧鐘顯示及調(diào)整使能

//時(shí)間設(shè)置例化

time_timeset #( )

time_timeset (

? ? .clk(clk),

? ? .clk1(clk1_1), ? //1s

? ? .key2(key_db2), ? ?//設(shè)置的時(shí)候,進(jìn)行移位操作,選擇不同的數(shù)碼管

? ? .key3(key_db3), ? ?//數(shù)字+1操作

? ? .key4(key_db4), ? ?//暫停時(shí)間正常顯示

? ? .time_en(t_en), ? ?//control模塊--時(shí)間正常工作使能

? ? .time_set_en(t_s_en), ? //時(shí)間設(shè)置使能

? ? .alarm_clock_en(ac_en),

? ? .hourh(hh), ? ?//小時(shí)、分和秒(分別兩位)設(shè)置

? ? .hourl(hl),

? ? .minh(mh),

? ? .minl(ml),

? ? .sech(sh),

? ? .secl(sl),

? ? .day_clk(day_clk), ? ? ?//天數(shù)+1的信號(hào)

? ? .time_display(t_d), ? ?//閃爍顯示控制

? ? .two_points(two_points) ?);

//數(shù)碼管動(dòng)態(tài)掃描例化

time_display_sel #( )

time_display_sel (

? ? .clk1k(clk1k_1), ? ? ?

? ? .clk200(clk200_1), ?

? ? .time_en(t_en),

? ? .time_set_en(t_s_en),

? ? .stopwatch_en(sw_en),

? ? .alarm_clock_en(ac_en),

? ? .alarm_clock_display(a_d_s),

? ? .time_display(t_d),

? ? .time_display_sel(t_d_s) ? ?);

//顯示模塊例化

display #( )

display (

? ? .time_en(t_en), ? ? //四個(gè)使能信號(hào)

? ? .time_set_en(t_s_en),

? ? .stopwatch_en(sw_en),

? ? .alarm_clock_en(ac_en),

? ? .time_display_sel(t_d_s), ? //動(dòng)態(tài)掃描

? ? .hourh(hh), ? ?//正常時(shí)間的時(shí)、分、秒

? ? .hourl(hl),

? ? .minh(mh),

? ? .minl(ml),

? ? .sech(sh),

? ? .secl(sl),

? ? .s100minh(s100mh), ?//秒表的分的高位

? ? .s100minl(s100ml), ?//秒表的分的低位

? ? .s100sech(s100sh), ?//秒表的秒的高位

? ? .s100secl(s100sl), ?//秒表的秒的低位

? ? .s100h(s100h_1),

? ? .s100l(s100l_1),

? ? .alarm_hourh_set(aahh), ? //鬧鐘的時(shí)、分、秒高低位

? ? .alarm_hourl_set(aahl),

? ? .alarm_minh_set(aamh),

? ? .alarm_minl_set(aaml),

? ? .alarm_sech_set(aash),

? ? .alarm_secl_set(aasl),

? ? .display_sel(display_sel),

? ? .display_data(display_data) ? ?);

//對(duì)于此處的秒表功能,由于同步時(shí)鐘的問(wèn)題,在另一塊開(kāi)發(fā)板上面完成。

stopwatch #( )

stopwatch (

? ? .clk100(clk100_1), ? //秒表時(shí)鐘信號(hào)--0.01s

? ? .stopwatch_en(sw_en), ? //stopwatch_en:秒表使能信號(hào)

? ? .key2(key_db2), ? ?

? ? .key3(key_db3), ? ?

? ? .key4(key_db4), ? ?

? ? .s100minh(s100mh), ?//秒表的分的高位

? ? .s100minl(s100ml), ?//秒表的分的低位

? ? .s100sech(s100sh), ?//秒表的秒的高位

? ? .s100secl(s100sl), ?//秒表的秒的低位

? ? .s100h(s100h_1), ?//秒表的百分秒的高位

? ? .s100l(s100l_1) ?); ? ?//秒表的百分秒的低位

//時(shí)間正常顯示--直接引用time_count模塊即可

time_count #( )

time_count(

? ? .hourh(hourh), ? ?//正常時(shí)間的時(shí)、分、秒

? ? .hourl(hourl),

? ? .minh(minh),

? ? .minl(minl),

? ? .sech(sech),

? ? .secl(secl),

? ? .alarm_clock_en(ac_en) ? ); //鬧鐘使能,用于顯示兩個(gè)數(shù)碼管小點(diǎn)

//鬧鐘模塊例化

alarm_clock #( )

alarm_clock (

? ? .clk1k(clk1k_1), ? //掃描顯示同步時(shí)鐘

? ? .key2(key_db2), ? //移位數(shù)碼管

? ? .key3(key_db3), ? //數(shù)字+1

? ? .alarm_clock_en(ac_en), ? //鬧鐘的使能信號(hào)

? ? .hourh(hh), ? ?//小時(shí)、分和秒(分別兩位)設(shè)置

? ? .hourl(hl),

? ? .minh(mh),

? ? .minl(ml),

? ? .sech(sh),

? ? .secl(sl),

? ? .alarm_hourh_set(aahh), ? //鬧鐘的時(shí)、分、秒高低位

? ? .alarm_hourl_set(aahl),

? ? .alarm_minh_set(aamh),

? ? .alarm_minl_set(aaml),

? ? .alarm_sech_set(aash),

? ? .alarm_secl_set(aasl),

? ? .alarm_clock_display(a_d_s),

? ? .alarm(alarm) ? ?); ? ? //鬧鐘時(shí)間到的提示信號(hào)

endmodule

四、模塊調(diào)試和硬件下載測(cè)試

本程序進(jìn)行硬件下載測(cè)試的流程:

1、在高云軟件(Gowin V1.9.8.11 Education上面完成程序的編寫(xiě),同時(shí),雙擊按鈕Synthesize,保證此時(shí)在Message界面無(wú)錯(cuò)誤出現(xiàn),如果有錯(cuò)誤,需要參照錯(cuò)誤信息進(jìn)行更改。

基于高云FPGA開(kāi)發(fā)板的多功能數(shù)字時(shí)鐘,FPGA,fpga開(kāi)發(fā)

2、在FloorPlanner界面完成布線(xiàn),主要是將FPGA的管腳連接按鍵、數(shù)碼管、LED燈等外設(shè)。之后,雙擊按鈕Place &Route,保證此時(shí)在Message界面無(wú)錯(cuò)誤出現(xiàn),如果有錯(cuò)誤,需要參照錯(cuò)誤信息進(jìn)行更改。

基于高云FPGA開(kāi)發(fā)板的多功能數(shù)字時(shí)鐘,FPGA,fpga開(kāi)發(fā)

具體的布線(xiàn)情況如下:

端口

FPGA管腳

外設(shè)管腳

端口

FPGA管腳

外設(shè)管腳

display_sel[0]

29

DIG1

display_data[4]

39

E

display_sel[1]

30

DIG2

display_data[5]

40

F

display_sel[2]

31

DIG3

display_data[6]

41

G

display_sel[3]

32

DIG4

display_data[7]

42

DP

display_sel[4]

34

DIG1

key1

8

KEY1

display_sel[5]

35

DIG2

key2

9

KEY2

display_data[0]

31

A

key3

27

KEY3

display_data[1]

32

B

key4

28

KEY4

display_data[2]

34

C

clk

22

-

display_data[3]

35

D

alarm

47

LED1

two_points

48

L1/L2

3、雙擊Program Device,選擇Operation,將程序初步燒錄到SRAM區(qū),有時(shí)候在調(diào)試完成之后,為了避免程序掉電消失,可以燒錄到flash區(qū)。

?基于高云FPGA開(kāi)發(fā)板的多功能數(shù)字時(shí)鐘,FPGA,fpga開(kāi)發(fā)

4、在開(kāi)發(fā)板上面進(jìn)行觀(guān)察,查看具體的實(shí)物測(cè)試的結(jié)果,再根據(jù)具體的情況進(jìn)行調(diào)整。

模塊調(diào)試:

在本程序的調(diào)試中,分別對(duì)四個(gè)小模塊進(jìn)行調(diào)試和功能檢查,同時(shí),對(duì)整體的功能進(jìn)行聯(lián)調(diào),完成數(shù)字時(shí)鐘的設(shè)計(jì)。

1.時(shí)間正常顯示模塊調(diào)試:

在下面的數(shù)碼管顯示中,可以看到正常的秒計(jì)數(shù),在秒滿(mǎn)59之后,向分進(jìn)位,分滿(mǎn)59之后,向小時(shí)進(jìn)位,正常顯示時(shí)-分-秒,并且六位數(shù)碼管工作正常。同時(shí),在本功能中,當(dāng)按下按鍵key4時(shí),此時(shí)的計(jì)時(shí)停止,實(shí)現(xiàn)時(shí)間暫停。此模塊功能全部達(dá)到要求。

基于高云FPGA開(kāi)發(fā)板的多功能數(shù)字時(shí)鐘,FPGA,fpga開(kāi)發(fā)

2.時(shí)間設(shè)置模塊調(diào)試:

在下面的數(shù)碼管顯示中,當(dāng)選中第一位數(shù)碼管的時(shí)候,按下按鍵key3可以實(shí)現(xiàn)當(dāng)前的數(shù)碼管+1,同時(shí),按下按鍵key4,再按下按鍵key3可以實(shí)現(xiàn)當(dāng)前的數(shù)碼管清0,按下按鍵key2可以實(shí)現(xiàn)6位數(shù)碼管移位,直至對(duì)時(shí)-分-秒的高低位均可以實(shí)現(xiàn)時(shí)間設(shè)置。同時(shí),在時(shí)間設(shè)置完成之后,再次更換功能,將會(huì)更新時(shí)間顯示。此模塊功能全部達(dá)到要求。在此舉例調(diào)試,其他的數(shù)碼管均照此邏輯調(diào)試

基于高云FPGA開(kāi)發(fā)板的多功能數(shù)字時(shí)鐘,FPGA,fpga開(kāi)發(fā)

3.秒表模塊調(diào)試:

在下面的數(shù)碼管顯示中,當(dāng)按下按鍵key2時(shí),此時(shí)會(huì)進(jìn)行分-秒-十分秒的秒表計(jì)數(shù),按照正常的時(shí)間進(jìn)行走時(shí),同時(shí)在分?jǐn)?shù)碼管和秒低位數(shù)碼管下面有小數(shù)點(diǎn)顯示,用于區(qū)分不同的時(shí)間單位。同時(shí),再次按下按鍵key2,將會(huì)暫停秒表計(jì)時(shí)。按下按鍵key4,將會(huì)秒表清0,此時(shí)可以進(jìn)行下一次的計(jì)時(shí)。此模塊功能全部達(dá)到要求。

基于高云FPGA開(kāi)發(fā)板的多功能數(shù)字時(shí)鐘,FPGA,fpga開(kāi)發(fā)

4、鬧鐘模塊調(diào)試

在下面的數(shù)碼管顯示中,同時(shí)間設(shè)置模塊調(diào)試,按下按鍵key3可以對(duì)當(dāng)前的數(shù)碼管進(jìn)行+1,按下按鍵key2可以實(shí)現(xiàn)6位數(shù)碼管移位,用于設(shè)置鬧鐘的時(shí)間。當(dāng)鬧鐘的時(shí)-分與正常顯示的時(shí)間相同時(shí),此時(shí)鬧鐘回復(fù)發(fā)出一個(gè)提醒信號(hào),在開(kāi)發(fā)板上,可以看到LED1燈泡亮起,在60s之后,LED1燈泡熄滅。

注意,鬧鐘時(shí)鐘比較只涉及時(shí)-分。此模塊功能全部達(dá)到要求。

基于高云FPGA開(kāi)發(fā)板的多功能數(shù)字時(shí)鐘,FPGA,fpga開(kāi)發(fā)

5、數(shù)字時(shí)鐘四個(gè)功能模塊聯(lián)合調(diào)試,通過(guò)按鍵key1可以實(shí)現(xiàn)四種功能的分別顯示,并且,在不同的功能模式下,對(duì)應(yīng)的數(shù)碼管顯示的數(shù)字信息也不同,通過(guò)其他按鍵的使用,可以具體的調(diào)控?cái)?shù)碼管和輸出對(duì)應(yīng)的信號(hào)。數(shù)字時(shí)鐘所有模塊調(diào)試完成,所有模塊功能全部達(dá)到要求。

基于高云FPGA開(kāi)發(fā)板的多功能數(shù)字時(shí)鐘,FPGA,fpga開(kāi)發(fā)

五、遇到的問(wèn)題及解決方法

在本次的課程設(shè)計(jì)中,我總共遇到了4個(gè)問(wèn)題,在查閱資料和詢(xún)問(wèn)老師的情況下,得到了很好的解決,完成了本次的數(shù)字時(shí)鐘課程設(shè)計(jì)。

問(wèn)題1:正常時(shí)間顯示時(shí)、分、秒的計(jì)數(shù)和進(jìn)位,時(shí)間設(shè)置的代碼設(shè)計(jì)中遇到了問(wèn)題。

解決方法1:在正常時(shí)間的顯示邏輯中,小時(shí)的最大應(yīng)該為24,分鐘的最大應(yīng)該為59,秒的最大應(yīng)該為59(在60 的時(shí)候應(yīng)該直接進(jìn)位,不予顯示)。由此,可以在模塊中以秒的低位作為最底層進(jìn)行時(shí)鐘沿的觸發(fā),因?yàn)橹挥忻脒M(jìn)行計(jì)數(shù)和進(jìn)位后,才有分鐘和小時(shí)的顯示。

在if判斷語(yǔ)句中,在秒低位首先進(jìn)行是否為9?的判斷,進(jìn)而再次比較秒高位是否為5,當(dāng)達(dá)到59時(shí),進(jìn)位到分,否則秒的低位時(shí)鐘+1,繼續(xù)計(jì)數(shù)。針對(duì)其他模塊,可以采用相同的設(shè)計(jì)方法,但是由此不同的是,對(duì)于分鐘和小時(shí)的時(shí)鐘沿觸發(fā),應(yīng)該使用進(jìn)位標(biāo)志觸發(fā),只有存在進(jìn)位出現(xiàn)時(shí),才有計(jì)數(shù)+1。

always@(posedge clk1 or posedge time_set_en) ?begin
? ? if (time_set_en) begin ? //秒的設(shè)置
? ? ? ? sech<=sech_set; ? ? //設(shè)置給秒的高低兩位
? ? ? ? secl<=secl_set;
? ? ? end
? ? else ?if (time_en) ? ?begin 
? ? ? ? ? ?//秒的計(jì)數(shù)情況
? ? ? ? if (secl==9) ?//秒的低位為9時(shí)
? ? ? ? ? begin
? ? ? ? ? secl<=0; ? ? //秒低位清0
? ? ? ? ? if (sech==5) ? //秒高位為5時(shí)
? ? ? ? ? ? begin
? ? ? ? ? ? ? sech<=0; ? //秒的低位為9,秒的高位為5時(shí),秒的高位清0
? ? ? ? ? ? ? cout1<=1; ?//秒向分進(jìn)1
? ? ? ? ? ? end
? ? ? ? ? else
? ? ? ? ? ? begin
? ? ? ? ? ? ? sech<=sech+1; ?//秒高位不為5,繼續(xù)+1
? ? ? ? ? ? end
? ? ? ? ? end
? ? ? ? else if (flag1) ? //當(dāng)標(biāo)志位翻轉(zhuǎn)時(shí),秒的低位不再變化,實(shí)現(xiàn)暫停
? ? ? ? ? begin
? ? ? ? ? secl<=secl+1; ?//秒低位不為9,繼續(xù)+1
? ? ? ? ? cout1<=0;
? ? ? ? ? end ? ? ? ? ? ? ? ?
? ? ? end
? end

針對(duì)時(shí)間的設(shè)置,在此處主要的問(wèn)題是,需要聯(lián)合時(shí)間的顯示和設(shè)置,在完成時(shí)間的設(shè)置之后,應(yīng)該將設(shè)置的時(shí)間用于替代原本的時(shí)間顯示,實(shí)現(xiàn)時(shí)間的設(shè)置和覆蓋。因此,我的設(shè)計(jì)邏輯在于將時(shí)鐘計(jì)數(shù)和設(shè)置模塊進(jìn)行聯(lián)合,當(dāng)需要時(shí)間正常計(jì)時(shí)模式時(shí),利用時(shí)間設(shè)置的數(shù)字值進(jìn)行現(xiàn)有覆蓋。此外,在時(shí)間設(shè)置模式時(shí),時(shí)間計(jì)數(shù)正常進(jìn)行,不起沖突。同時(shí),通過(guò)外部的按鍵,利用時(shí)鐘沿去檢測(cè)按鍵的按下,可以實(shí)現(xiàn)時(shí)間設(shè)置現(xiàn)有的值加1。

問(wèn)題2由于采用多種時(shí)鐘,在功能切換和數(shù)碼管掃描顯示邏輯中,遇到了問(wèn)題。

解決方法2:在實(shí)現(xiàn)功能模式的跳轉(zhuǎn)時(shí),其對(duì)應(yīng)的數(shù)碼管顯示也需要發(fā)生對(duì)應(yīng)的改變,例如在時(shí)間設(shè)置時(shí),需要的時(shí)鐘邏輯與時(shí)間計(jì)數(shù)和數(shù)碼管掃描時(shí)鐘不一致,針對(duì)此問(wèn)題的解決,我想到的是,設(shè)置兩組always語(yǔ)句,分別判斷此時(shí)的模式使能的情況,在不同的模式下,傳輸不同的掃描時(shí)間clk0,再利用此掃描時(shí)間,分別掃描6個(gè)數(shù)碼管即可。

//掃描時(shí)鐘的選擇

always@(time_en or time_set_en or clk1k or clk200

? ? ? ? ? ? ? ? ? ? ? ? or stopwatch_en or alarm_clock_en) begin

? ? ? ? ? ? if(time_en) ? begin ? //正常顯示時(shí)間信息時(shí),選擇1kHz的掃描時(shí)鐘 ?快一些

? ? ? ? ? ? ? ? ? ? ? ? clk0<=clk1k;

? ? ? ? ? ? ? ? ? ? ? ? sel<=time_sel;

? ? ? ? ? ? ? ? ? end

//設(shè)置調(diào)整時(shí)間信息時(shí),選擇200Hz的掃描時(shí)鐘 ? 慢一些

? ? ? ? ? ? else ?if(time_set_en) ? begin ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? clk0<=clk200;

? ? ? ? ? ? ? ? ? ? ? ? sel<=time_display; ? //選擇的單個(gè)數(shù)碼管

? ? ? ? ? ? ? ? ? end

? ? ? ? ? ? else if(stopwatch_en) begin ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? clk0<=clk1k;

? ? ? ? ? ? ? ? ? ? ? ? sel<=time_sel;

? ? ? ? ? ? ? ? ? end

? ? ? ? ? ? else if(alarm_clock_en) ?begin ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? clk0<=clk200;

? ? ? ? ? ? ? ? ? ? ? ? sel<=alarm_clock_display;

? ? ? ? ? ? ? ? ? end ? ? ? ? ? ?

? ? ? end

//為時(shí)、分、秒的高位和低位數(shù)據(jù)進(jìn)行動(dòng)態(tài)位選擇

always@(posedge clk0) ?begin ?

? ? ? ? ? ? case(sel) ? ? //6位分別傳送給位控信號(hào)

? ? ? ? ? ? ? ? ? 3'b000: time_display_sel<=6'b100000;

? ? ? ? ? ? ? ? ? 3'b001: time_display_sel<=6'b010000;

? ? ? ? ? ? ? ? ? 3'b010: time_display_sel<=6'b001000;

? ? ? ? ? ? ? ? ? 3'b011: time_display_sel<=6'b000100;

? ? ? ? ? ? ? ? ? 3'b100: time_display_sel<=6'b000010;

? ? ? ? ? ? ? ? ? 3'b101: time_display_sel<=6'b000001;

? ? ? ? ? ? ? ? ? default: time_display_sel<=6'b000000;

? ? ? ? ? endcase

? ? ? end

問(wèn)題3鬧鐘時(shí)間設(shè)置和鬧鐘的時(shí)間到達(dá)時(shí)的提醒信號(hào),遇到了問(wèn)題。

解決方法3:在初步解決該問(wèn)題時(shí),我設(shè)想的方法是設(shè)置一個(gè)可以進(jìn)行60s計(jì)數(shù)的計(jì)數(shù)器,當(dāng)計(jì)數(shù)器的值滿(mǎn)60時(shí),關(guān)閉此時(shí)輸出的鬧鐘信號(hào),但是我在設(shè)計(jì)的過(guò)程中,我一直無(wú)法解決當(dāng)前的問(wèn)題,因?yàn)樵谟?jì)時(shí)的過(guò)程中,我既需要在always語(yǔ)句中導(dǎo)入當(dāng)前的時(shí)鐘信號(hào),又需要1s的計(jì)數(shù)信號(hào)clk1,此時(shí)的時(shí)序控制非常困難。

在詢(xún)問(wèn)老師具體的解決方法之后,我想到,其實(shí)在進(jìn)行程序的比較的時(shí)候,不需要進(jìn)行秒的比較,只需要比較時(shí)、分就行,因?yàn)樵跁r(shí)、分不相等時(shí),自然完成了60s的時(shí)鐘比較,這時(shí),基于此分析的邏輯,便可以很好的實(shí)現(xiàn)。

//鬧鐘信號(hào)提醒---計(jì)時(shí)60s ? ? 不進(jìn)行秒的比對(duì),只比對(duì)一分鐘 ? //只比較時(shí)、分四位

always@(hourh or hourl or minh or minl or sech or secl or alarm_hourh_set or

? ? ? alarm_hourl_set or alarm_minh_set or

? ? ? alarm_minl_set or alarm_sech_set or alarm_secl_set) ?begin

? ? ? if((alarm_minl_set==minl)&&(alarm_hourh_set==hourh)

? ? ? ? ?&&(alarm_hourl_set==hourl)&&(alarm_minh_set==minh)) ?

? ? ? ? ? ? ? ? ? alarm<=0; ? ? ? //當(dāng)前時(shí)間與設(shè)定的鬧鐘時(shí)間相等,發(fā)送高電平 ? ?

? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? alarm<=1;

end

問(wèn)題4秒表的時(shí)鐘控制和數(shù)碼管的顯示,由于在本模塊中,采用多種時(shí)鐘跳轉(zhuǎn)和數(shù)碼管掃描,出現(xiàn)同步時(shí)鐘混亂的情況,導(dǎo)致秒表的顯示不一致。

解決方法4:首先在此處具體分析一下出現(xiàn)問(wèn)題的具體原因,在進(jìn)行秒表計(jì)時(shí)的過(guò)程中,我既需要發(fā)送此時(shí)的秒表計(jì)時(shí)的情況,又需要在數(shù)碼管上面進(jìn)行數(shù)字掃描輸出,同時(shí),在前面的時(shí)間正常計(jì)數(shù)時(shí),還有一個(gè)1s的計(jì)數(shù)時(shí)鐘,三種時(shí)鐘信號(hào)在同時(shí)進(jìn)行,在進(jìn)行具體的時(shí)鐘輸出的時(shí)候,我認(rèn)為在當(dāng)前的時(shí)序輸出上會(huì)出現(xiàn)混亂的情況。在程序的實(shí)現(xiàn)中,我采用的具體方法是分時(shí)發(fā)送時(shí)鐘信號(hào),在下面的四種情況下,分別對(duì)應(yīng)不同的掃描時(shí)鐘。

在進(jìn)行初步解決時(shí),我采用的方法是,提高數(shù)碼管的掃描頻率,先修改秒表的計(jì)時(shí)信號(hào)為1s,此時(shí)秒表的計(jì)時(shí)信號(hào)恢復(fù)正常,但是在設(shè)定為0.01s時(shí),此時(shí)顯示又出現(xiàn)問(wèn)題,因此,我想的是再次提高數(shù)碼管的掃描頻率,但是此時(shí)便會(huì)影響其他模塊的功能顯示,并且,我多次檢查各模塊之間調(diào)用的代碼邏輯和程序的實(shí)現(xiàn),無(wú)法找到問(wèn)題所在。

?最后,我的解決方法就是,將秒表的功能移動(dòng)到另一塊開(kāi)發(fā)板上面,只有秒表一項(xiàng)功能,同時(shí)也保留數(shù)碼顯示的代碼,可以很好的實(shí)現(xiàn)秒表的功能,同時(shí),為了更好的區(qū)分當(dāng)前的計(jì)時(shí)情況,我在特定的數(shù)碼管顯示下面加了小數(shù)點(diǎn),用與區(qū)分例如6.32.3時(shí)間。當(dāng)然,將秒表的功能移動(dòng)到一塊開(kāi)發(fā)板上面,我認(rèn)為還是可以實(shí)現(xiàn),同樣在control模塊中,控制功能調(diào)用即可。

? if(time_en) ? begin ? ? ?//正常顯示時(shí)間信息時(shí),選擇1kHz的掃描時(shí)鐘 ?快一些

? ? ? ? ? ? ? ? ? ? ? ? clk0<=clk1k;

? ? ? ? ? ? ? ? ? ? ? ? sel<=time_sel;

? ? ? ? ? ? ? ? ? end

? ? ? ? else ?if(time_set_en) ? begin //設(shè)置調(diào)整時(shí)間信息時(shí),選擇200Hz的掃描時(shí)鐘 ? 慢一些? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? clk0<=clk200;

? ? ? ? ? ? ? ? ? ? ? ? sel<=time_display; ? //選擇的單個(gè)數(shù)碼管

? ? ? ? ? ? ? ? ? end

? ? ? ? ? ? else if(stopwatch_en) begin ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? clk0<=clk1k;

? ? ? ? ? ? ? ? ? ? ? ? sel<=time_sel;

? ? ? ? ? ? ? ? ? end

? ? ? ? ? ? else if(alarm_clock_en) ?begin ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? clk0<=clk200;

? ? ? ? ? ? ? ? ? ? ? ? sel<=alarm_clock_display;

? ? ? ? ? ? ? ? ? end ? ? ? ? ? ?

? ? ? end

六、課程學(xué)習(xí)總結(jié)

在本次基于FPGA的多功能數(shù)字時(shí)鐘項(xiàng)目的設(shè)計(jì)中,需要熟練掌握時(shí)序邏輯的代碼編寫(xiě)以及基于時(shí)序的不同而產(chǎn)生的問(wèn)題調(diào)試。在編寫(xiě)代碼的過(guò)程中,需要詳細(xì)了解模塊的工作原理和實(shí)現(xiàn)的基本邏輯。在實(shí)現(xiàn)的過(guò)程中,我的步驟是首先在紙上大致對(duì)每個(gè)模塊進(jìn)行功能分類(lèi),大致進(jìn)行功能的構(gòu)思和初步設(shè)計(jì),同時(shí),畫(huà)出各個(gè)模塊的連接方式,可以等同于先一步完成了RTL原理圖的設(shè)計(jì)。之后,我再針對(duì)每一個(gè)模塊進(jìn)行代碼編寫(xiě),同時(shí),完成一個(gè)模塊編寫(xiě),調(diào)試一個(gè)模塊,逐步便能完成整體的設(shè)計(jì)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-813494.html

到了這里,關(guān)于基于高云FPGA開(kāi)發(fā)板的多功能數(shù)字時(shí)鐘的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • EDA實(shí)驗(yàn)(Quartus Ⅱ+fpga) (五)---多功能數(shù)字鐘設(shè)計(jì)

    本實(shí)驗(yàn)代碼為初學(xué)FPGA所寫(xiě),邏輯不太清晰,請(qǐng)?zhí)旅婢W(wǎng)址查看最新的模塊化設(shè)計(jì)數(shù)字鐘,更易看懂 模塊化多功能數(shù)字鐘設(shè)計(jì) 前言: 本文主要介紹了EDA原理與應(yīng)用這門(mén)課程的相關(guān)實(shí)驗(yàn)及代碼。使用的軟件是Quartus Ⅱ,該實(shí)驗(yàn)使用fpga芯片為cycloneⅤ 5CSEMA5F31C6。 (1)了解數(shù)字鐘的

    2024年02月06日
    瀏覽(21)
  • FPGA-DE2-115-實(shí)驗(yàn)二-模塊化多功能數(shù)字鐘

    FPGA-DE2-115-實(shí)驗(yàn)二-模塊化多功能數(shù)字鐘

    前言: 本文主要介紹了集成電路EDA這門(mén)課程的相關(guān)實(shí)驗(yàn)及代碼。使用的軟件是Quartus Ⅱ,該實(shí)驗(yàn)使用fpga芯片為cyclone IV EP4CE115F29C7。 本次實(shí)驗(yàn)我們需要實(shí)現(xiàn)生活中常見(jiàn)的電子手表的所有功能。 我們知道: 電子手表有五個(gè)功能,包括:時(shí)間顯示功能,夜光模式功能,計(jì)時(shí)功能,鬧鐘功能

    2024年02月04日
    瀏覽(65)
  • 基于高云FPGA開(kāi)發(fā)板的十字路口交通燈

    基于高云FPGA開(kāi)發(fā)板的十字路口交通燈

    結(jié)合高云MiniStar_Nano EDA開(kāi)發(fā)板,完成設(shè)計(jì)十字路口交通信號(hào)燈控制系統(tǒng)。 1.要求該交通燈為三色燈控制器,紅燈亮表示禁止通行,綠燈亮表示允許通行,黃燈亮表示要求壓線(xiàn)車(chē)輛快速穿越。主干道和次干道燈的亮滅時(shí)序按照交通規(guī)則設(shè)置。 2.可以調(diào)整主干道和次干道綠燈和紅

    2024年01月19日
    瀏覽(118)
  • 【基于FPGA的芯片設(shè)計(jì)】多功能ALU

    【基于FPGA的芯片設(shè)計(jì)】多功能ALU

    目錄 一、實(shí)驗(yàn)要求 二、源代碼 1. 頂層模塊 2. 數(shù)據(jù)輸入模塊 3. ALU運(yùn)算模塊 4. 結(jié)果處理模塊 5. 掃描數(shù)碼管模塊 5.1 掃描數(shù)碼管頂層 5.2 分頻器 5.3 數(shù)碼管顯示 三、仿真代碼 四、結(jié)構(gòu)層圖 五、管腳配置 實(shí)驗(yàn)板卡:xc7a100tlc sg324-2L,共20個(gè)開(kāi)關(guān) 通過(guò)高低位控制,實(shí)現(xiàn)32位數(shù)據(jù)A、

    2024年02月05日
    瀏覽(27)
  • 基于FPGA的多功能信號(hào)模擬生成系統(tǒng)

    基于FPGA的多功能信號(hào)模擬生成系統(tǒng)

    本系統(tǒng)歷時(shí)1.5年開(kāi)發(fā),在實(shí)際應(yīng)用過(guò)程中,功能再不斷更新完善中。。。。 系統(tǒng)工程源碼: 百度網(wǎng)盤(pán)? ? 提取碼:mww7 模擬器設(shè)備發(fā)射端主要由中頻處理單元和射頻發(fā)送單元兩部分組成。功能組成框圖如圖所示,中頻處理單元實(shí)現(xiàn)擬輻射信號(hào)的基帶數(shù)字信號(hào)產(chǎn)生、D/A轉(zhuǎn)換和中

    2024年02月19日
    瀏覽(24)
  • 0—基于FPGA(ZYNQ-Z2)的多功能小車(chē)

    0—基于FPGA(ZYNQ-Z2)的多功能小車(chē)

    ? ?在電子技術(shù)與創(chuàng)新的課設(shè)中我選擇了這個(gè)題目,在設(shè)計(jì)的時(shí)候遇到了非常多的問(wèn)題,但是網(wǎng)上的對(duì)應(yīng)資料又非常少,因此在完成設(shè)計(jì)之后,我把設(shè)計(jì)方法與代碼在這篇博客中分享出來(lái),希望能對(duì)需要的人有所幫助。 目錄 1.題目 2. 題目分析: 3. 器件使用 4. 工程文件? 5. 傳

    2024年02月07日
    瀏覽(24)
  • 5—基于FPGA(ZYNQ-Z2)的多功能小車(chē)—軟件設(shè)計(jì)—藍(lán)牙串口

    5—基于FPGA(ZYNQ-Z2)的多功能小車(chē)—軟件設(shè)計(jì)—藍(lán)牙串口

    目錄 1.藍(lán)牙模塊介紹 2.UART介紹 3.Verilog代碼: 3.1Uart_RX模塊: 3.2 分頻模塊: 3.3 Uart驅(qū)動(dòng)模塊 3.4 Uart控制模塊 4. 總覽 ? 我使用的是JDY-31藍(lán)牙模塊,在連線(xiàn)中,要注意RX-TX,TX-RX。 ? 即FPGA約束的TX對(duì)應(yīng)藍(lán)牙模塊的RX,約束的RX對(duì)應(yīng)藍(lán)牙模塊的TX。 藍(lán)牙模塊使用UART串口通信協(xié)議,具體

    2024年02月05日
    瀏覽(32)
  • LabVIEW開(kāi)發(fā)基于物聯(lián)網(wǎng)的多功能功率分析儀

    LabVIEW開(kāi)發(fā)基于物聯(lián)網(wǎng)的多功能功率分析儀

    LabVIEW開(kāi)發(fā)基于物聯(lián)網(wǎng)的多功能功率分析儀 根據(jù)技術(shù)規(guī)則,電氣元件網(wǎng)絡(luò)中的單個(gè)被創(chuàng)建為在標(biāo)稱(chēng)正弦波振動(dòng)制造頻率下運(yùn)行。失真順序的電流和電壓波與正弦波不同,它們或多或少地扭曲成形狀。它是由交流網(wǎng)絡(luò)中非線(xiàn)性組件的存在引起的,例如靜態(tài)轉(zhuǎn)換器、旋轉(zhuǎn)電氣設(shè)備

    2024年02月07日
    瀏覽(16)
  • 【FPGA】多功能ALU

    【FPGA】多功能ALU

    目錄 一、實(shí)驗(yàn)要求 二、源代碼 1. 頂層模塊 2. 數(shù)據(jù)輸入模塊 3. ALU運(yùn)算模塊 4. 結(jié)果處理模塊 5. 掃描數(shù)碼管模塊 5.1 掃描數(shù)碼管頂層 5.2 分頻器 5.3 數(shù)碼管顯示 三、仿真代碼 四、結(jié)構(gòu)層圖 五、管腳配置 實(shí)驗(yàn)板卡:xc7a100tlc sg324-2L,共20個(gè)開(kāi)關(guān) 通過(guò)高低位控制,實(shí)現(xiàn)32位數(shù)據(jù)A、

    2024年02月02日
    瀏覽(23)
  • fpga課設(shè)-多功能信號(hào)發(fā)生器

    1緒論 1.1 背景 信號(hào)發(fā)生器作為一種歷史悠久的測(cè)量?jī)x器,早在20年代電子設(shè)備剛出現(xiàn)時(shí)就產(chǎn)生了。隨著通信和雷達(dá)技術(shù)的發(fā)展,40年代出現(xiàn)了主要用于測(cè)試各種接收機(jī)的標(biāo)準(zhǔn)信號(hào)發(fā)生器,使得信號(hào)發(fā)生器從定性分析的測(cè)試儀器發(fā)展成定量分析的測(cè)量?jī)x器。同時(shí)還出現(xiàn)了可用來(lái)

    2024年02月05日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包