集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2417|回复: 4

矩阵键盘+ 数码管 Verilog

[复制链接]
ylu 发表于 2012-2-25 16:02:52 | 显示全部楼层 |阅读模式
求助用FPGA实现矩阵键盘的数码管显示,代码不知道哪里还有问题,就是不能正常显示键值,感觉显示都是乱码
  1. module key4x4(kbrow,seg7_out,scan,clk,rst,kbcol);

  2. output[6:0] seg7_out;//7段显示控制信号(a,b,c,d,e,f,g)

  3. output[2:0] scan; //数码管段地址选择

  4. output[3:0] kbrow; //列扫描信号

  5. input rst; //复位信号

  6. input[3:0] kbcol; //行扫描信号

  7. input clk; //信号

  8. reg[6:0] seg7_out;

  9. reg[2:0] scan;

  10. reg[3:0] kbrow;

  11. reg[1:0] count;

  12. reg[1:0] sta;

  13. reg[6:0] seg7;

  14. reg[4:0] dat;

  15. reg fn; //按键按下 标志位 ,判断是否有按键按下

  16. initial scan<=3'b010; //只使用一个数码管显示

  17. always @(posedge clk)

  18. begin

  19. if(!rst)

  20. begin dat<=5'b10000;end//全灭

  21. else

  22. begin

  23. count<=count+1'b1; //循环扫描列 ,列扫描

  24. case(count)

  25. 2'b00: begin kbrow<=4'b1110;sta<=2'b00;end

  26. 2'b01: begin kbrow<=4'b1101;sta<=2'b01;end

  27. 2'b10: begin kbrow<=4'b1011;sta<=2'b10;end

  28. 2'b11: begin kbrow<=4'b0111;sta<=2'b11;end
  29. endcase                                //行扫描译


  30. case(sta)

  31. 2'b00:begin

  32. case(kbcol)

  33. 4'b1110:begin dat<=5'd3;end //3

  34. 4'b1101:begin dat<=5'd2;end //2

  35. 4'b1011:begin dat<=5'd1;end //1

  36. 4'b0111:begin dat<=5'd0;end //0

  37. default:begin dat<=5'b11111;end

  38. endcase

  39. end

  40. 2'b01:begin

  41. case(kbcol)

  42. 4'b1110:begin dat<=5'b00111;end //7

  43. 4'b1101:begin dat<=5'b00110;end //6

  44. 4'b1011:begin dat<=5'b00101;end //5

  45. 4'b0111:begin dat<=5'b00100;end //4

  46. default:begin dat<=5'b11111;end

  47. endcase

  48. end

  49. 2'b10:begin

  50. case(kbcol)

  51. 4'b1110:begin dat<=5'b01011;end //11 B

  52. 4'b1101:begin dat<=5'b01010;end //10A

  53. 4'b1011:begin dat<=5'b01001;end //9

  54. 4'b0111:begin dat<=5'b01000;end //8

  55. default:begin dat<=5'b11111;end

  56. endcase

  57. end

  58. 2'b11:begin

  59. case(kbcol)

  60. 4'b1110:begin dat<=5'b01111;end //15 F

  61. 4'b1101:begin dat<=5'b01110;end //14 E

  62. 4'b1011:begin dat<=5'b01101;end //13 D

  63. 4'b0111:begin dat<=5'b01100;end //12 C

  64. default:begin dat<=5'b11111;end

  65.                 endcase

  66.                 end

  67.         endcase

  68.   end

  69. end

  70. always @(dat)

  71. begin

  72. begin fn<=~(dat[0]&dat[1]&dat[2]&dat[3]&dat[4]);
  73. end

  74. case(dat)

  75. 5'b01111:begin seg7[6:0]<=7'b1110001;end

  76. 5'b01110:begin seg7[6:0]<=7'b1111001;end

  77. 5'b01101:begin seg7[6:0]<=7'b1011110;end

  78. 5'b01100:begin seg7[6:0]<=7'b0111001;end

  79. 5'b01011:begin seg7[6:0]<=7'b1111100;end

  80. 5'b01010:begin seg7[6:0]<=7'b1110111;end

  81. 5'd9:begin seg7[6:0]<=7'b1101111;end

  82. 5'd8:begin seg7[6:0]<=7'b1111111;end

  83. 5'd7:begin seg7[6:0]<=7'b0000111;end

  84. 5'd6:begin seg7[6:0]<=7'b1111101;end

  85. 5'd5:begin seg7[6:0]<=7'b1101101;end

  86. 5'd4:begin seg7[6:0]<=7'b1100110;end

  87. 5'd3:begin seg7[6:0]<=7'b1001111;end

  88. 5'd2:begin seg7[6:0]<=7'b1011011;end

  89. 5'd1:begin seg7[6:0]<=7'b0000110;end

  90. 5'd0:begin seg7[6:0]<=7'b0111111;end

  91. default: begin seg7[6:0]<=7'b0000000;end
  92.                
  93.         endcase

  94. end

  95. always @(posedge fn)

  96.     begin seg7_out[6:0]<=seg7[6:0];
  97.     end
  98. endmodule
复制代码
jahero 发表于 2012-2-25 21:38:08 | 显示全部楼层
91 109 127的default是致命错误 应该删除 直接将seg7进行输出 废掉fn信号和与之相关的139-144行代码
 楼主| ylu 发表于 2012-2-26 17:06:43 | 显示全部楼层
谢谢上楼的建议,小弟重新修改了下,可是效果还是一样,按键是数码管总是闪,看不清,一靠近键盘也闪,不知道是不是其他方面的问题,还请大侠指教
jahero 发表于 2012-2-26 17:37:56 | 显示全部楼层
73行别忘删了 139-141别删 就删143 144 。如果按下去一瞬间数字闪动然后就保持稳定 就再做个按键防抖。 如果数字稳定了 但显示的数不正确 告诉我 我再告诉你为什么不正确
 楼主| ylu 发表于 2012-2-26 20:36:50 | 显示全部楼层
73删了,186-189行改成assign seg7_out[6:0]=seg7[6:0];还有都按照你说的改了,可是效果还是不行,数码管都是有阴影的,跳呀跳的,没有出现你说的情况
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-5-1 07:16 , Processed in 0.146176 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表