ZYNQ-700呼吸灯

参考野火例程

实现呼吸灯即要调整led亮的占比时间,完成视觉上看起来由灭到亮或者由亮到灭的过程。

  • 如果主频为50MHz,理论上一秒钟我们可以控制50_000_000次led的亮和灭,肉眼不可能分辨出来每一次亮灭,如果这50M我们设定为间隔一次亮一次,那么看起来led应该是常亮的,且亮度应该只有全亮的一半。通过这两种设定的比较,其实我们已经实现了pwm控制输出比,接下来需要考虑的是如何实现变化的过程。
  • 上文所述的亮灭最小控制时间是1s/50_000_000(时间除以主频),下文所述方法把单次亮灭的持续时间设定为1us,也就是1us内灯是全亮或全灭的。
  • 将led单次由灭到亮或由亮到灭的变换时间设定为1s。那么接下来就是设定亮的占比。
  • 1s=1000ms=1000_000us,也即1s我们可以控制1_000_000次亮灭。
  • 我们把1s分为1000个阶段,每个阶段可以控制1000次亮灭,那么只需要让第一个阶段亮1次,第二个阶段亮2次,第三个阶段亮3次·····第999个阶段亮999次,第1000各阶段亮1000次,那么这个过程就完成了从全灭到全亮的变化。也即1s的变化中,第1ms亮1us,第2ms亮2us······

design code:

c 复制代码
`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/04/13 09:31:22
// Design Name: 
// Module Name: breath_led
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module breath_led#(
    parameter CNT_1US = 6'd49,
    parameter CNT_1MS = 10'd999,
    parameter CNT_1S = 10'd999
)
(
    input sys_clk,
    input sys_rst_n,
    output reg led
);

reg [5:0] cnt_1us;//1us内灯全灭或全亮
reg [9:0] cnt_1ms;//1ms的1000个us,cnt_1s是多少就有多少个us亮
reg [9:0] cnt_1s;//1s内的第几个ms

reg led_state;//0:从灭到亮;1:从亮到灭,用于计算cnt_1s是加还是减

//us计数
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(sys_rst_n == 1'b0)
        cnt_1us <= 6'b0;
    else if(cnt_1us == CNT_1US)
        cnt_1us <= 6'b0;
    else
        cnt_1us <= cnt_1us + 1'b1;
end
//ms计数
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(sys_rst_n == 1'b0)
        cnt_1ms <= 10'b0;
    else if(cnt_1us == CNT_1US && cnt_1ms == CNT_1MS)//这里注意一定是同时满足才清零,下面的判定条件同理
        cnt_1ms <= 10'b0;
    else if(cnt_1us == CNT_1US)
        cnt_1ms <= cnt_1ms + 1'b1;
end
//s计数
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(sys_rst_n == 1'b0)
        cnt_1s <= 10'b0;
    else if(cnt_1us == CNT_1US && cnt_1ms == CNT_1MS && led_state == 1'b0)
        cnt_1s <= cnt_1s + 1'b1;
    else if(cnt_1us == CNT_1US && cnt_1ms == CNT_1MS && led_state == 1'b1)
        cnt_1s <= cnt_1s - 1'b1;
end
//state转换
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(sys_rst_n == 1'b0)
        led_state <= 1'b0;
    else if(cnt_1us == CNT_1US && cnt_1ms == CNT_1MS && cnt_1s == CNT_1S)
        led_state <= 1'b1;
    else if(cnt_1us == 6'b0 && cnt_1ms == 10'b0 && cnt_1s == 10'b0)
        led_state <= 1'b0;
    else
        led_state <= led_state;
end
//led输出逻辑
always @(posedge sys_clk or negedge sys_rst_n)begin
    if(sys_rst_n == 1'b0)
        led <= 1'b1;
    else if(cnt_1ms < cnt_1s)//当前是第几个ms则该ms内就有多少个us是亮的
        led <= 1'b0;
    else
        led <= 1'b1;
end

endmodule

simulation code

c 复制代码
`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/04/13 10:17:13
// Design Name: 
// Module Name: vtf_breath_led_test
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module vtf_breath_led_test(

    );

reg sys_clk;
reg sys_rst_n;
wire led;

initial begin
    sys_clk = 1'b0;
    sys_rst_n <= 1'b0;
#20
    sys_rst_n <= 1'b1;
end

always #10 sys_clk <= ~sys_clk;

breath_led #(
    .CNT_1US(1'b1),
    .CNT_1MS(5'd19),
    .CNT_1S(5'd19)
) bled(
    .sys_clk(sys_clk),
    .sys_rst_n(sys_rst_n),
    .led(led)
);
endmodule
相关推荐
XINVRY-FPGA1 小时前
XC95288XL-10TQG144I Xilinx AMD CPLD
arm开发·单片机·嵌入式硬件·mcu·fpga开发·硬件工程·fpga
i道i3 小时前
Verilog 利用伪随机,时序,按键消抖等,实现一个(打地鼠)游戏
游戏·fpga开发·verilog
奋斗的牛马5 小时前
OFDM理解
网络·数据库·单片机·嵌入式硬件·fpga开发·信息与通信
ThreeYear_s9 小时前
【FPGA+DSP系列】——PWM电平光耦转换电路实验分析----电路原理分析,器件选型
单片机·嵌入式硬件·fpga开发
FPGA_小田老师1 天前
FPGA语法基础(一):Verilog 数组清零方法详解
fpga开发·verilog语法·数组清零·verilog数组清零
奋斗的牛马1 天前
FPGA--zynq学习 PS与PL交互(二) HP接口
单片机·嵌入式硬件·学习·fpga开发·信息与通信
ThreeYear_s1 天前
【FPGA+DSP系列】——CCS联合proteus仿真DSP工程,以TMS320f28027芯片为例,LED闪烁仿真。
单片机·fpga开发·proteus
LCMICRO-133108477461 天前
长芯微LPS5820完全P2P替代NCP51820,LPS5820 是一款高速半桥驱动器,可用来驱动半 桥功率拓扑的 GaN 功率管。
stm32·单片机·嵌入式硬件·fpga开发·硬件工程
云雾J视界2 天前
预测电流控制在光伏逆变器中的低延迟实现:华为FPGA加速方案与并网稳定性验证
华为·fpga开发·dsp·光伏逆变器·mpcc
国科安芯2 天前
核电厂执行器控制系统中的抗辐照MCU选型:为什么需要150krad(Si) TID指标?
服务器·单片机·嵌入式硬件·fpga开发·架构