矩陣鍵盤工程參考代碼_第1頁(yè)
矩陣鍵盤工程參考代碼_第2頁(yè)
矩陣鍵盤工程參考代碼_第3頁(yè)
矩陣鍵盤工程參考代碼_第4頁(yè)
矩陣鍵盤工程參考代碼_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、明德?lián)P科技教育矩陣鍵盤工程參考代碼官網(wǎng):淘寶:群目錄counter 模塊3hex2dec 模塊4key_prj 模塊6key_scan 模塊8seg_disp 模塊14test_key_prj 模塊18明德?lián)P科技公司主要是以FPGA 為,專業(yè)從事 FPGA 配套和開(kāi)發(fā)板、FPGA加入明德?lián)P FPGA培訓(xùn)班或其他培訓(xùn)、研發(fā) FPGA 技術(shù)、承接 FPGA 項(xiàng)目開(kāi)發(fā)。歡迎和 ASIC97925396。明德?lián)P以 PDF 格式提供源代碼,是為了鼓勵(lì)大家多思考,不要拿來(lái)就用,否則是學(xué)不好 FPGA 的。本代碼對(duì)應(yīng)的設(shè)計(jì)思路,請(qǐng)參考明德?lián)P課程。counter 模塊module counter(clkrst

2、_n,din_vld , dout dout_vld);,/參數(shù)定義parameterNUM =3;/輸入信號(hào)定義 inputinputinputclk;rst_n; din_vld;/輸出信號(hào)定義output4*NUM-1:0 outputdout;dout_vld;/輸出信號(hào) reg 定義reg wire reg wirewire4*NUM-1:04*NUM-1:0dout;dout_temp; dout_vld ; tempNUM-1:0;add_1_flagNUM-1:0;3:0genvar ii;generatefor(ii=0;iiNUM;ii=ii+1)begin:A_BRKas

3、sign tempii= dout(ii+1)*4-1 -:4;if(ii=0)assign elseassignadd_1_flagii = din_vld;add_1_flagii = (add_1_flagii-1 & tempii-1=9);assigndout_temp(ii+1)*4-1-:4=(add_1_flagii)?(tempii=9)?0:(tempii+1):tempii; endendgeneratealways(edge clk or negedge rst_n)beginif(rst_n=1b0)begin dout = 0;endelse begindout =

4、 dout_temp;endendalways(edge clk or negedge rst_n)beginif(rst_n=1b0)begin dout_vld = 1b0;endelse begindout_vld = din_vld;endendendmodulehex2dec 模塊module hex2dec(clkrst_n,din_vld , dindout dout_vld);,/參數(shù)定義parameterNUM =3;/輸入信號(hào)定義 inputinput inputinput 3:0clk;rst_n; din_vld;din;/輸出信號(hào)定義output7:0 outputd

5、out;dout_vld;/輸出信號(hào) reg 定義regreg7:0dout;dout_vld ;always(edge clk or negedge rst_n)beginif(rst_n=1b0)begin dout3:0 9)begin dout3:0 = din-10;endelse begindout3:0 = din;endendalways(edge clk or negedge rst_n)beginif(rst_n=1b0)begin dout7:4 9) begin dout7:4 = 1;endelse begindout7:4 = 0;endendalways(edge

6、 clk or negedge rst_n)beginif(rst_n=1b0)begin dout_vld = 1b0;endelse begindout_vld = din_vld;endendendmodulekey_prj 模塊module key_prj( clk,rst_n,/其他信號(hào),舉例 dout key_col,key_row, seg_sel, segment);parameter parameterTIME_20MSTIME_20US=1000000;=1000;/輸入信號(hào)定義 inputinputinput 3:0clk;rst_n; key_col;/輸出信號(hào)定義 o

7、utput 3:0output 4:0output 7:0key_row; seg_sel;segment;/輸出信號(hào) reg 定義wire wirewire 3:0 4:0 7:0key_row; seg_sel;segment;wire wire wire wire wirewire3:0key_out; key_vld;cnt_dout; cnt_dout_vld; hex2dec_dout;hex2dec_dout_vld;4*3-1:07:0key_scan #(.TIME_20MS(TIME_20MS) u_key_scan(.clk(clk),.rst_n(rst_n),.key

