来自正点原子的学习笔记
上一个博客是这个哦可以去看看
链接: FPGA实战(三)按键控制蜂鸣器实验.
1 呼吸灯简介
通过调节占空比,调节LED的亮度
占空比从0 到100就是从灭到亮
2 硬件设计
此处从原理图看出,LED高电平点亮,低电平熄灭
实验目的:使用PL LED,使呼吸灯先从灭到亮,再从亮到灭。
3软件设计
3.1 设计思路
3.2 主要代码
module breath_led(
input sys_clk , //时钟信号50Mhz
input sys_rst_n , //复位信号
output led //LED
);
//reg define
reg [15:0] period_cnt ; //设置周期计数器频率:1khz 周期:1ms 计数值:1ms/20ns(系统时钟周期)=50000,对应的二进制为16位宽
reg [15:0] duty_cycle ; //占空比数值
//period_cnt与duty_cycle是需要相互比较的,比如大于为高电平,小于为低电平,不断地刷新和提升数值
reg inc_dec_flag ; //0 递增 1 递减,用来控制累计的 方向
//*****************************************************
//** main code
//*****************************************************
//根据占空比和计数值之间的大小关系来输出LED
//赋值语句,其实是period_cnt与duty_cycle之间的语句
assign led = (period_cnt >= duty_cycle) ? 1'b1 : 1'b0;
//其实不存在“占空比”这种专业的设置(特殊代码),其实就是在高速的情况下,不停地开关罢了
//具体体现在一个周期之内,其实就是所谓的“占空比”
//周期计数器
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
period_cnt <= 16'd0;
else if(period_cnt == 16'd50000)//重新计数
period_cnt <= 16'd0;
else
period_cnt <= period_cnt + 1'b1;//每次计数加1
end
//在周期计数器的节拍下递增或递减占空比
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n) begin//复位
duty_cycle <= 16'd0;//归零
inc_dec_flag <= 1'b0;//递增的方向
end
else begin
if(period_cnt == 16'd50000) begin //计满1ms(系统时钟计数满50000次)
if(inc_dec_flag == 1'b0) begin //占空比递增状态
if(duty_cycle == 16'd50000) //如果占空比已递增至最大
inc_dec_flag <= 1'b1; //则占空比开始递减
else //否则占空比以25为单位递 增
duty_cycle <= duty_cycle + 16'd25;//其实这是亮和暗 快慢 的决定因素
end
else begin //占空比递减状态
if(duty_cycle == 16'd0) //如果占空比已递减至0
inc_dec_flag <= 1'b0; //则占空比开始递增
else //否则占空比以25为单位递 减
duty_cycle <= duty_cycle - 16'd25;
end
end
end
end//过多的end,可以双击进行检查与begin的对应是否OK
endmodule
3.3 管脚分配
有两种方法,一种是open Synthesized Design
一种是直接在add sources里添加constraints文件
我一般直接用**正点原子的文档,**使用后者的方法,
前者可以看看我前几个实验的相应部分
而且这种代码方式是电压和引脚一起配置的,看起来很明了
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk]
set_property -dict {PACKAGE_PIN J15 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]
set_property -dict {PACKAGE_PIN J16 IOSTANDARD LVCMOS33} [get_ports led]
3.4 生成比特流文件
见我之前的博客
Vivado 2018.3入门教程(三):生成比特流文件+硬件连接.