矩阵键盘工程参考代码_第1页
矩阵键盘工程参考代码_第2页
矩阵键盘工程参考代码_第3页
矩阵键盘工程参考代码_第4页
矩阵键盘工程参考代码_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、明德扬科技教育矩阵键盘工程参考代码官网:淘宝:群目录counter 模块3hex2dec 模块4key_prj 模块6key_scan 模块8seg_disp 模块14test_key_prj 模块18明德扬科技公司主要是以FPGA 为,专业从事 FPGA 配套和开发板、FPGA加入明德扬 FPGA培训班或其他培训、研发 FPGA 技术、承接 FPGA 项目开发。欢迎和 ASIC97925396。明德扬以 PDF 格式提供源代码,是为了鼓励大家多思考,不要拿来就用,否则是学不好 FPGA 的。本代码对应的设计思路,请参考明德扬课程。counter 模块module counter(clkrst

2、_n,din_vld , dout dout_vld);,/参数定义parameterNUM =3;/输入信号定义 inputinputinputclk;rst_n; din_vld;/输出信号定义output4*NUM-1:0 outputdout;dout_vld;/输出信号 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);,/参数定义parameterNUM =3;/输入信号定义 inputinput inputinput 3:0clk;rst_n; din_vld;din;/输出信号定义output7:0 outputd

5、out;dout_vld;/输出信号 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,/其他信号,举例 dout key_col,key_row, seg_sel, segment);parameter parameterTIME_20MSTIME_20US=1000000;=1000;/输入信号定义 inputinputinput 3:0clk;rst_n; key_col;/输出信号定义 o

7、utput 3:0output 4:0output 7:0key_row; seg_sel;segment;/输出信号 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 模块/*本代码由明德扬精心设计和制作。希望通过规范、严谨的代码,使接触到纯正的集成电路/FPGA 代码。明德扬长期招募成员,可免费培训,欢迎集成电路/FPGA者加入。:979253

10、96学习*/*明德扬科教 注释开始*模块功能说明:开发板上有一组矩阵键盘,每当有按键按下时,通过行扫描法来确定是哪个按键按下的。接口定义:clkrst_n:时钟信号,频率是 50MHz复位信号,在低电平时有效矩阵键盘列信号,默认上拉矩阵键盘行信号,默认输出低电平按键有效信号,默认输出按键位置信号,默认输出明德扬科教 注释结束*/key_col : key_row : key_vld : key_out :*modulekey_scan(clk,rst_n, key_col,key_row,key_out, key_vld);/*明德扬科教 注释开始*参数定义,明德扬规范要求,verilog 内

11、的用到的数字,都使用参数表示。参数信号全部大写*parameter parameter parameter parameter parameter parameterparameter明德扬科教 注释结束*/KEY_W= CHK_COL CHK_ROWDELAY4 ;=0 ;1 ;2 ;3 ;16;1000000;WAIT_END =T= TIME_20MS=/输入信号定义 inputinputclk;rst_n; key_col;input3:0/输出信号定义 output output3:0outputKEY_W-1:0key_vld; key_out;key_row;/输出信号 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;/*异步处理,打两拍*明德扬科教 注释开始*明德扬科教 注释结束*/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/*状态机设计明德扬科教 注释开始*CHK_COL:检查列线是否有低电平,并且没有抖动,保持 20ms

14、 以上 CHK_ROW: 逐个将行线置低电平,检查列线是否有低电平 DELAY: 由于输出行线,再得到列线,有一定延时WAIT_END:等待结束,即列线全部为 1*always(明德扬科教 注释结束*/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 模块/*本代码由明德扬精心设计和制作。希望通过规范、严谨的代码,使接触到纯正的集成电路/FPGA 代码。明德扬长期招募成员,可免费培训,欢迎集成电路/FPGA者加入。学习:97925396*/*明德扬科教 注释开始*模块功能说明:设计一个数码管显示,显示 0 时停止 1 秒;显示 1 时停止 2 秒;依次类推,显示 9 时停止 1

21、0 秒。接口定义:clk rst_n seg_sel segment: 时钟信号,频率是 50MHz: 复位信号,在低电平时有效: 位选信号,在低电平是该位置数码管亮。:信号,共 8 位。由低到高,分别表示数码管的 a,b,c,d,e,f,g,点。当该比特为 0 时,表示点亮相应位置;为 1 时熄灭。*明德扬科教 注释结束*/moduleseg_disp(rst_nclk dindin_vld seg_sel segment);,/*明德扬科教 注释开始*参数定义,明德扬规范要求,verilog 内的用到的数字,都使用参数表示。参数信号全部大写*明德扬科教 注释结束*/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();/时钟和复位 regregclkrst_n key_col;reg3:0/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论