流水灯 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 仿真结果
总结
- 核心思想:明白如何使用计数器来实现特定的功能,主要是对计数器练习的一个目的
- 知识点总结:
- 计数器和flag的产生
- 计数器和flag的使用
- 移位的方式的妙用
- 欢迎一起交流学习,如有错误之处,还请各位指正。
参考资料
[1] FPGA系列教学