8、_col(key_col),.key_row(key_row),.key_out(key_out),.key_vld(key_vld);counter#(.NUM(3) u_counter(.clk.rst_n(clk(rst_n),),.din_vld (key_vld ),.dout(cnt_dout),.dout_vld(cnt_dout_vld);hex2decu_hex2dec(.clk.rst_n(clk(rst_n),),.din_vld (key_vld ),.din.dout(key_out ),(hex2dec_dout),.dout_vld(hex2dec_dout_vl

9、d);seg_disp#(.SEG_NUM(5),.TIME_20US(TIME_20US)u_seg_disp(.rst_n.clk.din(rst_n(clk),),(cnt_dout,hex2dec_dout),.din_vld (3cnt_dout_vld,2hex2dec_dout_vld),.seg_sel (seg_sel ),.segment (segment );endmodulekey_scan 模塊/*本代碼由明德?lián)P精心設(shè)計(jì)和制作。希望通過(guò)規(guī)范、嚴(yán)謹(jǐn)?shù)拇a,使接觸到純正的集成電路/FPGA 代碼。明德?lián)P長(zhǎng)期招募成員,可免費(fèi)培訓(xùn),歡迎集成電路/FPGA者加入。:979253

10、96學(xué)習(xí)*/*明德?lián)P科教 注釋開(kāi)始*模塊功能說(shuō)明:開(kāi)發(fā)板上有一組矩陣鍵盤,每當(dāng)有按鍵按下時(shí),通過(guò)行掃描法來(lái)確定是哪個(gè)按鍵按下的。接口定義:clkrst_n:時(shí)鐘信號(hào),頻率是 50MHz復(fù)位信號(hào),在低電平時(shí)有效矩陣鍵盤列信號(hào),默認(rèn)上拉矩陣鍵盤行信號(hào),默認(rèn)輸出低電平按鍵有效信號(hào),默認(rèn)輸出按鍵位置信號(hào),默認(rèn)輸出明德?lián)P科教 注釋結(jié)束*/key_col : key_row : key_vld : key_out :*modulekey_scan(clk,rst_n, key_col,key_row,key_out, key_vld);/*明德?lián)P科教 注釋開(kāi)始*參數(shù)定義,明德?lián)P規(guī)范要求,verilog 內(nèi)

11、的用到的數(shù)字,都使用參數(shù)表示。參數(shù)信號(hào)全部大寫*parameter parameter parameter parameter parameter parameterparameter明德?lián)P科教 注釋結(jié)束*/KEY_W= CHK_COL CHK_ROWDELAY4 ;=0 ;1 ;2 ;3 ;16;1000000;WAIT_END =T= TIME_20MS=/輸入信號(hào)定義 inputinputclk;rst_n; key_col;input3:0/輸出信號(hào)定義 output output3:0outputKEY_W-1:0key_vld; key_out;key_row;/輸出信號(hào) reg

12、定義reg regreg3:0KEY_W-1:0key_out; key_row;key_vld;reg 3:0reg 3:0reg 1:0 wirereg reg3:0reg 19:0reg3:0reg 1:0reg15:0key_col_ff0; key_col_ff1; key_col_get;shake_flag ;shake_flag_ff0;se_c;t;se_n;row_index;t;/*異步處理,打兩拍*明德?lián)P科教 注釋開(kāi)始*明德?lián)P科教 注釋結(jié)束*/always(edge clk or negedge rst_n)beginif(rst_n=1b0)begin key_col

