verilog實驗-計數器實驗報告(共22頁)_第1頁
verilog實驗-計數器實驗報告(共22頁)_第2頁
verilog實驗-計數器實驗報告(共22頁)_第3頁
verilog實驗-計數器實驗報告(共22頁)_第4頁
verilog實驗-計數器實驗報告(共22頁)_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、計數器1、實現目標及介紹實驗實現了一個簡易的計數器,計數范圍可達899(0899),通過key4按鍵計數,每按下一次,計數加一,百位數顯示在led上,個位與十位顯示在數碼管上。為十進制計數,數碼管1計數到九后置零。數碼管2獲得進位加一,數碼管2到9后當再次獲得個位進位時再次向百位進一,點亮led1,每百位點亮一個led。此外key4為清零鍵,可隨時按鍵清零。2、效果展示計數99清零計數100視頻展示(雙擊觀看)3、代碼實現與模塊分析1.頂層模塊module jishuqi(input wire clk,rst, /時鐘和復位輸入input wire key1, /撥碼計output wire

2、7:0led,output wire 8:0 segment_led_1,segment_led_2 /數碼管輸出); wire key_pulse;reg7:0 cnt;/計時計數器reg 7:0 hud;/百位計數initial hud7:0 = 8b11111111;always (posedge clk or negedge rst) begin/數碼管顯示要按照十進制的方式顯示 if(!rst)begin cnt = 8h00;hud 7:0 = 8b11111111;endelse if(key_pulse)beginif(cnt3:0 = 4d9)/個位進位判斷begincnt3

3、:0 = 4d0;if(cnt7:4 = 4d9 )/十位進位判斷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;/例化調用數碼管顯示模塊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);/例化調用消抖模塊debounce u1 ( .clk (clk), .rst (rst), .key (key1), .key_pulse (key_pulse) ); endmodule2.數碼管顯示模塊module segment (seg_data_1,seg_data_2,seg_led_1,seg_led_2); input 3:0 seg_data_1;/數碼管需要顯示09十個數字,所以最少需要4位輸入做譯碼input 3:0

5、seg_data_2;/小腳丫上第二個數碼管output 8:0 seg_led_1;/在小腳丫上控制一個數碼管需要9個信號 MSBLSB=DIG、DP、G、F、E、D、C、B、Aoutput 8:0 seg_led_2;/在小腳丫上第二個數碼管的控制信號 MSBLSB=DIG、DP、G、F、E、D、C、B、A reg 8:0 seg 9:0; /定義了一個reg型的數組變量,相當于一個10*9的存儲器,存儲器一共有10個數,每個數有9位寬 initial /在過程塊中只能給reg型變量賦值,Verilog中有兩種過程塊always和initial /initial和always不同,其中語句

6、只執(zhí)行一次 begin seg0 = 9h3f; /對存儲器中第一個數賦值9b00_0011_1111,相當于共陰極接地,DP點變低不亮,7段顯示數字 0 seg1 = 9h06; /7段顯示數字 1 seg2 = 9h5b; /7段顯示數字 2 seg3 = 9h4f; /7段顯示數字 3 seg4 = 9h66; /7段顯示數字 4 seg5 = 9h6d; /7段顯示數字 5 seg6 = 9h7d; /7段顯示數字 6 seg7 = 9h07; /7段顯示數字 7 seg8 = 9h7f; /7段顯示數字 8 seg9 = 9h6f; /7段顯示數字 9 end assign seg_

7、led_1 = segseg_data_1; /連續(xù)賦值,這樣輸入不同四位數,就能輸出對于譯碼的9位輸出 assign seg_led_2 = segseg_data_2; endmodule3.按鍵消抖模塊/按鍵消抖module debounce (clk,rst,key,key_pulse); parameter N = 2; /要消除的按鍵的數量 input clk; input rst; input N-1:0 key; /輸入的按鍵output N-1:0 key_pulse; /按鍵動作產生的脈沖 reg N-1:0 key_rst_pre; /定義一個寄存器型變量存儲上一個觸發(fā)時

8、的按鍵值 reg N-1:0 key_rst; /定義一個寄存器變量儲存儲當前時刻觸發(fā)的按鍵值 wire N-1:0 key_edge; /檢測到按鍵由高到低變化是產生一個高脈沖 /利用非阻塞賦值特點,將兩個時鐘觸發(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; /非阻塞賦值。相當于經過兩個時鐘觸發(fā),key_rst存儲的是當前時刻key的值,key_rst_pre存儲的是前一個時鐘的key的值 end end assign key_edge = key_rst_pre & (key_rst);/脈沖邊沿檢測。當key檢測到下降沿時,key_edge產生一個時鐘周期的高電平 reg17:0 cnt; /產生延時所用的計數器,系統(tǒng)時鐘12MHz,要延時20ms左右時間,至少需要18位計數器 /產生20ms延時,當檢測到key_edge有效是計數器清零開始計數 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)變低產生一個時鐘的高脈沖。如果按鍵狀態(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, /時鐘和復位輸入input wire key1, /撥碼計output wire 7:0led,output wire 8:0 segment_led_1,

12、segment_led_2 /數碼管輸出); wire key_pulse;reg7:0 cnt;/計時計數器reg 7:0 hud;/百位計數initial hud7:0 = 8b11111111;always (posedge clk or negedge rst) begin/數碼管顯示要按照十進制的方式顯示 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; /要消除的按鍵的數量 input clk; input rst; input N-1:0 key; /輸入的按鍵output N-1:0 key_pulse; /按鍵動作產生的脈沖 reg N-1:0 key_rst_pre; /定義一個寄存器型變量存儲上一個觸發(fā)時的按鍵值

15、 reg N-1:0 key_rst; /定義一個寄存器變量儲存儲當前時刻觸發(fā)的按鍵值 wire N-1:0 key_edge; /檢測到按鍵由高到低變化是產生一個高脈沖 /利用非阻塞賦值特點,將兩個時鐘觸發(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; /非阻塞賦值。相當于經過兩個時鐘觸發(fā),key_rst存儲的是當前時刻key的值,key_rst_pre存儲的是前一個時鐘的key的值 end end assign key_edge = key_rst_pre & (key_rst);/脈沖邊沿檢測。當key檢測到下降沿時,key_edge產生一個時鐘周期的高電平 reg17:0 cnt; /產生延時所用的計數器,系統(tǒng)時鐘12MHz,要延時20ms左右時間,至少需要18位計數器 /產生20ms延時,當檢測到key_edge有效是計數器清零開始計數 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)變低產生一個時鐘的高脈沖。如果按鍵狀態(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;/數碼管需要顯示09十個數字,所以最少需要4位輸入做譯碼input 3:0 seg_data_2;/小腳丫上第二個數碼管output 8:0 seg_led_1;/在小腳丫上控制一個數碼管需要9個信號 MSBLSB=DIG、DP、G、F、E、D、C、B

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論