基于ZYNQ ECO开发板的呼吸灯实验

一、简介

呼吸灯常见于我们的手机指示灯上,本实验将会教会大家利用FPGA构建一个呼吸灯。

二、需要的工具与知识

我们的开发工具运用的Vivado 2020.1 硬件平台选择的是ZYNQ ECO开发板,你需要了解一下PWM波。

呼吸灯的原理是当你不断的增加PWM波的占空比就可以让灯不断的变亮,当降低占空比的时候灯就会逐渐变暗。

三、Vivado的使用

创建项目以及芯片选型

基于ZYNQ ECO开发板的呼吸灯实验 - 第1张
基于ZYNQ ECO开发板的呼吸灯实验 - 第2张
基于ZYNQ ECO开发板的呼吸灯实验 - 第3张
基于ZYNQ ECO开发板的呼吸灯实验 - 第4张
基于ZYNQ ECO开发板的呼吸灯实验 - 第5张
基于ZYNQ ECO开发板的呼吸灯实验 - 第6张
基于ZYNQ ECO开发板的呼吸灯实验 - 第7张

创建源文件(.v文件)

基于ZYNQ ECO开发板的呼吸灯实验 - 第8张
基于ZYNQ ECO开发板的呼吸灯实验 - 第9张
基于ZYNQ ECO开发板的呼吸灯实验 - 第10张
基于ZYNQ ECO开发板的呼吸灯实验 - 第11张
基于ZYNQ ECO开发板的呼吸灯实验 - 第12张
基于ZYNQ ECO开发板的呼吸灯实验 - 第13张
基于ZYNQ ECO开发板的呼吸灯实验 - 第14张
基于ZYNQ ECO开发板的呼吸灯实验 - 第15张

四、呼吸灯代码

如果你是新手可以复制以下代码替换掉原有.v文件的内容

  1. `timescale 1ns / 1ps
  2. module PWM_live_led(
  3. input sysclk ,
  4. input rst_n ,
  5. output reg led
  6. );
  7. reg [31:0] cnt;
  8. reg [28:0] cnt_1000us;
  9. reg [28:0] cnt_1000ms;
  10. reg cnt_s;
  11. always@(posedge sysclk or negedge rst_n)begin
  12. if(!rst_n)
  13. cnt<=0;
  14. else if(cnt>=50-1)
  15. cnt<=0;
  16. else
  17. cnt<=cnt+1;
  18. end
  19. always@(posedge sysclk or negedge rst_n)begin
  20. if(!rst_n)
  21. cnt_1000us<=0;
  22. else if(cnt==50-1&&cnt_1000us==1000-1)
  23. cnt_1000us<=0;
  24. else if(cnt==50-1)
  25. cnt_1000us<=cnt_1000us+1;
  26. else
  27. cnt_1000us<=cnt_1000us;
  28. end
  29. always@(posedge sysclk or negedge rst_n)begin
  30. if(!rst_n)
  31. cnt_1000ms<=0;
  32. else if(cnt==50-1&&cnt_1000us==1000-1&&cnt_1000ms==1000-1)
  33. cnt_1000ms<=0;
  34. else if(cnt==50-1&&cnt_1000us==1000-1)
  35. cnt_1000ms<=cnt_1000ms+1;
  36. else
  37. cnt_1000ms<=cnt_1000ms;
  38. end
  39. always@(posedge sysclk or negedge rst_n)begin
  40. if(!rst_n)
  41. cnt_s<=0;
  42. else if(cnt==50-1&&cnt_1000us==1000-1&&cnt_1000ms==1000-1)
  43. cnt_s<=cnt_s+1;
  44. else
  45. cnt_s<=cnt_s;
  46. end
  47. always@(posedge sysclk or negedge rst_n)begin
  48. if(!rst_n)
  49. led<=0;
  50. else if(cnt_s==0)begin
  51. if(cnt_1000us<=cnt_1000ms)
  52. led<=1;
  53. else
  54. led<=0;
  55. end
  56. else begin
  57. if(cnt_1000us<=cnt_1000ms)
  58. led<=0;
  59. else
  60. led<=1;
  61. end
  62. end
  63. endmodule

五、添加管脚约束

基于ZYNQ ECO开发板的呼吸灯实验 - 第16张
基于ZYNQ ECO开发板的呼吸灯实验 - 第17张
基于ZYNQ ECO开发板的呼吸灯实验 - 第18张
基于ZYNQ ECO开发板的呼吸灯实验 - 第19张
基于ZYNQ ECO开发板的呼吸灯实验 - 第20张

六、约束文件代码

  1. set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { sysclk }];
  2. set_property -dict { PACKAGE_PIN T12 IOSTANDARD LVCMOS33 } [get_ports { led }];
  3. set_property -dict { PACKAGE_PIN M20 IOSTANDARD LVCMOS33 } [get_ports { rst_n }];

七、生成bitstream (比特流)

基于ZYNQ ECO开发板的呼吸灯实验 - 第21张
基于ZYNQ ECO开发板的呼吸灯实验 - 第22张
基于ZYNQ ECO开发板的呼吸灯实验 - 第23张
基于ZYNQ ECO开发板的呼吸灯实验 - 第24张
基于ZYNQ ECO开发板的呼吸灯实验 - 第25张
基于ZYNQ ECO开发板的呼吸灯实验 - 第26张
基于ZYNQ ECO开发板的呼吸灯实验 - 第27张
基于ZYNQ ECO开发板的呼吸灯实验 - 第28张

现在你就能在ECO板上看见一颗正在“呼吸”的LED。

其实呼吸灯有很多写法,这里笔者提供了另一种仅9行就实现功能的呼吸灯代码,感兴趣的同学可以登录查看!

  1. module PWM_live_led(
  2. input sysclk,
  3. output led
  4. );
  5. reg [27:0] cnt;
  6. always@(posedge sysclk)
  7. cnt<=cnt+1;
  8. assign led = cnt[27]?(cnt[26:17]>=cnt[16:7]?1'b1:1'b0):(cnt[26:17]>=cnt[16:7]?1'b0:1'b1);
  9. endmodule
  10. 约束文件
  11. set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { sysclk }];
  12. set_property -dict { PACKAGE_PIN T12 IOSTANDARD LVCMOS33 } [get_ports { led }];
本文原创,作者:shaonianxue_guojp,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/197.html

"愿我的文字能带给您一丝美好"

还没有人赞赏,支持一下

评论

A 为本文作者,G 为游客总数:0
加载中…

提交评论

游客,您好,欢迎参与讨论。

我的购物车

购物车为空

优惠券

没有优惠券