led流水灯


前言

  本章将讲解流水灯的制作,在Cyclone IV开发板上依次点亮四个led灯,并以一定间隔亮灭,达到流水灯的效果。


一、什么是led灯?


DIP发光二极管(直插型)

图1. DIP发光二极管(直插型)

SMD发光二极管(贴片型)

图2. SMD发光二极管(贴片型)

  LED灯就是发光二极管,二极管功能很多,在本实验中我们暂且将其看作是一个开关。二极管在正向电压作用下电阻很小,处于导通状态,相当于一只接通的开关;在反向电压作用下,电阻很大,处于截止状态,如同一只断开的开关。发光二极管在导通的时候发光,在没有导通的时候不发光。发光二极管有点像我们初中做的物理实验。单向开关串联一个灯泡,开关闭合的时候,电流流过灯泡,灯泡发光。开关断开的时候,灯泡也就不亮了。

二、Cyclone IV开发板


cyclone IV

图3. Cyclone IV开发板

  在六位数码管右下方对应的就是四个led灯,在板卡上标注为LED0、LED1、LED2、LED3。

led原理图

图4. led在开发板上的原理图

  四个led灯共阴极接地,所以需要高电平导通led灯。

三,流水灯模块设计

流水灯模块示意图

图5. 流水灯模块示意图

在这里插入图片描述

图6. led位宽

  模块描述:输入信号分别为时钟信号和复位信号,设计一个计时器。每0.2s改变四个led的状态,同一时刻下只能有一只led亮,其余的led灭。最后通过移位寄存器输出信号给四个led灯。
   注意:在基于FPGA的点亮led灯的实验中,已经讲解了项目的建立。所以本章中跳过建立项目的环节,直接上代码。Don't talk too much, show you the code!

四,工程代码

module 	led_test(
	input 	wire 		clk	 ,//50MHz
	input 	wire 	 	rst_n,//reset negetive复位信号下降沿有效
	
	output 	reg [3:0]	led //4个led灯
);


reg [25:0]	cnt;//计数器,计数0.2sx4=0.8s,10_000_000x4=40_000_000

//计数器模块
always@(posedge clk or negedge rst_n)begin
	if(!rst_n)begin
		cnt <= 26'd0;//复位的时候,计数器从0开始计数
	end 
	else if(cnt == 40_000_000 - 1)begin//从0开始计数,所以只记到39_999_999
		cnt <= 26'd0;
	end 
	else begin
		cnt = cnt + 1'd1;
	end 
end 

always@(posedge clk or negedge rst_n)begin
	if(!rst_n)begin
		led <= 4'b0000;//led灯高电平有效,低电平无效,1亮0不亮
	end 
	else if(cnt == 10_000_000 -1 )begin//0.2s时亮右边第一个led灯  
		led <= 4'b0001;
	end
	else if(cnt == 20_000_000 -1 )begin//0.4s时亮右边第二个led灯  
		led <= 4'b0010;
	end
	else if(cnt == 30_000_000 -1 )begin//0.6s时亮右边第三个led灯  
		led <= 4'b0100;
	end
	else if(cnt == 40_000_000 -1 )begin//0.8s时亮右边第四个led灯  
		led <= 4'b1000;
	end
	else begin
		led <= led;//否则让led为当前状态,可以不写
	end 
end 
endmodule 

  在fpga中,除了编写程序,还有很重要的环节—仿真,不管是功能仿真或者是时序仿真,都是必不可少的。有做软件的同学,来到fpga就要转换之前show me the code的观念,还有simulation。


五、功能仿真

`timescale 1ns/1ns//单位/精度
module 	led_test_tb();

reg 		clk  ;//时钟信号
reg 		rst_n;//复位信号

wire [3:0] 	led  ;//4个led灯
always #10 clk = ~clk;//每10ns翻转一次时钟信号

initial begin
	clk       = 0;//初始化时钟信号为0
	rst_n 	  = 0;//初始化复位信号为0
	#10 rst_n = 1;//10ns后将复位信号置1
	#1000 $stop;//1000ns后停止,可以观看4个led灯的信号
end 

led_test	u_led_test(//实例化
.clk	(clk)  ,//50MHz
.rst_n	(rst_n),//reset negetive复位信号下降沿有效

.led 	(led)//4个led灯
);
endmodule 

  注意:仿真的时候,将间隔0.2s改小,这样我们才能在1000ns内看到四个led灯的变化。


六、modelsim

设置测试文件

图7. 设置测试文件

选择测试文件面板

图8. 选择测试文件面板

在这里插入图片描述

图9. 添加测试文件面板

测试文件设置

图10. 测试文件设置面板

打开仿真

图11. 打开仿真

仿真结果

图12. 仿真结果

七,引脚分配

布局布线

图13. 引脚分配图

元件管脚
LED0G15
LED1F16
LED2F15
LED3D16
KEY0E15
KEY1E16
KEY2M16
KEY3M15
CLOCK(时钟)E1
表1. 引脚信息表

八,运行效果

流水灯


总结

  以上就是今天要讲的内容,本文介绍了流水灯的设计,在下一期课程中,将会增加按键信号,制作更为复杂的按键控制led灯。由于仿真不是本章节的重点,所以只演示仿真的过程,没有细讲,这并不代表仿真不重要。后期的作品会出一期单独讲解仿真的课程(功能仿真和时序仿真)。提醒:后期作品以实验名称命名。敬请期待,谢谢观看。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值