我是靠谱客的博主 单薄世界,最近开发中收集的这篇文章主要介绍11FPGA流水灯,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、波形图

要实现流水灯,首先需要一个计数器,我们实现的是0.5s亮,然后0.5s灭的流水灯,所以根据50mhz的晶振可以计算出,0.5s最大计数值为24999999,所以cnt的值为0~24999999,是一个25位宽的数值。设置一个标志信号来控制输出led,我们采取的是左移实现循环,但是左移会出现全为低电平的情况,因此设置一个led_out_reg对其进行左移然后取反,即可得到我们需要的结果。
在这里插入图片描述

二、实现
1.程序
module water_led
#(
parameter CNT_MAX = 25’d24_999_999
)
(
input wire sys_clk,
input wire sys_rst_n,

output wire [3:0] led_out
);

reg [24:0] cnt;
reg cnt_flag;
reg [3:0] led_out_reg;

always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
cnt <= 25’d0;
else if (cnt == CNT_MAX)
cnt <= 25’d0;
else
cnt <= cnt + 25’d1;

always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
cnt_flag <= 1’b0;
else if (cnt == (CNT_MAX-25’d1))
cnt_flag <= 1’b1;
else
cnt_flag <= 1’b0;

/*********
下面的两个else if 不能调换,如果调换会先执行前面的
if—else语句中间的程序,为阻塞赋值
******************/
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
led_out_reg <= 4’b0001;
else if ((led_out_reg == 4’b1000) && (cnt_flag == 1’b1))
led_out_reg <= 4’b0001;
else if (cnt_flag == 1’b1)
led_out_reg <= led_out_reg << 1;
else
led_out_reg <= led_out_reg;

assign led_out = ~led_out_reg;

endmodule

2.仿真程序
`timescale 1ns/1ns
module tb_water_led ();

reg sys_clk ;
reg sys_rst_n ;

wire [3:0] led_out;

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

always #10 sys_clk = ~sys_clk;

water_led
#(
.CNT_MAX(25’d24)
)
water_led_inst
(
.sys_clk (sys_clk) ,
.sys_rst_n (sys_rst_n) ,

.led_out (led_out)
);

endmodule

最后

以上就是单薄世界为你收集整理的11FPGA流水灯的全部内容,希望文章能够帮你解决11FPGA流水灯所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部