赞
踩
一、实验目的
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 环境中实现语言综合、调试、下载验证。
四、实验仿真
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. Library ieee;
- 2. use ieee.std_logic_1164.all;
- 3.
- 4. entity led_button is
- 5. port( clk:in std_logic;
- 6. -- f_out:buffer std_logic;
- 7. rst:in std_logic;
- 8. button : in std_logic_vector(2 downto 0);
- 9. led:buffer bit_vector(2 downto 0)
- 10. );
- 11. end led_button;
- 12. architecture behave of led_button is
- 13. signal cnt1:integer range 0 to 11 ;
- 14. signal cnt2: integer range 0 to 11;
- 15. signal q: integer range 0 to 40000000;
- 16. signal f_out: std_logic ;
- 17. begin
- 18.
- 19. P1:process(clk,rst)
- 20. variable ans: std_logic ;
- 21. begin
- 22. if rst =''0''then
- 23. ans:=''0'';
- 24. q<=0;
- 25. elsif(clk''event and clk=''1'') then
- 26. if q<=20000000 then ----周期
- 27. q<=q+1;
- 28. if q <= 10000000 then ----设置成可调占空比
- 29. ans := ''0'';
- 30. else
- 31. ans :=''1'';
- 32. end if;
- 33. else
- 34. q<=0;
- 35. end if;
- 36. end if;
- 37. f_out <=ans;
- 38. end process P1;
- 39.
- 40. P3:process(f_out,rst,button)
- 41. begin
- 42. if (rst = ''0'') then
- 43. cnt2 <= 0;
- 44. cnt1 <= 0;
- 45. led <= "000";
- 46. else
- 47. if (button="111") then
- 48. cnt2 <= 0;-------拨码开关111生效 就复位拨码开关000状态
- 49. if (f_out''event and f_out=''1'') then
- 50. cnt1<=cnt1+1;
- 51. if cnt1>=12 then
- 52. cnt1<=0;
- 53. end if;
- 54. end if;
- 55.
- 56. case cnt1 is
- 57. when 0=>led<="000";
- 58. when 1=>led<="100";
- 59. when 2=>led<="010";
- 60. when 3=>led<="001";
- 61. when 4=>led<="000";
- 62. when 5=>led<="100";
- 63. when 6=>led<="010";
- 64. when 7=>led<="001";
- 65. when 8=>led<="000";
- 66. when 9=>led<="001";
- 67. when 10=>led<="010";
- 68. when 11=>led<="100";
- 69. end case;
- 70. elsif(button="000") then
- 71. cnt1 <= 0;-------拨码开关000生效 就复位拨码开关111状态
- 72. if f_out''event and f_out=''1'' then
- 73. cnt2<=cnt2+1;
- 74.
- 75. if cnt1>=12 then
- 76. cnt1<=0;
- 77. end if;
- 78. end if;
- 79. case cnt2 is
- 80. when 0=>led<="000";
- 81. when 1=>led<="001";
- 82. when 2=>led<="010";
- 83. when 3=>led<="100";
- 84. when 4=>led<="000";
- 85. when 5=>led<="001";
- 86. when 6=>led<="010";
- 87. when 7=>led<="100";
- 88. when 8=>led<="000";
- 89. when 9=>led<="100";
- 90. when 10=>led<="010";
- 91. when 11=>led<="001";
- 92. end case;
- 93. else
- 94. cnt1 <= 0;
- 95. cnt2 <= 0;
- 96. led<="000";
- 97. end if;
- 98. end if;
- 99.
- 100. end process P3;
- 101.
- 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. Library ieee;
- 2. use ieee.std_logic_1164.all;
- 3. entity led_button is
- 4. port( clk:in std_logic;
- 5. rst:in std_logic;
- 6. button : in std_logic_vector(2 downto 0);
- 7. led:buffer bit_vector(3 downto 0));
- 8. end led_button;
- 9. architecture behave of led_button is
- 10. type st is (s0,s1);---状态机的定义,2个循环状态
- 11. signal state: st;
- 12. signal cnt:integer range 0 to 11 ;
- 13. signal q: integer range 0 to 40000000;
- 14. signal f_out: std_logic ;
- 15. begin
- 16. P1:process(clk,rst)
- 17. variable ans: std_logic ;
- 18. begin
- 19. if rst =''0''then
- 20. ans:=''0'';
- 21. q<=0;
- 22. elsif(clk''event and clk=''1'') then
- 23. if q<=20000000 then ----周期
- 24. q<=q+1;
- 25. if q <= 10000000 then ----设置成可调占空比
- 26. ans := ''0'';
- 27. else
- 28. ans :=''1'';
- 29. end if;
- 30. else
- 31. q<=0;
- 32. end if;
- 33. end if;
- 34. f_out <=ans;
- 35. end process P1;
- 36. P3:process(f_out,rst,button)
- 37. begin
- 38. if (rst = ''0'') then
- 39. cnt <= 0;
- 40. led <= "1000";
- 41. else
- 42. if (f_out''event and f_out=''1'') then
- 43. if (button="111") then
- 44. case state is
- 45. when s0 => led <= led ror 1;--循环移位,依次点亮
- 46. if cnt<=8 then
- 47. cnt<=cnt+1; --移两遍
- 48. else
- 49. state<=s1; --进入下一个状态
- 50. cnt<=0; --计数器复位
- 51. end if;
- 52. when s1 => led <= led rol 1;
- 53. if cnt<=3 then
- 54. cnt<=cnt+1; --仅仅移一遍
- 55. else
- 56. state<=s0; --进入下一个状态
- 57. cnt<=0; --计数器复位
- 58. end if;
- 59. end case;
- 60. elsif(button="000") then
- 61. case state is
- 62. when s0 => led <= led rol 1;--移位
- 63. if cnt<=8 then
- 64. cnt<=cnt+1;
- 65. else
- 66. state<=s1; --进入下一个状态
- 67. cnt<=0; --计数器复位
- 68. end if;
- 69. when s1 => led <= led ror 1;
- 70. if cnt<=3 then
- 71. cnt<=cnt+1;
- 72. else
- 73. state<=s0; --进入下一个状态
- 74. cnt<=0; --计数器复位
- 75. end if;
- 76. end case;
- 77.
- 78. else
- 79. led<="1000";
- 80. end if;
- 81. end if;
- 82. end if;
- 83. end process P3;
- 84. end behave;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。