FPGA开发第五弹:手搓呼吸灯代码

FPGA开发第五弹:手搓呼吸灯代码

​ 呼吸灯采用的PWM的方式,在固定频率下,通过调整占空比的方式来控制LED灯亮度。PWM即脉冲宽度限制。

​ 在由计数器产生的固定周期的PWM信号下,占空比为0,LED不亮;占空比为100%,LED最亮。占空比从0变到100,就可以实现呼吸灯效果。

​ PWM占空比调节示意图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YTjRhxW2-1659583228704)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\image-20220803103824553.png)]

LED高电平的时间越长,LED越亮,高电平时间越短,LED越暗。

​ 本次实验的模块端口及结构框图如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ucpJAS1B-1659583228707)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\image-20220803110624728.png)]

​ 实验中的系统时钟、按键复位以及LED端口的管脚分配如下表所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yy7CrpmM-1659583228708)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\image-20220803144717771.png)]

​ 对应的XDC约束语句如下所示:

create_clock -name clk -period 20 [get_ports clk]

set_property -dict {PACKAGE_PIN R4 IOSTANDARD LVCMOS33} [get_ports clk]
set_property -dict {PACKAGE_PIN U2 IOSTANDARD LVCMOS33} [get_ports rst]
set_property -dict {PACKAGE_PIN R2 IOSTANDARD LVCMOS33} [get_ports led]

​ 呼吸灯代码如下:

module breath_led(
input clk,
input rst,
output led
);

reg [15:0] period;
reg [15:0] pwm;
reg state;
//led根据period和pwm状态改变
assign led=(period>=pwm)?1'b1:1'b0;
//计数器,记50000,20ns
always @(posedge clk or negedge rst)
begin
if(rst==0)
period<=16'd0;
else if(period==16'd50000)
period<=16'd0;
else
period<=period+1'b1;
end

    always @(posedge clk or negedge rst)//占空比设定模块
begin
if(rst==0)
begin
  pwm<=16'd0;//初始化pwm为0,state为0
  state<=1'b0;
end
else
begin
if(period==16'd50000)//如果计数器记满
	begin
if(state==1'b0)//如果状态为0
		begin
if(pwm==16'd50000)//如果pwm=50000
state<=1'b1;//状态改为1
else//pwm!=50000
pwm<=pwm+16'd25;//pwm以25变化
		end
else//如果状态为1
			begin
			if(pwm==16'd0)//如果pwm=0
			state<=1'b0;//状态改为0
			else//pwm!=0
			pwm<=pwm-16'd25;//pwm逐渐递减25
			end
	end
end
end
endmodule

核心是当前周期计数值与占空比的大小比较,如果当前的周期计数值小于等于占空比计数值,LED输出高电平,即点亮;如果当前的周期计数值大于占空比数值,则LED输出低电平,即熄灭。

​ 最后生成比特流,进行下载验证。

​ 具体操作步骤参考FPGA开发第一弹:FPGA开发第一弹:Vivado软件安装、开发使用与工程建立_WeeHours.的博客-CSDN博客_vivado 设置顶层

​ 以上就是我进行的呼吸灯实验,继续熟悉整个FPGA开发的流程,如果自己做的项目的话其实每一步基本都不能缺失,每一步都需要我们认真总结掌握,多练几次也就熟练了!欢迎大家私信我一同交流学习,也欢迎大家批评指正!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WeeHours.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值