当前位置:   article > 正文

FPGA拨码开关控制流水灯(VHDL)_vhdl开关控制led灯程序

vhdl开关控制led灯程序

一、实验目的

1.根据FPGA 开发板资源设计拨码开关控制流水灯实验;

2.利用VHDL 语言自行设计拨码开关控制流水灯程序;

3.在FPGA 开发板上验证。

二、实验原理

FPGA 芯片外部输入的固定晶振时钟信号为40MHz,先进行降频,得到适合的同步时钟,完成拨码开关控制激励流水灯的流向。该功能模块,有5 个输入:时钟信号,复位信号,3 个拨码开关,3 个输出:3 个LED,功能框图为:

模块功能要求:

(1) Reset=0 时复位,Reset=1 时解除复位;

(2) 当拨码开关=111 时,流水灯从左到右跑2 遍后,自动改为从右到左跑1 遍,然后重复;

(3) 当拨码开关=000 时,流水灯从右到左跑2 遍后,自动改为从左到右跑1 遍,然后重复;

(4)在FPGA 实验板上验证时,人眼必须能观察到流水灯运行结果。

三、实验内容和步骤

1、自行安装 EDA 软件;

2、用 VHDL 语言自行编程设计时钟降频逻辑 ,拨码开关控制流水灯逻辑;

3、在 EDA 环境中实现语言综合、调试、下载验证。

四、实验仿真

  1. 硬件平台

FPGA 硬件管脚信息: 

40MHz  Clock 为   PIN_16

Reset 为   PIN_17

拨码开关为 PIN_27  PIN_28  PIN_31

LED 灯为  PIN_10  PIN_11  PIN_26

在FPGA 开发板上LED 位置,Reset 按键位置

2.软件仿真

----实验方法1,使用分频+case赋值

  1. 1. Library ieee;
  2. 2. use ieee.std_logic_1164.all;
  3. 3.
  4. 4. entity led_button is
  5. 5. port( clk:in std_logic;
  6. 6. -- f_out:buffer std_logic;
  7. 7. rst:in std_logic;
  8. 8. button : in std_logic_vector(2 downto 0);
  9. 9. led:buffer bit_vector(2 downto 0)
  10. 10. );
  11. 11. end led_button;
  12. 12. architecture behave of led_button is
  13. 13. signal cnt1:integer range 0 to 11 ;
  14. 14. signal cnt2: integer range 0 to 11;
  15. 15. signal q: integer range 0 to 40000000;
  16. 16. signal f_out: std_logic ;
  17. 17. begin
  18. 18.
  19. 19. P1:process(clk,rst)
  20. 20. variable ans: std_logic ;
  21. 21. begin
  22. 22. if rst =''0''then
  23. 23. ans:=''0'';
  24. 24. q<=0;
  25. 25. elsif(clk''event and clk=''1'') then
  26. 26. if q<=20000000 then ----周期
  27. 27. q<=q+1;
  28. 28. if q <= 10000000 then ----设置成可调占空比
  29. 29. ans := ''0'';
  30. 30. else
  31. 31. ans :=''1'';
  32. 32. end if;
  33. 33. else
  34. 34. q<=0;
  35. 35. end if;
  36. 36. end if;
  37. 37. f_out <=ans;
  38. 38. end process P1;
  39. 39.
  40. 40. P3:process(f_out,rst,button)
  41. 41. begin
  42. 42. if (rst = ''0'') then
  43. 43. cnt2 <= 0;
  44. 44. cnt1 <= 0;
  45. 45. led <= "000";
  46. 46. else
  47. 47. if (button="111") then
  48. 48. cnt2 <= 0;-------拨码开关111生效 就复位拨码开关000状态
  49. 49. if (f_out''event and f_out=''1'') then
  50. 50. cnt1<=cnt1+1;
  51. 51. if cnt1>=12 then
  52. 52. cnt1<=0;
  53. 53. end if;
  54. 54. end if;
  55. 55.
  56. 56. case cnt1 is
  57. 57. when 0=>led<="000";
  58. 58. when 1=>led<="100";
  59. 59. when 2=>led<="010";
  60. 60. when 3=>led<="001";
  61. 61. when 4=>led<="000";
  62. 62. when 5=>led<="100";
  63. 63. when 6=>led<="010";
  64. 64. when 7=>led<="001";
  65. 65. when 8=>led<="000";
  66. 66. when 9=>led<="001";
  67. 67. when 10=>led<="010";
  68. 68. when 11=>led<="100";
  69. 69. end case;
  70. 70. elsif(button="000") then
  71. 71. cnt1 <= 0;-------拨码开关000生效 就复位拨码开关111状态
  72. 72. if f_out''event and f_out=''1'' then
  73. 73. cnt2<=cnt2+1;
  74. 74.
  75. 75. if cnt1>=12 then
  76. 76. cnt1<=0;
  77. 77. end if;
  78. 78. end if;
  79. 79. case cnt2 is
  80. 80. when 0=>led<="000";
  81. 81. when 1=>led<="001";
  82. 82. when 2=>led<="010";
  83. 83. when 3=>led<="100";
  84. 84. when 4=>led<="000";
  85. 85. when 5=>led<="001";
  86. 86. when 6=>led<="010";
  87. 87. when 7=>led<="100";
  88. 88. when 8=>led<="000";
  89. 89. when 9=>led<="100";
  90. 90. when 10=>led<="010";
  91. 91. when 11=>led<="001";
  92. 92. end case;
  93. 93. else
  94. 94. cnt1 <= 0;
  95. 95. cnt2 <= 0;
  96. 96. led<="000";
  97. 97. end if;
  98. 98. end if;
  99. 99.
  100. 100. end process P3;
  101. 101.
  102. 102. end behave;

