4个led呼吸不同步(野火升腾拓展)

任务

本例中我们实现了一个 led 灯的"呼吸",而板子上有 4 个 led 灯,我们可以修改代码让 4 个 led 灯的呼吸频率都不同步,大家可以尝试一下。

代码

module breath_led

#(

parameter CNT_1US_MAX = 6'd49,

parameter CNT_1MS_MAX = 10'd999,

parameter CNT_1S_MAX = 10'd999

)

(

input sys_clk,

input sys_rst_n,

output reg [3:0] led_out

);

// 计数器定义

reg [5:0] cnt_1us;

reg [9:0] cnt_1ms;

reg [9:0] cnt_1s [3:0];

reg cnt_1s_en [3:0];

// 1us计数器

always @(posedge sys_clk or negedge sys_rst_n)

if(!sys_rst_n)

cnt_1us <= 6'd0;

else if(cnt_1us == CNT_1US_MAX)

cnt_1us <= 6'd0;

else

cnt_1us <= cnt_1us + 1'b1;

// 1ms计数器

always @(posedge sys_clk or negedge sys_rst_n)

if(!sys_rst_n)

cnt_1ms <= 10'd0;

else if(cnt_1ms == CNT_1MS_MAX && cnt_1us == CNT_1US_MAX)

cnt_1ms <= 10'd0;

else if(cnt_1us == CNT_1US_MAX)

cnt_1ms <= cnt_1ms + 1'b1;

// 为每个LED生成独立的秒计数器和控制逻辑

genvar i;

generate

for (i = 0; i < 4; i = i + 1) begin : led_inst

// 独立的秒计数器,初始相位错开

always @(posedge sys_clk or negedge sys_rst_n)

if(!sys_rst_n)

cnt_1s[i] <= i * 10'd250;

else if(cnt_1s[i] == CNT_1S_MAX && cnt_1ms == CNT_1MS_MAX && cnt_1us == CNT_1US_MAX)

cnt_1s[i] <= 10'd0;

else if(cnt_1ms == CNT_1MS_MAX && cnt_1us == CNT_1US_MAX)

cnt_1s[i] <= cnt_1s[i] + 1'b1;

// 独立的方向标志

always @(posedge sys_clk or negedge sys_rst_n)

if(!sys_rst_n)

cnt_1s_en[i] <= 1'b0;

else if(cnt_1s[i] == CNT_1S_MAX && cnt_1ms == CNT_1MS_MAX && cnt_1us == CNT_1US_MAX)

cnt_1s_en[i] <= ~cnt_1s_en[i];

// PWM输出控制

always @(posedge sys_clk or negedge sys_rst_n)

if(!sys_rst_n)

led_out[i] <= 1'b0;

else if((cnt_1s_en[i] && cnt_1ms < cnt_1s[i]) || (!cnt_1s_en[i] && cnt_1ms > cnt_1s[i]))

led_out[i] <= 1'b0;

else

led_out[i] <= 1'b1;

end

endgenerate

endmodule

引脚限制

=============================================================================

时钟与复位信号约束

=============================================================================

系统时钟输入(50MHz晶振)

set_property PACKAGE_PIN W19 [get_ports sys_clk]

set_property IOSTANDARD LVCMOS33 [get_ports sys_clk]

全局复位按键(低电平有效)

set_property PACKAGE_PIN N15 [get_ports sys_rst_n]

set_property IOSTANDARD LVCMOS33 [get_ports sys_rst_n]

=============================================================================

LED灯引脚约束

开发板LED为共阳极接法:led_out=0时灯亮,led_out=1时灯灭

=============================================================================

LED0 控制信号

set_property PACKAGE_PIN M21 [get_ports {led_out[0]}]

set_property IOSTANDARD LVCMOS33 [get_ports {led_out[0]}]

LED1 控制信号

set_property PACKAGE_PIN L21 [get_ports {led_out[1]}]

set_property IOSTANDARD LVCMOS33 [get_ports {led_out[1]}]

LED2 控制信号

set_property PACKAGE_PIN K21 [get_ports {led_out[2]}]

set_property IOSTANDARD LVCMOS33 [get_ports {led_out[2]}]

LED3 控制信号

set_property PACKAGE_PIN K22 [get_ports {led_out[3]}]

set_property IOSTANDARD LVCMOS33 [get_ports {led_out[3]}]

相关推荐
北京青翼科技7 小时前
PCIe接口-高速模拟采集—高性能计算卡-青翼科技高品质军工级数据采集板-打造专业工业核心板
图像处理·人工智能·fpga开发·信号处理·智能硬件
dadaobusi18 小时前
verilog重音符号
fpga开发
s090713618 小时前
Xilinx FPGA ISERDES 使用详细介绍
fpga开发·xilinx·ddr·iserdes
虹科智能自动化20 小时前
虹科分享 | SocTek IP Cores:FPGA高端网络与时间同步解决方案
fpga开发·ip核·tsn时间敏感网络
秋风战士20 小时前
无线通信算法之340:信道均衡除法定标讨论
算法·fpga开发·信息与通信
FPGA小迷弟21 小时前
基于FPGA实现HDMI接口,选型/核心技术
学习·fpga开发·verilog·fpga·modelsim
szxinmai主板定制专家1 天前
基于 PC 的控制技术+ethercat+linux实时系统,助力追踪标签规模化生产,支持国产化
arm开发·人工智能·嵌入式硬件·yolo·fpga开发
博览鸿蒙2 天前
如何为春招的金三银四做好准备
fpga开发
FPGA小迷弟2 天前
FPGA处理图像需要用到的主流接口详解
学习·fpga开发·verilog·fpga·modelsim
LeoZY_2 天前
CH347 USB转JTAG功能使用笔记:CH347根据SVF文件实现任意FPGA下载
笔记·stm32·嵌入式硬件·fpga开发·硬件架构·硬件工程