13、_ff0 = 4b1111; key_col_ff1 = 4b1111;endelse beginkey_col_ff0 = key_col key_col_ff1 =TIME_20MS-1;always(edge clk or negedge rst_n)beginif(rst_n=1b0)begint = 0;endelse if(key_col_ff1!=4hf)begin if(shake_flag)t =elset =endelse begint = 0;endt;t + 1;end/*狀態(tài)機(jī)設(shè)計(jì)明德?lián)P科教 注釋開(kāi)始*CHK_COL:檢查列線是否有低電平,并且沒(méi)有抖動(dòng),保持 20ms

14、 以上 CHK_ROW: 逐個(gè)將行線置低電平,檢查列線是否有低電平 DELAY: 由于輸出行線,再得到列線,有一定延時(shí)WAIT_END:等待結(jié)束,即列線全部為 1*always(明德?lián)P科教 注釋結(jié)束*/edge clk or negedge rst_n)beginif(rst_n=1b0)beginse_c = CHK_COL;endelse beginse_c = se_n;endendalways(*)begin case(se_c)CHK_COL: beginif(shake_flag & shake_flag_ff0=1b0)begin se_n = CHK_ROW;endelse b

15、eginse_n = CHK_COL;endend CHK_ROW: beginif(row_index=3 &se_n = DELAY;endelse begint=0)beginse_n = CHK_ROW;endend DELAY :beginif(t=0)begine_n = WAIT_END;sendelse beginse_n = DELAY;endend WAIT_END: beginif(key_col_ff1=4hf)begin se_n = CHK_COL;endelse beginse_n = WAIT_END;endenddefault: se_n = CHK_COL;

16、 endcaseendalways(edge clk or negedge rst_n)beginif(rst_n=1b0)begin key_row = 4b0;endelse if(se_c=CHK_ROW)begin key_row = (1b1 row_index);endelse beginkey_row = 4b0;endendalways(edge clk or negedge rst_n)beginif(rst_n=1b0)begin row_index = 0;endelse if(se_c=CHK_ROW)beginif(t=0)begin if(row_index=3)r

17、ow_index = 0;elserow_index = row_index + 1;endendelse beginrow_index = 0;endendalways(edge clk or negedge rst_n)beginif(rst_n=1b0)begint =endT;else if(se_c=CHK_ROW | se_c=DELAY) beginif(t=0)begint =T;endelse begint =t - 1;endendelse begint =T;endendalways(edge clk or negedge rst_n)beginif(rst_n=1b0)

18、begin shake_flag_ff0 = 1b0;endelse beginshake_flag_ff0 = shake_flag;endendalways(edge clk or negedge rst_n)beginif(rst_n=1b0)begin key_col_get = 0;endelse if(se_c=CHK_COL & shake_flag=1b1 & shake_flag_ff0=1b0) begin if(key_col_ff1=4b1110)key_col_get = 0;else if(key_col_ff1=4b1101) key_col_get = 1;el

19、se if(key_col_ff1=4b1011) key_col_get = 2;elsekey_col_get = 3;endendalways(edge clk or negedge rst_n)beginif(rst_n=1b0)begin key_out = 0;endelse if(se_c=CHK_ROW &t=0)beginkey_out = row_index,key_col_get;endelse beginkey_out = 0;endendalways(edge clk or negedge rst_n)beginif(rst_n=1b0)begin key_vld =

20、 1b0;endelse if(se_c=CHK_ROW & key_vld = 1b1;endelse beginkey_vld = 1b0;endt=0 & key_col_ff1key_col_get=1b0)beginendendmoduleseg_disp 模塊/*本代碼由明德?lián)P精心設(shè)計(jì)和制作。希望通過(guò)規(guī)范、嚴(yán)謹(jǐn)?shù)拇a,使接觸到純正的集成電路/FPGA 代碼。明德?lián)P長(zhǎng)期招募成員,可免費(fèi)培訓(xùn),歡迎集成電路/FPGA者加入。學(xué)習(xí):97925396*/*明德?lián)P科教 注釋開(kāi)始*模塊功能說(shuō)明:設(shè)計(jì)一個(gè)數(shù)碼管顯示,顯示 0 時(shí)停止 1 秒;顯示 1 時(shí)停止 2 秒;依次類推,顯示 9 時(shí)停止 1

