流水灯 verilog FPGA 基础练习7

本文介绍了使用Verilog在FPGA中实现流水灯的基本练习,涉及计数器、flag的使用以及移位操作的应用,通过实际代码展示了如何利用计数器控制LED灯的亮灭周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

流水灯 verilog FPGA 基础练习7

发现问题,用技术解决问题。兴趣是自己的源动力 !

目录

    • 流水灯 verilog FPGA 基础练习7
  • 前言
  • 一、流水灯方案
    • 1.1功能代码
      • 1.1.2 仿真代码
      • 1.1.3 仿真结果
  • 总结

前言

流水灯也是对计数器和计数器的使用的一个练习。很简单的一个功能,主要是熟练对一下两个点

  • 计数器
  • 计数器和flag的使用

一、流水灯方案

实现下面的途中的流水灯方案,详细可直接看代码。
在这里插入图片描述

1.1功能代码

module water_led
#(
parameter CNT_MAX = 25'd24_999_999
)
(
input wire sys_clk , //系统时钟50MHz
input wire sys_rst_n , //全局复位

output wire [3:0] led_out //输出控制led灯

 );
// *******************************************
// 实现流水灯的主要步骤有两个
// 第一个:计数器和flag
// 第二个:对flag的使用,以达到0.5秒亮一个灯
// *******************************************
reg [24:0] cnt_0p5;
reg flag_0p5;
reg [3:0]led_out_temp;

// 首先实现一个计数器
always@(posedge sys_clk or negedge sys_rst_n) begin
	if(sys_rst_n == 1'b0)
		cnt_0p5 <= 1'b0; 
	else if(cnt_0p5 == CNT_MAX) // 计数到0.5s,清零
		cnt_0p5 <= 1'b0;
	else 
		cnt_0p5 <= cnt_0p5 + 1'b1;
end

// 0.5秒指示,注意要flag因为要多一拍,所以这里要提前一拍拉高
always@(posedge sys_clk or negedge sys_rst_n) begin
	if(sys_rst_n == 1'b0)
		flag_0p5 <= 1'b0; 
	else if(cnt_0p5 == CNT_MAX - 1'b1) // 计数到0.5s,清零
		flag_0p5 <= 1'b1;
	else 
		flag_0p5 <= 1'b0;
end

// 流水灯信号输出,输出流水灯的方式有很多,如case,移位,或者更多方式
// 本质都是明白要如何使用flag信号到达自己的目的
// 假定灯是低信号亮,

// *******************************************
// 这里学一个使用移位处理信号的方法:
// 如果要使用流水灯,可以想象4'b0001中的1,是流水灯,那么用移位的方法就理解了
// 这就是移位的妙处
// *******************************************

always@(posedge sys_clk or negedge sys_rst_n) begin
	if(sys_rst_n == 1'b0) 
		led_out_temp <= 4'b0001; 
	else if(flag_0p5  == 1'b1 & led_out_temp == 4'b1000) // 当移位到4'b1000时,下一个flag来到,就会归为到4'b0001;
		led_out_temp <= 4'b0001; 
	else if(flag_0p5  == 1'b1)
		led_out_temp <= led_out_temp << 1'b1;
	else 
		led_out_temp <= led_out_temp ;
end

assign led_out = ~ led_out_temp;

endmodule

1.1.2 仿真代码

`timescale 1ns/1ns
module tb_top;

reg sys_clk;
reg sys_rst_n;
wire [3:0]led_out;

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

always #10 sys_clk = ~sys_clk;



water_led 
#(
.CNT_MAX(25'd24)
)
u0_water_led
(
.sys_clk 	(sys_clk 	)		, //系统时钟50MHz
.sys_rst_n 	(sys_rst_n 	)		, //全局复位
.led_out 	(led_out 	)		//输出控制led灯

 );
endmodule

1.1.3 仿真结果

在这里插入图片描述

总结

  • 核心思想:明白如何使用计数器来实现特定的功能,主要是对计数器练习的一个目的
  • 知识点总结:
    1. 计数器和flag的产生
    2. 计数器和flag的使用
    3. 移位的方式的妙用
  • 欢迎一起交流学习,如有错误之处,还请各位指正。

参考资料

[1] FPGA系列教学

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值