当前位置:   article > 正文

基于FPGA的数字密码锁电路设计(含程序)_基于fpga的密码锁设计

基于fpga的密码锁设计

题目

设计思路

代码设计

题目

(1)4个按键分别设置4位数码管上的显示数字,当按键设置的数字与设置的4位密码一致时,蜂鸣器响,表示锁打开;

(2)具备通过按键手动修改数字密码的功能;

(3)具备按键消抖电路功能;

(4)一定时间内无操作数字显示回到初始状态,数码管显示倒计时。

设计思路

        我们可以用四个同bit位宽的寄存器把密码寄存起来,在按键时不断将现在按键的值与密码的寄存器对比,当所有对应位都相同时,蜂鸣器响,可以用一个标志位表示所有对应位相同,蜂鸣器工作的条件就是标志位给出的。

        由于需要按键手动修改密码,那么数码管显示就有两种状态,一种是修改密码,一种是输入密码。我通过增加一个按键来控制这两种状态,当按下这个按键时进入修改密码阶段,当再次按下时进入输入密码阶段。

        按键消抖部分我之前写过,可以看之前的按键消抖

        一定时间无操作进入初始状态,我设定这个时间为15秒,保证15秒的刷新时间是实时性,采样前后时刻的对比,当所有按键的前一时刻与后一时刻相同时开始倒计时,不同时重新倒计时,保证回归初始与最后操作之间有15秒间隔。

        我额外增加一个led用来显示修改密码和不修改密码的两种状态,方便区别。

代码设计

密码设计部分

  1. module lock(
  2. input clk ,
  3. input rstn ,
  4. input shape_key1 ,
  5. input shape_key2 ,
  6. input shape_key3 ,
  7. input shape_key4 ,
  8. input shape_amend,
  9. output reg [3:0] data1 ,
  10. output reg [3:0] data2 ,
  11. output reg [3:0] data3 ,
  12. output reg [3:0] data4 ,
  13. output reg [3:0] data5 ,
  14. output reg [3:0] data6 ,
  15. output reg buzzer ,
  16. output reg led
  17. );
  18. reg flag1;
  19. wire [3:0]button1,button2,button3,button4;
  20. wire button_amend;
  21. button button (
  22. .clk(clk),
  23. .rstn(rstn),
  24. .flag1(flag1),
  25. .shape_key1(shape_key1),
  26. .shape_key2(shape_key2),
  27. .shape_key3(shape_key3),
  28. .shape_key4(shape_key4),
  29. .shape_amend(shape_amend),
  30. .button1(button1),
  31. .button2(button2),
  32. .button3(button3),
  33. .button4(button4),
  34. .button_amend(button_amend)
  35. );
  36. reg [3:0]b1,b2,b3,b4;
  37. always@(posedge clk)
  38. begin
  39. b1<=button1;
  40. b2<=button2;
  41. b3<=button3;
  42. b4<=button4;
  43. end
  44. reg m;
  45. always@(posedge clk or negedge rstn)
  46. begin
  47. if(!rstn)
  48. m<=0;
  49. else if((button1==0)&&(button2==0)&&(button3==0)&&(button4==0))
  50. m<=0; //防止倒计时结束出现第二次倒计时
  51. else if(((b1==button1)&&(b2==button2)&&(b3==button3)&&(b4==button4)))
  52. m<=1; //实时对比密码的输入
  53. else m<=0;
  54. end
  55. reg [3:0]chiper1,chiper2,chiper3,chiper4;
  56. always@(posedge clk or negedge rstn)
  57. begin
  58. if(!rstn)
  59. begin
  60. chiper1<=1;
  61. chiper2<=2;
  62. chiper3<=3;
  63. chiper4<=4;
  64. end
  65. else if(button_amend==1) //修改密码阶段
  66. begin
  67. chiper1<=button1;
  68. chiper2<=button2;
  69. chiper3<=button3;
  70. chiper4<=button4;
  71. end
  72. end
  73. always@(posedge clk or negedge rstn)
  74. begin
  75. if(!rstn)
  76. begin
  77. data1<=0;
  78. data2<=0;
  79. data3<=0;
  80. data4<=0;
  81. led<=0;
  82. end
  83. else if(button_amend==1)//在修改密码阶段时,显示密码
  84. begin
  85. data1<=chiper1;
  86. data2<=chiper2;
  87. data3<=chiper3;
  88. data4<=chiper4;
  89. led<=0;
  90. end
  91. else //在输入密码阶段时,显示输入密码
  92. begin
  93. data1<=button1;
  94. data2<=button2;
  95. data3<=button3;
  96. data4<=button4;
  97. led<=1;
  98. end
  99. end
  100. always@(posedge clk or negedge rstn)
  101. begin
  102. if(!rstn)
  103. begin
  104. buzzer<=0;
  105. end
  106. else if((chiper1==button1)&&(chiper2==button2)&&(chiper3==button3)&&(chiper4==button4)&&(button_amend==0)) //四个按键都与密码寄存器相等,并且不是修改密码状态
  107. buzzer<=1; //蜂鸣器高电平响
  108. else
  109. buzzer<=0;
  110. end
  111. reg [26:0]cn1;
  112. reg [3:0]count;
  113. reg [2:0]m2;
  114. always@(posedge clk or negedge rstn)
  115. begin
  116. if(!rstn)
  117. begin
  118. cn1<=0;
  119. flag1<=1;
  120. count<=1;
  121. m2<=0;
  122. end
  123. else case(m2) //在case的每个状态增加一个回到初始计数的条件
  124. 0:if(m==1)
  125. begin
  126. cn1<=0;
  127. count<=0;
  128. m2<=1;
  129. end
  130. 1:begin
  131. if(m==0)
  132. m2<=0;
  133. else if(cn1>= 100)//49999999 200
  134. begin
  135. if(count>=15) //15秒计时结束给flag1一个时钟周期的低电平
  136. begin
  137. count<=0;
  138. flag1<=0;
  139. m2<=2;
  140. end
  141. count<=count+1;
  142. cn1<=0;
  143. end
  144. else
  145. cn1<=cn1+1;
  146. end
  147. 2:begin
  148. if(m==0)
  149. m2<=0;
  150. flag1<=1;
  151. end
  152. endcase
  153. end
  154. always@(posedge clk or negedge rstn)
  155. begin
  156. if(!rstn)
  157. begin
  158. data5<=0;
  159. data6<=0;
  160. end
  161. else case(count)
  162. 0:begin data6<=0;data5<=0; end
  163. 1:begin data6<=1;data5<=5; end
  164. 2:begin data6<=1;data5<=4; end
  165. 3:begin data6<=1;data5<=3; end
  166. 4:begin data6<=1;data5<=2; end
  167. 5:begin data6<=1;data5<=1; end
  168. 6:begin data6<=1;data5<=0; end
  169. 7:begin data6<=0;data5<=9; end
  170. 8:data5<=8;
  171. 9:data5<=7;
  172. 10:data5<=6;
  173. 11:data5<=5;
  174. 12:data5<=4;
  175. 13:data5<=3;
  176. 14:data5<=2;
  177. 15:data5<=1;
  178. endcase
  179. end
  180. endmodule

