版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、計數(shù)器1、實現(xiàn)目標(biāo)及介紹實驗實現(xiàn)了一個簡易的計數(shù)器,計數(shù)范圍可達(dá)899(0899),通過key4按鍵計數(shù),每按下一次,計數(shù)加一,百位數(shù)顯示在led上,個位與十位顯示在數(shù)碼管上。為十進(jìn)制計數(shù),數(shù)碼管1計數(shù)到九后置零。數(shù)碼管2獲得進(jìn)位加一,數(shù)碼管2到9后當(dāng)再次獲得個位進(jìn)位時再次向百位進(jìn)一,點亮led1,每百位點亮一個led。此外key4為清零鍵,可隨時按鍵清零。2、效果展示計數(shù)99清零計數(shù)100視頻展示(雙擊觀看)3、代碼實現(xiàn)與模塊分析1.頂層模塊module jishuqi(input wire clk,rst, /時鐘和復(fù)位輸入input wire key1, /撥碼計output wire
2、7:0led,output wire 8:0 segment_led_1,segment_led_2 /數(shù)碼管輸出); wire key_pulse;reg7:0 cnt;/計時計數(shù)器reg 7:0 hud;/百位計數(shù)initial hud7:0 = 8b11111111;always (posedge clk or negedge rst) begin/數(shù)碼管顯示要按照十進(jìn)制的方式顯示 if(!rst)begin cnt = 8h00;hud 7:0 = 8b11111111;endelse if(key_pulse)beginif(cnt3:0 = 4d9)/個位進(jìn)位判斷begincnt3
3、:0 = 4d0;if(cnt7:4 = 4d9 )/十位進(jìn)位判斷begin cnt7:4 = 4d0;hud7:0 = hud7:0 - 1b1; endelsecnt7:4 = cnt7:4 + 1b1;endelse cnt3:0 = cnt3:0 + 1b1;endelsecnt = cnt;endassign led = hud;/例化調(diào)用數(shù)碼管顯示模塊segment u2(.seg_data_1(cnt7:4), /g_data input.seg_data_2(cnt3:0), /g_data input.seg_led_1(segment_led_1), /MSBLSB = S
4、EG,DP,G,F,E,D,C,B,A.seg_led_2(segment_led_2) /MSBLSB = SEG,DP,G,F,E,D,C,B,A);/例化調(diào)用消抖模塊debounce u1 ( .clk (clk), .rst (rst), .key (key1), .key_pulse (key_pulse) ); endmodule2.數(shù)碼管顯示模塊module segment (seg_data_1,seg_data_2,seg_led_1,seg_led_2); input 3:0 seg_data_1;/數(shù)碼管需要顯示09十個數(shù)字,所以最少需要4位輸入做譯碼input 3:0
5、seg_data_2;/小腳丫上第二個數(shù)碼管output 8:0 seg_led_1;/在小腳丫上控制一個數(shù)碼管需要9個信號 MSBLSB=DIG、DP、G、F、E、D、C、B、Aoutput 8:0 seg_led_2;/在小腳丫上第二個數(shù)碼管的控制信號 MSBLSB=DIG、DP、G、F、E、D、C、B、A reg 8:0 seg 9:0; /定義了一個reg型的數(shù)組變量,相當(dāng)于一個10*9的存儲器,存儲器一共有10個數(shù),每個數(shù)有9位寬 initial /在過程塊中只能給reg型變量賦值,Verilog中有兩種過程塊always和initial /initial和always不同,其中語句
6、只執(zhí)行一次 begin seg0 = 9h3f; /對存儲器中第一個數(shù)賦值9b00_0011_1111,相當(dāng)于共陰極接地,DP點變低不亮,7段顯示數(shù)字 0 seg1 = 9h06; /7段顯示數(shù)字 1 seg2 = 9h5b; /7段顯示數(shù)字 2 seg3 = 9h4f; /7段顯示數(shù)字 3 seg4 = 9h66; /7段顯示數(shù)字 4 seg5 = 9h6d; /7段顯示數(shù)字 5 seg6 = 9h7d; /7段顯示數(shù)字 6 seg7 = 9h07; /7段顯示數(shù)字 7 seg8 = 9h7f; /7段顯示數(shù)字 8 seg9 = 9h6f; /7段顯示數(shù)字 9 end assign seg_
7、led_1 = segseg_data_1; /連續(xù)賦值,這樣輸入不同四位數(shù),就能輸出對于譯碼的9位輸出 assign seg_led_2 = segseg_data_2; endmodule3.按鍵消抖模塊/按鍵消抖module debounce (clk,rst,key,key_pulse); parameter N = 2; /要消除的按鍵的數(shù)量 input clk; input rst; input N-1:0 key; /輸入的按鍵output N-1:0 key_pulse; /按鍵動作產(chǎn)生的脈沖 reg N-1:0 key_rst_pre; /定義一個寄存器型變量存儲上一個觸發(fā)時
8、的按鍵值 reg N-1:0 key_rst; /定義一個寄存器變量儲存儲當(dāng)前時刻觸發(fā)的按鍵值 wire N-1:0 key_edge; /檢測到按鍵由高到低變化是產(chǎn)生一個高脈沖 /利用非阻塞賦值特點,將兩個時鐘觸發(fā)時按鍵狀態(tài)存儲在兩個寄存器變量中 always (posedge clk or negedge rst) beginif (!rst) beginkey_rst = N1b1; /初始化時給key_rst賦值全為1,中表示N個1 key_rst_pre = N1b1; end else beginkey_rst = key; /第一個時鐘上升沿觸發(fā)之后key的值賦給key_rst,
9、同時key_rst的值賦給key_rst_prekey_rst_pre = key_rst; /非阻塞賦值。相當(dāng)于經(jīng)過兩個時鐘觸發(fā),key_rst存儲的是當(dāng)前時刻key的值,key_rst_pre存儲的是前一個時鐘的key的值 end end assign key_edge = key_rst_pre & (key_rst);/脈沖邊沿檢測。當(dāng)key檢測到下降沿時,key_edge產(chǎn)生一個時鐘周期的高電平 reg17:0 cnt; /產(chǎn)生延時所用的計數(shù)器,系統(tǒng)時鐘12MHz,要延時20ms左右時間,至少需要18位計數(shù)器 /產(chǎn)生20ms延時,當(dāng)檢測到key_edge有效是計數(shù)器清零開始計數(shù) al
10、ways (posedge clk or negedge rst)beginif(!rst)cnt = 18h0; else if(key_edge) cnt = 18h0; else cnt = cnt + 1h1; end reg N-1:0 key_sec_pre; /延時后檢測電平寄存器變量 reg N-1:0 key_sec; /延時后檢測key,如果按鍵狀態(tài)變低產(chǎn)生一個時鐘的高脈沖。如果按鍵狀態(tài)是高的話說明按鍵無效 always (posedge clk or negedge rst)beginif (!rst) key_sec = N1b1; else if (cnt=18h3f
11、fff) key_sec = key; end always (posedge clk or negedge rst)beginif (!rst)key_sec_pre = N1b1; else key_sec_pre = key_sec; end assign key_pulse = key_sec_pre & (key_sec); endmodule4、源碼與源碼圖片module jishuqi(input wire clk,rst, /時鐘和復(fù)位輸入input wire key1, /撥碼計output wire 7:0led,output wire 8:0 segment_led_1,
12、segment_led_2 /數(shù)碼管輸出); wire key_pulse;reg7:0 cnt;/計時計數(shù)器reg 7:0 hud;/百位計數(shù)initial hud7:0 = 8b11111111;always (posedge clk or negedge rst) begin/數(shù)碼管顯示要按照十進(jìn)制的方式顯示 if(!rst)begin cnt = 8h00;hud 7:0 = 8b11111111;endelse if(key_pulse)beginif(cnt3:0 = 4d9)begincnt3:0 = 4d0;if(cnt7:4 = 4d9 )begin cnt7:4 = 4d0
13、;hud7:0 = hud7:0 - 1b1; endelsecnt7:4 = cnt7:4 + 1b1;endelse cnt3:0 = cnt3:0 + 1b1;endelsecnt = cnt;endassign led = hud;segment u2(.seg_data_1(cnt7:4), /g_data input.seg_data_2(cnt3:0), /g_data input.seg_led_1(segment_led_1), /MSBLSB = SEG,DP,G,F,E,D,C,B,A.seg_led_2(segment_led_2) /MSBLSB = SEG,DP,G
14、,F,E,D,C,B,A);debounce u1 ( .clk (clk), .rst (rst), .key (key1), .key_pulse (key_pulse) ); endmodule/按鍵消抖module debounce (clk,rst,key,key_pulse); parameter N = 2; /要消除的按鍵的數(shù)量 input clk; input rst; input N-1:0 key; /輸入的按鍵output N-1:0 key_pulse; /按鍵動作產(chǎn)生的脈沖 reg N-1:0 key_rst_pre; /定義一個寄存器型變量存儲上一個觸發(fā)時的按鍵值
15、 reg N-1:0 key_rst; /定義一個寄存器變量儲存儲當(dāng)前時刻觸發(fā)的按鍵值 wire N-1:0 key_edge; /檢測到按鍵由高到低變化是產(chǎn)生一個高脈沖 /利用非阻塞賦值特點,將兩個時鐘觸發(fā)時按鍵狀態(tài)存儲在兩個寄存器變量中 always (posedge clk or negedge rst) beginif (!rst) beginkey_rst = N1b1; /初始化時給key_rst賦值全為1,中表示N個1 key_rst_pre = N1b1; end else beginkey_rst = key; /第一個時鐘上升沿觸發(fā)之后key的值賦給key_rst,同時ke
16、y_rst的值賦給key_rst_prekey_rst_pre = key_rst; /非阻塞賦值。相當(dāng)于經(jīng)過兩個時鐘觸發(fā),key_rst存儲的是當(dāng)前時刻key的值,key_rst_pre存儲的是前一個時鐘的key的值 end end assign key_edge = key_rst_pre & (key_rst);/脈沖邊沿檢測。當(dāng)key檢測到下降沿時,key_edge產(chǎn)生一個時鐘周期的高電平 reg17:0 cnt; /產(chǎn)生延時所用的計數(shù)器,系統(tǒng)時鐘12MHz,要延時20ms左右時間,至少需要18位計數(shù)器 /產(chǎn)生20ms延時,當(dāng)檢測到key_edge有效是計數(shù)器清零開始計數(shù) always
17、 (posedge clk or negedge rst)beginif(!rst)cnt = 18h0; else if(key_edge) cnt = 18h0; else cnt = cnt + 1h1; end reg N-1:0 key_sec_pre; /延時后檢測電平寄存器變量 reg N-1:0 key_sec; /延時后檢測key,如果按鍵狀態(tài)變低產(chǎn)生一個時鐘的高脈沖。如果按鍵狀態(tài)是高的話說明按鍵無效 always (posedge clk or negedge rst)beginif (!rst) key_sec = N1b1; else if (cnt=18h3ffff)
18、 key_sec = key; end always (posedge clk or negedge rst)beginif (!rst)key_sec_pre = N1b1; else key_sec_pre = key_sec; end assign key_pulse = key_sec_pre & (key_sec); endmodulemodule segment (seg_data_1,seg_data_2,seg_led_1,seg_led_2); input 3:0 seg_data_1;/數(shù)碼管需要顯示09十個數(shù)字,所以最少需要4位輸入做譯碼input 3:0 seg_data_2;/小腳丫上第二個數(shù)碼管output 8:0 seg_led_1;/在小腳丫上控制一個數(shù)碼管需要9個信號 MSBLSB=DIG、DP、G、F、E、D、C、B
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 深井泵房施工組織設(shè)計
- 歷年英語四級真題及答案
- 2025年華師大新版七年級歷史下冊月考試卷
- 2025年外研版九年級歷史上冊月考試卷含答案
- 2025年浙教版九年級歷史下冊階段測試試卷
- 2025年華師大版選擇性必修3歷史下冊階段測試試卷
- 2025年度農(nóng)機環(huán)保技術(shù)合作開發(fā)合同范本4篇
- 房屋建筑設(shè)計合同(2篇)
- 擔(dān)保合同補充協(xié)議書(2篇)
- 2025年度綠色建筑項目除草與節(jié)能合同3篇
- 數(shù)學(xué)-山東省2025年1月濟南市高三期末學(xué)習(xí)質(zhì)量檢測濟南期末試題和答案
- 中儲糧黑龍江分公司社招2025年學(xué)習(xí)資料
- 湖南省長沙市2024-2025學(xué)年高一數(shù)學(xué)上學(xué)期期末考試試卷
- 船舶行業(yè)維修保養(yǎng)合同
- 2024年林地使用權(quán)轉(zhuǎn)讓協(xié)議書
- 物流有限公司安全生產(chǎn)專項整治三年行動實施方案全國安全生產(chǎn)專項整治三年行動計劃
- 2025屆江蘇省13市高三最后一卷生物試卷含解析
- 產(chǎn)鉗助產(chǎn)護(hù)理查房
- 招聘專員轉(zhuǎn)正述職報告
- GB/T 31525-2015圖形標(biāo)志電動汽車充換電設(shè)施標(biāo)志
- 裝飾業(yè)務(wù)員培訓(xùn)教程方案
評論
0/150
提交評論