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

shaonianxue_guojp
文章2021-12-20
1.4k

一、简介

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

二、需要的工具与知识

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

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

三、Vivado的使用

创建项目以及芯片选型

创建源文件(.v文件)

四、呼吸灯代码

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

`timescale 1ns / 1ps
module PWM_live_led(
input sysclk ,
input rst_n ,
output reg led
);
reg [31:0] cnt;
reg [28:0] cnt_1000us;
reg [28:0] cnt_1000ms;
reg cnt_s;
always@(posedge sysclk or negedge rst_n)begin
if(!rst_n)
cnt<=0;
else if(cnt>=50-1)
cnt<=0;
else
cnt<=cnt+1;
end
always@(posedge sysclk or negedge rst_n)begin
if(!rst_n)
cnt_1000us<=0;
else if(cnt==50-1&&cnt_1000us==1000-1)
cnt_1000us<=0;
else if(cnt==50-1)
cnt_1000us<=cnt_1000us+1;
else
cnt_1000us<=cnt_1000us;
end
always@(posedge sysclk or negedge rst_n)begin
if(!rst_n)
cnt_1000ms<=0;
else if(cnt==50-1&&cnt_1000us==1000-1&&cnt_1000ms==1000-1)
cnt_1000ms<=0;
else if(cnt==50-1&&cnt_1000us==1000-1)
cnt_1000ms<=cnt_1000ms+1;
else
cnt_1000ms<=cnt_1000ms;
end
always@(posedge sysclk or negedge rst_n)begin
if(!rst_n)
cnt_s<=0;
else if(cnt==50-1&&cnt_1000us==1000-1&&cnt_1000ms==1000-1)
cnt_s<=cnt_s+1;
else
cnt_s<=cnt_s;
end
always@(posedge sysclk or negedge rst_n)begin
if(!rst_n)
led<=0;
else if(cnt_s==0)begin
if(cnt_1000us<=cnt_1000ms)
led<=1;
else
led<=0;
end
else begin
if(cnt_1000us<=cnt_1000ms)
led<=0;
else
led<=1;
end
end
endmodule

五、添加管脚约束

六、约束文件代码

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

七、生成bitstream (比特流)

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

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

module PWM_live_led(
input sysclk,
output led
);
reg [27:0] cnt;
always@(posedge sysclk)
cnt<=cnt+1;
assign led = cnt[27]?(cnt[26:17]>=cnt[16:7]?1'b1:1'b0):(cnt[26:17]>=cnt[16:7]?1'b0:1'b1);
endmodule

约束文件

set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { sysclk }];
set_property -dict { PACKAGE_PIN T12 IOSTANDARD LVCMOS33 } [get_ports { led }];
分类
工程案例
浏览 1.4k评论 1
分享:

相关推荐

同频道 · 相近分类

暂无相关推荐

作者

shaonianxue_guojp查看主页

同分类阅读

文章

延伸阅读与实操

  • 文章 + 课程联动深度文章常对应体系课章节,可一键选课。
  • 学习产出可参考笔记与作业案例在学习产出广场持续更新。

探索全站