21、0 秒。接口定義:clk rst_n seg_sel segment: 時(shí)鐘信號(hào),頻率是 50MHz: 復(fù)位信號(hào),在低電平時(shí)有效: 位選信號(hào),在低電平是該位置數(shù)碼管亮。:信號(hào),共 8 位。由低到高,分別表示數(shù)碼管的 a,b,c,d,e,f,g,點(diǎn)。當(dāng)該比特為 0 時(shí),表示點(diǎn)亮相應(yīng)位置;為 1 時(shí)熄滅。*明德?lián)P科教 注釋結(jié)束*/moduleseg_disp(rst_nclk dindin_vld seg_sel segment);,/*明德?lián)P科教 注釋開(kāi)始*參數(shù)定義,明德?lián)P規(guī)范要求,verilog 內(nèi)的用到的數(shù)字,都使用參數(shù)表示。參數(shù)信號(hào)全部大寫*明德?lián)P科教 注釋結(jié)束*/parameter pa

22、rameter parameterparameterSEG_WID SEG_NUM COUNT_WIDTIME_20US=8;8;26;20d1000;parameter parameter parameter parameter parameter parameter parameter parameter parameter parameterparameterNUM_0 NUM_1 NUM_2 NUM_3 NUM_4 NUM_5 NUM_6 NUM_7 NUM_8 NUM_9NUM_ERR=8b1100_0000;8b1111_1001;8b1010_0100;8b1011_0000;8

23、b1001_1001;8b1001_0010;8b1000_0010;8b1111_1000;8b1000_0000;8b1001_0000;8b1000_0110;input input inputinputclk; rst_n; din; din_vld; seg_sel;segment;SEG_NUM*4-1:0SEG_NUM-1:0output SEG_NUM-1:0output SEG_WID-1:0reg regregSEG_NUM-1:0SEG_WID-1:0 COUNT_WID-1:0seg_sel; segment;count_20us;reg reg reg wireege

24、rSEG_NUM-1:04*SEG_NUM-1:0t; din_ff0;seg_tmp; flag_20us;ii;4-1:0assignflag_20us = count_20us=TIME_20US-1;always(edge clk or negedge rst_n)beginif(rst_n=1b0)begin count_20us=26b0;endelse if(flag_20us) begin count_20us=0;endelse begincount_20us=count_20us+1b1;endendalways(edge clk or negedge rst_n)begi

25、nif(rst_n=1b0)begint = 0;endelse if(flag_20us) beginif(t=SEG_NUM-1)t = 0;elset =t + 1;endendalways(edge clk or negedge rst_n)beginif(rst_n=1b0)beginseg_sel = SEG_NUM1b1;endelse beginseg_sel = (1b1 t);endendalways(edge clk or negedge rst_n)beginif(rst_n=1b0)begin din_ff0 = 0;endelse beginfor(ii=0;iiS

26、EG_NUM;ii=ii+1)begin if(din_vldii=1b1)begindin_ff0(ii+1)*4-1 -:4 = din(ii+1)*4-1 -:4;endelse begindin_ff0(ii+1)*4-1 -:4 = din_ff0(ii+1)*4-1 -:4;endendendendalways(*)begin seg_tmp = din_ff0(endt+1)*4-1 -:4;always(edge clk or negedge rst_n)beginif(rst_n=1b0)begin segment=NUM_0;endelse if(seg_tmp=0)beg

27、in segment=NUM_0;endelse if(seg_tmp=1)begin segment=NUM_1;endelse if(seg_tmp=2)begin segment=NUM_2;endelse if(seg_tmp=3)begin segment=NUM_3;endelse if(seg_tmp=4)begin segment=NUM_4;endelse if(seg_tmp=5)begin segment=NUM_5;endelse if(seg_tmp=6)begin segment=NUM_6;endelse if(seg_tmp=7)begin segment=NUM_7;endelse if(seg_tmp=8)begin segment=NUM_8;endelse if(seg_tmp=9)begin segment=NUM_9;endelse beginsegment=NUM_ERR;endendendmoduletest_key_prj 模塊timescale 1 ns/1 nsmodule test_key_prj();/時(shí)鐘和復(fù)位 regregclkrst_n key_col;reg3:0/

溫馨提示

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

評(píng)論

0/150

提交評(píng)論