一八千、實(shí)驗(yàn)設(shè)備
FPGA開(kāi)發(fā)平臺(tái)、計(jì)算機(jī)断凶、其它外接器件
二冬念、需求分析(選題的意義则北、功能要求等恨旱。。陨舱。這里有點(diǎn)水,小伙伴們可以選擇性跳過(guò))
選題的意義:個(gè)人認(rèn)為本項(xiàng)目(《數(shù)字時(shí)鐘》)的選題意義有二版仔,其一游盲,時(shí)鐘和鬧鐘早已是老生常談的日常工具误墓,利用課堂上所學(xué)習(xí)的知識(shí)貫通運(yùn)用到現(xiàn)實(shí)生活中,作為操作實(shí)踐益缎,具有一定的現(xiàn)實(shí)意義谜慌;其二,數(shù)字時(shí)鐘的功能設(shè)計(jì)囊括了數(shù)碼管莺奔、LCD屏欣范、開(kāi)關(guān)運(yùn)用、管教分配等知識(shí)令哟,能夠?qū)Ρ緦W(xué)期所學(xué)的實(shí)驗(yàn)知識(shí)做一個(gè)挽接恼琼,在知識(shí)的總結(jié)上也具備一定意義;
功能要求:
1.用數(shù)碼管顯示時(shí)屏富、分晴竞、秒:分為兩個(gè)界面,即時(shí)鐘界面以及鬧鐘設(shè)置界面狠半,顯示時(shí)鐘的時(shí)分秒以及鬧鐘的時(shí)分秒噩死,可以通過(guò)開(kāi)關(guān)切換顯示,是項(xiàng)目的基本功能神年;
2.能按比例縮短時(shí)間調(diào)試:調(diào)控時(shí)鐘或鬧鐘的頻跳速度已维,方便演示和調(diào)試;
3.鬧鐘功能:用戶可以通過(guò)sw8切換進(jìn)入鬧鐘界面瘤袖,再利用sw1-3設(shè)定具體的鬧鐘時(shí)間衣摩,到點(diǎn)即響,同樣是項(xiàng)目的基本功能捂敌;
4.用LCD屏顯示日期(年月日)以及祝福語(yǔ):作為時(shí)鐘艾扮,顯示年月日的功能個(gè)人覺(jué)得也是有必要的,另外關(guān)于祝福語(yǔ)占婉,我們對(duì)實(shí)驗(yàn)和知識(shí)的學(xué)習(xí)其實(shí)本身就是快樂(lè)的過(guò)程泡嘴,生活也沒(méi)有必要每天都過(guò)得毫無(wú)色彩、千篇一律逆济,所以懷揣著這份情懷呢酌予,我在本項(xiàng)目中加了一個(gè)顯示祝福語(yǔ)的功能,意在表達(dá)自己的這份對(duì)科學(xué)和生活的熱愛(ài)以及學(xué)習(xí)的熱情奖慌。
三抛虫、系統(tǒng)框架介紹(系統(tǒng)結(jié)構(gòu)圖,各模塊的功能及端口介紹简僧,等)
系統(tǒng)結(jié)構(gòu)圖如下所示:
各模塊的功能及端口介紹:
(這里的模塊功能和端口做簡(jiǎn)要的介紹建椰,詳細(xì)的用法請(qǐng)移步至《設(shè)計(jì)思路》部分)
1.Digital_CLK_Top(clk_50M, Reset_n, seg7,ledcom,key,beep,
LCD_ON1,LCD_BLON1,LCD_RS1,LCD_RW1,LCD_EN1,LCD_DATA1);
功能:頂層模塊,調(diào)用其他子模塊岛马,統(tǒng)籌整個(gè)系統(tǒng)的功能棉姐;
端口:
clk_50M, //系統(tǒng)時(shí)鐘輸入
Reset_n, //系統(tǒng)復(fù)位輸入
seg7, //數(shù)碼管顯示輸出位
ledcom, //數(shù)碼管位置調(diào)控輸出位
key, //開(kāi)關(guān)輸入號(hào)位屠列,主要使用于CLKcounter_60BCD
beep, //蜂鳴器輸出信號(hào)
LCD_ON1, //LCD供電電源開(kāi)關(guān)
LCD_BLON1, //LCD背景電源開(kāi)關(guān)
LCD_RS1, //寄存器選擇信號(hào)
LCD_RW1, //液晶讀寫(xiě)信號(hào)
LCD_EN1, //液晶時(shí)鐘信號(hào)
LCD_DATA1, //LCD的數(shù)據(jù)端口
2.lcd_ori(LCD_ON,LCD_BLON,LCD_RS,LCD_RW,LCD_EN,LCD_DATA,CLK);
功能:LCD屏顯示控制模塊伞矩,用于控制LCD屏顯示年月日以及祝福語(yǔ)笛洛;
端口:
LCD_ON, //LCD供電電源開(kāi)關(guān)
LCD_BLON, //LCD背景電源開(kāi)關(guān)
LCD_RS, //寄存器選擇信號(hào)
LCD_RW, //液晶讀寫(xiě)信號(hào)
LCD_EN, //液晶時(shí)鐘信號(hào)
LCD_DATA, //LCD的數(shù)據(jù)端口
CLK乃坤, //模塊時(shí)鐘輸入(項(xiàng)目中輸入的是clk_50M)
3.seg_display(clk,rst_n,mimute_cnt,second_cnt,hour_cnt,ledcom,seg7);
功能:基于視覺(jué)暫留知識(shí)苛让,控制時(shí)鐘界面數(shù)碼管的顯示;
端口:
clk, //模塊時(shí)鐘輸入
rst_n, //復(fù)位信號(hào)輸入
mimute_cnt, //分鐘位數(shù)據(jù)輸入
second_cnt, //秒位數(shù)據(jù)輸入
hour_cnt, //時(shí)位數(shù)據(jù)輸入
seg7, //數(shù)碼管顯示輸出位
ledcom, //數(shù)碼管位置調(diào)控輸出位
4.counter_60BCD(clk, rst, couter_o,flag);
功能:在頂層模塊調(diào)用侥袜,根據(jù)輸入的時(shí)鐘和時(shí)|分|秒位數(shù)據(jù)進(jìn)行對(duì)應(yīng)的加一計(jì)算和進(jìn)位計(jì)算蝌诡,并在溢出(分秒59加一溢出,時(shí)23加一溢出)時(shí)返回一個(gè)flag供頂層模塊使用枫吧;
端口:
clk, //模塊時(shí)鐘輸入
rst, //復(fù)位信號(hào)輸入
couter_o, //數(shù)字時(shí)鐘部分的時(shí)|分|秒位數(shù)據(jù)輸出
flag浦旱, //輸出一個(gè)溢出進(jìn)位標(biāo)志
5.clk_gen(clk_in,rst,clk_out); //clk_in=50MHz
功能:對(duì)輸入的50MHz的系統(tǒng)時(shí)鐘分頻,調(diào)用時(shí)根據(jù)CLK_DIV變量的復(fù)用情況進(jìn)行運(yùn)算并返回對(duì)應(yīng)的時(shí)鐘分頻結(jié)果九杂;
端口:
clk_in, //模塊時(shí)鐘輸入颁湖,在頂層模塊
rst, //復(fù)位信號(hào)輸入
clk_out, //時(shí)鐘分頻結(jié)果輸出
6.CLKseg_display(clk,rst_n,mimute_cnt,second_cnt,
hour_cnt,CLKmimute_cnt,CLKsecond_cnt,CLKhour_cnt,ledcom,seg7,sw8);
功能:基于視覺(jué)暫留知識(shí)例隆,控制鬧鐘設(shè)置界面數(shù)碼管的顯示甥捺,并基于sw8的狀態(tài)控制切換數(shù)碼管屏顯示;
端口:
clk, //模塊時(shí)鐘輸入
rst, //復(fù)位信號(hào)輸入
mimute_cnt, //分鐘位數(shù)據(jù)輸入(時(shí)鐘)
second_cnt, //秒位數(shù)據(jù)輸入(時(shí)鐘)
hour_cnt, //時(shí)位數(shù)據(jù)輸入(時(shí)鐘)
CLKmimute_cnt,//分鐘位數(shù)據(jù)輸入(鬧鐘設(shè)置)
CLKsecond_cnt,//秒位數(shù)據(jù)輸入(鬧鐘設(shè)置)
CLKhour_cnt, //時(shí)位數(shù)據(jù)輸入(鬧鐘設(shè)置)
seg7, //數(shù)碼管顯示輸出位
ledcom, //數(shù)碼管位置調(diào)控輸出位
sw8 //開(kāi)關(guān)8的輸入信號(hào)
7.CLKcounter_60BCD(clk, rst, couter_o,flag,sw);
功能:在頂層模塊調(diào)用镀层,根據(jù)輸入的時(shí)鐘頻率clk和時(shí)|分|秒位數(shù)據(jù)進(jìn)行對(duì)應(yīng)的加一計(jì)算和進(jìn)位計(jì)算镰禾,并在溢出(分秒59加一溢出,時(shí)23加一溢出)時(shí)返回一個(gè)flag供頂層模塊使用唱逢;
端口:
clk, //模塊時(shí)鐘輸入
rst, //復(fù)位信號(hào)輸入
couter_o, //數(shù)字鬧鐘設(shè)置部分的時(shí)|分|秒位數(shù)據(jù)輸出
flag吴侦, //輸出一個(gè)溢出進(jìn)位標(biāo)志
sw //開(kāi)關(guān)輸入位,作為key的接收變量
四坞古、設(shè)計(jì)思路(每個(gè)模塊的設(shè)計(jì)思路备韧,文字結(jié)合示意圖等進(jìn)行介紹)
1.Digital_CLK_Top(clk_50M, Reset_n, seg7,ledcom,key,beep,
LCD_ON1,LCD_BLON1,LCD_RS1,LCD_RW1,LCD_EN1,LCD_DATA1);
功能:頂層模塊,調(diào)用其他子模塊痪枫,統(tǒng)籌整個(gè)系統(tǒng)的功能织堂;
思路:
A.復(fù)用兩次分頻模塊clk_gen,產(chǎn)生兩個(gè)速度不一樣的時(shí)鐘頻——clk_second和clk_second2奶陈,分別用來(lái)驅(qū)動(dòng)數(shù)字時(shí)鐘和數(shù)字鬧鐘設(shè)置易阳;
B.復(fù)用三次時(shí)鐘控制模塊counter_60BCD:
第一次,用clk_second作為時(shí)鐘頻輸入吃粒,傳入second_cnt給couter_o作為秒位數(shù)據(jù)承載潦俺,MODULEofCNT設(shè)置為60,模塊每溢出一次(即每計(jì)數(shù)到60個(gè)秒),產(chǎn)生一個(gè)flag黑竞,即flag_min;
第二次疏旨,用flag_min作為時(shí)鐘頻輸入很魂,傳入minute_cnt給couter_o作為秒位數(shù)據(jù)承載,MODULEofCNT設(shè)置為60檐涝,模塊每溢出一次(即每計(jì)數(shù)到60個(gè)分)遏匆,產(chǎn)生一個(gè)flag,即flag_hour谁榜;
第三次幅聘,用flag_hour作為時(shí)鐘頻輸入,傳入hour_cnt給couter_o作為秒位數(shù)據(jù)承載窃植,MODULEofCNT設(shè)置為24帝蒿,模塊每計(jì)數(shù)到24個(gè)時(shí)溢出一次;
C.復(fù)用三次鬧鐘控制模塊CLKcounter_60BCD:
第一次巷怜,用clk_second2作為時(shí)鐘頻輸入葛超,傳入CLKsecond_cnt給couter_o作為秒位數(shù)據(jù)承載,MODULEofCNT設(shè)置為60延塑,sw位傳入key[2]信號(hào)绣张,即sw3的狀態(tài)信號(hào);
第二次关带,用clk_second2作為時(shí)鐘頻輸入侥涵,傳入CLKminute_cnt給couter_o作為秒位數(shù)據(jù)承載,MODULEofCNT設(shè)置為60宋雏,sw位傳入key[1]信號(hào)芜飘,即sw2的狀態(tài)信號(hào);
第三次好芭, 用clk_second2作為時(shí)鐘頻輸入燃箭,傳入CLKhour_cnt給couter_o作為秒位數(shù)據(jù)承載,MODULEofCNT設(shè)置為24舍败,sw位傳入key[0]信號(hào)招狸,即sw1的狀態(tài)信號(hào);
D.復(fù)用LCD屏控制顯示模塊lcd_ori邻薯,根據(jù)本函數(shù)定義的變量復(fù)用對(duì)應(yīng)的參數(shù)裙戏;
E.復(fù)用鬧鐘數(shù)碼管控制顯示模塊CLKseg_display,根據(jù)本函數(shù)定義的變量復(fù)用對(duì)應(yīng)的參數(shù)厕诡;
F.接下來(lái)累榜,編寫(xiě)了一個(gè)狀態(tài)機(jī),主要設(shè)置并使用了state0、state1壹罚、state2等三個(gè)狀態(tài)葛作;
state0狀態(tài):使用if判斷語(yǔ)句
if(second_cnt==CLKsecond_cnt&&minute_cnt==CLKminute_cnt&&hour_cnt==CLKhour_cnt)
等一個(gè)在鬧鐘界面模塊設(shè)置的時(shí)分秒數(shù)列,等到這個(gè)數(shù)列的時(shí)候轉(zhuǎn)跳到state1或state2猖凛,并設(shè)置好蜂鳴器鳴響的延時(shí)時(shí)間到變量cnt_2赂蠢;
state1、state2:在計(jì)數(shù)變量cnt_2歸零之前辨泳,一直給蜂鳴器管腳輸出高電平虱岂,直到計(jì)數(shù)變量cnt_2歸零,輸出為低電平菠红,停止蜂鳴器鳴響第岖;
2.lcd_ori(LCD_ON,LCD_BLON,LCD_RS,LCD_RW,LCD_EN,LCD_DATA,CLK);
功能:LCD屏顯示控制模塊,用于控制LCD屏顯示年月日以及祝福語(yǔ)试溯;
思路:
A.將年月日以及祝福語(yǔ)分別編寫(xiě)成字符串蔑滓,再分別付給變量lcd_buf_first、data_first和lcd_buf_second遇绞、data_second烫饼;
B.準(zhǔn)備好狀態(tài)參數(shù)常量——
clear_lcd、
set_disp_mode试读、
disp_on杠纵、
shift_down、
write_data_first钩骇、
write_data_second比藻;
基于狀態(tài)機(jī)思想,并用current_state變量承載狀態(tài)常量倘屹;
C.初始化LCD模塊银亲;
D.clear_lcd狀態(tài), 清屏并光標(biāo)復(fù)位 纽匙;
set_disp_mode: 設(shè)置顯示模式:8位2行5x8點(diǎn)陣务蝠;
disp_on: 顯示器開(kāi)、光標(biāo)不顯示烛缔、光標(biāo)不允許閃爍 馏段;
shift_down: 文字不動(dòng),光標(biāo)自動(dòng)右移践瓷;data_first賦值給lcd_buf_first;
write_data_first院喜、write_data_second: 用于寫(xiě)入數(shù)據(jù)
default: 若current_state為其他值,則將current_state置為clear_lcd晕翠;
3.seg_display(clk,rst_n,mimute_cnt,second_cnt,hour_cnt,ledcom,seg7);
功能:基于視覺(jué)暫留知識(shí)喷舀,控制時(shí)鐘界面數(shù)碼管的顯示;
思路:
A.復(fù)用分頻模塊clk_gen分頻出一個(gè)時(shí)鐘clk_div,周期約為0.1s硫麻;
B.設(shè)置一個(gè)8位的變量cnt爸邢,基于clk_div進(jìn)行遞加一,并在0到滿位溢出之間循環(huán)(滿位溢出時(shí)將之歸零拿愧,再繼續(xù)加一處理)甲棍;
C.基于快速遞加一的變量cnt,在每個(gè)clk時(shí)鐘上升沿來(lái)的是時(shí)候赶掖,取其低三位(八個(gè)數(shù)碼管格位,剛好三位二進(jìn)制數(shù)可以完整表示)進(jìn)行case處理七扰,
每個(gè)case的子狀態(tài)中奢赂,根據(jù)cnt低三位的值,把對(duì)應(yīng)的表示數(shù)碼管位置的二進(jìn)制數(shù)賦值給ledcom颈走,用于選擇數(shù)碼管格位膳灶;再把對(duì)應(yīng)的數(shù)據(jù)(如秒位數(shù)據(jù)的低四位second_cnt[3:0],高四位second_cnt[7:4]等)傳給dis變量立由; dis的用法是在下一個(gè)always模塊里面轧钓,case判斷dis的值,根據(jù)dis的值把對(duì)應(yīng)的二進(jìn)制數(shù)傳給seg7變量锐膜,用于基于ledcom選擇數(shù)碼管格位之后毕箍,顯示格位里面的內(nèi)容;
由此道盏,基于快速跳變的clk時(shí)鐘和clk_div時(shí)鐘而柑,ledcom的值也不斷地快速變換,由此數(shù)碼管的每個(gè)格位都在被快速地選擇和顯示荷逞,于是這樣便是通過(guò)了視覺(jué)暫留效應(yīng)媒咳,實(shí)現(xiàn)了數(shù)碼管時(shí)鐘的顯示;
4.counter_60BCD(clk, rst, couter_o,flag);
功能:在頂層模塊調(diào)用种远,根據(jù)輸入的時(shí)鐘和時(shí)|分|秒位數(shù)據(jù)進(jìn)行對(duì)應(yīng)的加一計(jì)算和進(jìn)位計(jì)算涩澡,并在溢出(分秒59加一溢出,時(shí)23加一溢出)時(shí)返回一個(gè)flag供頂層模塊使用坠敷;
思路:
A.將MODULEofCNT(分別通過(guò)/10和%10運(yùn)算)切成5/2和9/3兩個(gè)數(shù)妙同,并分別付給變量a和b;
B.通過(guò)a和b判斷是對(duì)分秒位數(shù)據(jù)(MODULEofCNT為60)還是對(duì)時(shí)位數(shù)據(jù)(MODULEofCNT為24)進(jìn)行計(jì)算膝迎;
若是分秒位數(shù)據(jù):先對(duì)couter_o[7:4]進(jìn)行判斷渐溶,若小于5,則對(duì)couter_o[3:0]判斷弄抬,若couter_o[3:0]小于9茎辐,則couter_o[3:0]數(shù)據(jù)加一,若couter_o[3:0]不小于于9,則couter_o[3:0]歸零處理拖陆,couter_o[7:4]加一弛槐;若couter_o[7:4]不小于5,則對(duì)couter_o[3:0]判斷依啰,若couter_o[3:0]小于a(9)乎串,則couter_o[3:0]數(shù)據(jù)加一,若couter_o[3:0]不小于于a(9)速警,則couter_o八個(gè)位都?xì)w零叹誉,并返回一個(gè)溢出進(jìn)位flag(flag<=1);
若是時(shí)位數(shù)據(jù):邏輯同上闷旧,只將b替換為2长豁,將a替換為3進(jìn)行處理即可;
5.clk_gen(clk_in,rst,clk_out); //clk_in=50MHz
功能:對(duì)輸入的50MHz的系統(tǒng)時(shí)鐘分頻忙灼,調(diào)用時(shí)根據(jù)CLK_DIV變量的復(fù)用情況進(jìn)行運(yùn)算并返回對(duì)應(yīng)的時(shí)鐘分頻結(jié)果匠襟;
思路:簡(jiǎn)單地基于系統(tǒng)時(shí)鐘clk_in以及可復(fù)用的參數(shù)CLK_DIV實(shí)現(xiàn)分頻的功能;
6.CLKseg_display(clk,rst_n,mimute_cnt,second_cnt,
hour_cnt,CLKmimute_cnt,CLKsecond_cnt,CLKhour_cnt,ledcom,seg7,sw8);
功能:基于視覺(jué)暫留知識(shí)该园,控制鬧鐘設(shè)置界面數(shù)碼管的顯示酸舍,并基于sw8的狀態(tài)控制切換數(shù)碼管屏顯示;
思路:
A.復(fù)用分頻模塊clk_gen分頻出一個(gè)時(shí)鐘clk_div里初,周期約為0.1s啃勉;
B.(基于sw8的狀態(tài)控制切換數(shù)碼管屏顯示)If語(yǔ)句判斷sw8時(shí)候?yàn)楦唠娖剑绻撬粒瑒t將CLKsecond_cnt璧亮、CLKmimute_cnt娇妓、CLKhour_cnt系列數(shù)據(jù)付給dis變量故慈,如果不是則將second_cnt系統(tǒng)數(shù)據(jù)付給dis變量;細(xì)節(jié)處如cnt绰精、ledcom哑诊、dis群扶、case(cnt[2:0])等用法則跟seg_display模塊的設(shè)計(jì)思路相同;
7.CLKcounter_60BCD(clk, rst, couter_o,flag,sw);
功能:在頂層模塊調(diào)用镀裤,根據(jù)輸入的時(shí)鐘頻率clk和時(shí)|分|秒位數(shù)據(jù)進(jìn)行對(duì)應(yīng)的加一計(jì)算和進(jìn)位計(jì)算竞阐,并在溢出(分秒59加一溢出,時(shí)23加一溢出)時(shí)返回一個(gè)flag供頂層模塊使用暑劝;
思路:同counter_60BCD模塊的設(shè)計(jì)思路骆莹;
五、實(shí)驗(yàn)結(jié)果
1.開(kāi)機(jī)狀態(tài)担猛,初始為數(shù)字時(shí)鐘界面幕垦,下圖為數(shù)碼管上規(guī)則地顯示閃動(dòng)的時(shí)鐘丢氢,通過(guò)分頻模塊的參數(shù)調(diào)改可以改變其速度;
LCD屏上顯示具體的日期(年月日)以及祝福語(yǔ)(Wish you happy/happiness——祝你幸福)先改,開(kāi)關(guān)狀態(tài)為全數(shù)低電平:
2.上推sw8疚察,令之輸出為高電平,數(shù)碼管即切換到鬧鐘設(shè)置界面:
3.上推sw1仇奶,令之輸出為高電平貌嫡,數(shù)碼管鬧鐘界面上“時(shí)”數(shù)位持續(xù)加一(圖中已加到06):
4.上推sw2,令之輸出為高電平该溯,數(shù)碼管鬧鐘界面上“分”數(shù)位持續(xù)加一(圖中已加到04):
5.上推sw3岛抄,令之輸出為高電平,數(shù)碼管鬧鐘界面上“秒”數(shù)位持續(xù)加一(圖中已加到05):
6.數(shù)碼管停留在設(shè)置鬧鐘界面的時(shí)候狈茉,數(shù)字時(shí)鐘一直也在后臺(tái)跑動(dòng)夫椭,當(dāng)我們?cè)O(shè)置完鬧鐘,將開(kāi)關(guān)全數(shù)歸為低電平時(shí)论皆,數(shù)碼管界面回切到數(shù)字時(shí)鐘界面,數(shù)字時(shí)鐘上的時(shí)間到達(dá)鬧鐘設(shè)計(jì)的點(diǎn)時(shí)猾漫,會(huì)啟動(dòng)蜂鳴器点晴,產(chǎn)生一個(gè)時(shí)長(zhǎng)為三秒(可以在程序中設(shè)置時(shí)長(zhǎng))的鳴響作為鬧鐘。
六悯周、實(shí)驗(yàn)項(xiàng)目代碼清單
1.Digital_CLK_Top.v
頂層文件粒督,用于調(diào)用諸多要使用的模塊;
2.Tcl_2c35_script1.tcl
管教分配的腳本文件禽翼,描述管教的分配屠橄;
3.lcd_ori.v
LCD屏模塊,實(shí)現(xiàn)LCD屏顯示年月日以及祝福語(yǔ)的功能闰挡;
4.seg_ex.v
5.seg_display.v
時(shí)鐘模塊的數(shù)碼管顯示的相關(guān)模塊文件锐墙;
6.counter_60BCD.v
關(guān)于實(shí)現(xiàn)時(shí)鐘界面顯示的后臺(tái)數(shù)字計(jì)算(相關(guān)變量的加一和進(jìn)位操作等)的文件;
7.clk_gen.v
時(shí)鐘分頻模塊长酗,用于實(shí)現(xiàn)各種參數(shù)頻率的分頻溪北;
8.CLKseg_display.v
鬧鐘模塊的數(shù)碼管管顯示的相關(guān)模塊文件;
9.CLKcounter_60BCD.v
關(guān)于實(shí)現(xiàn)鬧鐘界面顯示的后臺(tái)數(shù)字計(jì)算(相關(guān)變量的加一和進(jìn)位操作等)的文件夺脾。