实验仿真:Verification/Debugging files——university program VWF。

1.File->new->university program VWF->OK打开仿真页面

2.edit->insert->insert node or bus或者直接双击左边空白地方弹出insert node or bus对话框。

3.node finder->list-> >> ->OK->OK

分频系数设置小一点,结果表现符合预期。

————————————————分割线————————————————————————

----实验方法2,使用分频+状态机+移位实现(尝试没实现)(没FPGA用啦、仿真结果不太对劲)

  1. 1. Library ieee;
  2. 2. use ieee.std_logic_1164.all;
  3. 3. entity led_button is
  4. 4. port( clk:in std_logic;
  5. 5. rst:in std_logic;
  6. 6. button : in std_logic_vector(2 downto 0);
  7. 7. led:buffer bit_vector(3 downto 0));
  8. 8. end led_button;
  9. 9. architecture behave of led_button is
  10. 10. type st is (s0,s1);---状态机的定义,2个循环状态
  11. 11. signal state: st;
  12. 12. signal cnt:integer range 0 to 11 ;
  13. 13. signal q: integer range 0 to 40000000;
  14. 14. signal f_out: std_logic ;
  15. 15. begin
  16. 16. P1:process(clk,rst)
  17. 17. variable ans: std_logic ;
  18. 18. begin
  19. 19. if rst =''0''then
  20. 20. ans:=''0'';
  21. 21. q<=0;
  22. 22. elsif(clk''event and clk=''1'') then
  23. 23. if q<=20000000 then ----周期
  24. 24. q<=q+1;
  25. 25. if q <= 10000000 then ----设置成可调占空比
  26. 26. ans := ''0'';
  27. 27. else
  28. 28. ans :=''1'';
  29. 29. end if;
  30. 30. else
  31. 31. q<=0;
  32. 32. end if;
  33. 33. end if;
  34. 34. f_out <=ans;
  35. 35. end process P1;
  36. 36. P3:process(f_out,rst,button)
  37. 37. begin
  38. 38. if (rst = ''0'') then
  39. 39. cnt <= 0;
  40. 40. led <= "1000";
  41. 41. else
  42. 42. if (f_out''event and f_out=''1'') then
  43. 43. if (button="111") then
  44. 44. case state is
  45. 45. when s0 => led <= led ror 1;--循环移位,依次点亮
  46. 46. if cnt<=8 then
  47. 47. cnt<=cnt+1; --移两遍
  48. 48. else
  49. 49. state<=s1; --进入下一个状态
  50. 50. cnt<=0; --计数器复位
  51. 51. end if;
  52. 52. when s1 => led <= led rol 1;
  53. 53. if cnt<=3 then
  54. 54. cnt<=cnt+1; --仅仅移一遍
  55. 55. else
  56. 56. state<=s0; --进入下一个状态
  57. 57. cnt<=0; --计数器复位
  58. 58. end if;
  59. 59. end case;
  60. 60. elsif(button="000") then
  61. 61. case state is
  62. 62. when s0 => led <= led rol 1;--移位
  63. 63. if cnt<=8 then
  64. 64. cnt<=cnt+1;
  65. 65. else
  66. 66. state<=s1; --进入下一个状态
  67. 67. cnt<=0; --计数器复位
  68. 68. end if;
  69. 69. when s1 => led <= led ror 1;
  70. 70. if cnt<=3 then
  71. 71. cnt<=cnt+1;
  72. 72. else
  73. 73. state<=s0; --进入下一个状态
  74. 74. cnt<=0; --计数器复位
  75. 75. end if;
  76. 76. end case;
  77. 77.
  78. 78. else
  79. 79. led<="1000";
  80. 80. end if;
  81. 81. end if;
  82. 82. end if;
  83. 83. end process P3;
  84. 84. end behave;

 

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号