FPGA入门实验之简单四位流水灯+闪烁灯与流水灯组合

设计要求

要求为上电实现4位led依次循环点亮,按下复位按键熄灭。

设计思路

主要采用case语句或者移位的形式实现依次点亮功能,前者类似于“递推赋值”,后者是比较容易理解且全面点的。

设计代码1(case语句实现)

module water_light2(
    input clk,
	 input rst_n,    		 //复位按键
    output [3:0] led
   
    );

reg[1:0] state=0;       //判断led的位置
reg[4:0] led;			
reg [21:0]cn=0;			//分频系数 
reg clk_show=0;				//分频后的时钟信号

always @ ( posedge clk or negedge rst_n)
begin
	if(!rst_n)
		begin
			clk_show<=0;
			cn<=0;
		end
	else
		if(cn<12)         //分频系数cn可自行调整
			cn<=cn+1;
		else
			begin
				cn<=0;			
				clk_show<=~clk_show;
			end
end

always@(posedge clk_show or negedge rst_n )
begin
	if(!rst_n)
		begin
			led<=4'b1111;
			state<=0;
		end
	else
	begin      
		case(state)
			0:begin                  //开始时state为0,满足条件 
				led<=4'b0111;
				state<=1;        
				end
			1:begin
				led<=4'b1011;
				state<=2;			
				end
			2:begin
				led<=4'b1101;	
				state<=3;				
				end
			3:begin
				led<=4'b1110;
				state<=0;			
				end
			default: 
				state<=0;
			endcase
	end
end
endmodule

Modelsim仿真测试

可能由于重装过ise和modelsim,数据库不一样。仿真加载不出。所以代码仅供参考。
下一次写闪耀灯再做完整仿真。

设计代码2

这一种方法比较全面,亮的间隔以及消除毛刺都有涉及,当然资源使用就比较多,这里没有涉及到优化。(没有复位按键设计,可自行添加。)

module led(
    input clk_50m,
    output [7:0] led
    );
	 
	parameter T0S2=100;//10000000     //100方便仿真
   reg [10:0]counter=0;    
//	wire clk_2hz;                     //0.5s间隔
	///中间变量主要为消除毛刺///
	reg [7:0] led0 = 0;      			
	reg [7:0] led1 = 0;
	
	always@(posedge clk_50m) begin    //计数模块
	   if (counter == T0S2) begin
			counter <= 0;
		end
		else	counter <= counter+1;	
	end
	
	  reg [2:0]adress=0;
	  reg flag=0;
	  
	always@(posedge clk_50m)begin      //判断循环标志位
		if(adress==7)
			flag <= 1;
		else if(adress==0)
			flag <=0;
		else flag <= flag;
	end
	
	always@(posedge clk_50m)begin       //移位操作
		if(counter==(T0S2/2))begin  
	     if(flag==1)
		     adress <= adress-1;
		  else if(flag==0)
			  adress <= adress+1;
		end
		 else adress <= adress;
	end
	
	always@(adress)begin          判断第几位点亮,其余位为灭
		led0 <= 8'b0000_0000;
		led0[adress] <= 1;
	end
	//	D触发器消除毛刺
   always@(posedge clk_50m)begin
		led1 <= led0;
	end
	
	assign led = led1;
	
	endmodule

RTL原理图

在这里插入图片描述

Modelsim仿真

激励文件中只需要产生个(50m)时钟信号即可。

在这里插入图片描述
仿真波形如上,功能实现。如果要设计间隔,只需调整代码中的计数参数即可。

能力有限,如有问题还请指出。

闪烁灯+7位流水灯的实现(仿真有点显示问题,开发板暂无)

方法与上面第二个相同,主要就是高一位负责1s的闪烁,低7位负责流水的实现。
仿真有点小问题,我猜测哈,是拼接符的使用问题(因为对8位差错改变,不知道该显示哪个?),仿真显示时间有点不对。如果将闪烁灯那一位单独提出来输出就没问题。
在这里插入图片描述
单独的看闪烁灯的间隔是1s没错,那流水灯就感觉不对,由于没有开发板也没法验证。感兴趣的大佬还请告知哪儿错了 -

在这里插入图片描述

最后一个实验完整程序
链接: https://pan.baidu.com/s/1zZg65_VeRBRTpD04XP74RQ 提取码: snxt

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值