按键消抖部分https://blog.csdn.net/m0_59487432/article/details/124872245?spm=1001.2014.3001.5501

动态显示部分https://blog.csdn.net/m0_59487432/article/details/124891256?spm=1001.2014.3001.5501

顶层模块部分

  1. module top(
  2. input clk ,
  3. input rstn ,
  4. input key1 ,
  5. input key2 ,
  6. input key3 ,
  7. input key4 ,
  8. input amend ,
  9. output [7:0] seg ,
  10. output [5:0] sel ,
  11. output led ,
  12. output buzzer
  13. );//完整代码在QQ群文件689408654
  14. wire shape_key1;
  15. wire shape_key2;
  16. wire shape_key3;
  17. wire shape_key4; //消抖后的四个密码波形
  18. wire shape_amend; //消抖后的修改按键波形
  19. shake_top shake_top_u(
  20. .clk (clk ),
  21. .rstn (rstn ),
  22. .key1 (key1 ),
  23. .key2 (key2 ),
  24. .key3 (key3 ),
  25. .key4 (key4 ),
  26. .amend (amend ),
  27. .shape_key1 (shape_key1 ),
  28. .shape_key2 (shape_key2 ),
  29. .shape_key3 (shape_key3 ),
  30. .shape_key4 (shape_key4 ),
  31. .shape_amend (shape_amend)
  32. );
  33. wire [3:0] data1;
  34. wire [3:0] data2;
  35. wire [3:0] data3;
  36. wire [3:0] data4;
  37. wire [3:0] data5;
  38. wire [3:0] data6;//数码管各个位码值
  39. lock lock_u(
  40. .clk (clk ),
  41. .rstn (rstn ),
  42. .shape_key1 (shape_key1 ),
  43. .shape_key2 (shape_key2 ),
  44. .shape_key3 (shape_key3 ),
  45. .shape_key4 (shape_key4 ),
  46. .shape_amend (shape_amend ),
  47. .data1 (data1 ),
  48. .data2 (data2 ),
  49. .data3 (data3 ),
  50. .data4 (data4 ),
  51. .data5 (data5 ),
  52. .data6 (data6 ),
  53. .buzzer (buzzer ),
  54. .led (led )
  55. );
  56. digital digital_u(
  57. .clk (clk ),
  58. .rstn (rstn ),
  59. .data1(data1),
  60. .data2(data2),
  61. .data3(data3),
  62. .data4(data4),
  63. .data5(data5),
  64. .data6(data6),
  65. .seg (seg ),
  66. .sel (sel )
  67. );
  68. endmodule

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/765560
推荐阅读
相关标签
  

闽ICP备14008679号