本文已参与「新人创作礼」活动,一起开启掘金创作之路。
本章将讲解流水灯的制作,在Cyclone IV开发板上依次点亮四个led灯,并以一定间隔亮灭,达到流水灯的效果。
一、什么是led灯?
图1. DIP发光二极管(直插型)
图2. SMD发光二极管(贴片型)
LED灯就是发光二极管,二极管功能很多,在本实验中我们暂且将其看作是一个开关。二极管在正向电压作用下电阻很小,处于导通状态,相当于一只接通的开关;在反向电压作用下,电阻很大,处于截止状态,如同一只断开的开关。发光二极管在导通的时候发光,在没有导通的时候不发光。发光二极管有点像我们初中做的物理实验。单向开关串联一个灯泡,开关闭合的时候,电流流过灯泡,灯泡发光。开关断开的时候,灯泡也就不亮了。
二、Cyclone IV开发板
图3. Cyclone IV开发板
在六位数码管右下方对应的就是四个led灯,在板卡上标注为LED0、LED1、LED2、LED3。
图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 ,
input wire rst_n,
output reg [3:0] led
);
reg [25:0] cnt;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt <= 26'd0;
end
else if(cnt == 40_000_000 - 1)begin
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;
end
else if(cnt == 10_000_000 -1 )begin
led <= 4'b0001;
end
else if(cnt == 20_000_000 -1 )begin
led <= 4'b0010;
end
else if(cnt == 30_000_000 -1 )begin
led <= 4'b0100;
end
else if(cnt == 40_000_000 -1 )begin
led <= 4'b1000;
end
else begin
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 ;
always #10 clk = ~clk;
initial begin
clk = 0;
rst_n = 0;
#10 rst_n = 1;
#1000 $stop;
end
led_test u_led_test(
.clk (clk) ,
.rst_n (rst_n),
.led (led)
);
endmodule
注意:仿真的时候,将间隔0.2s改小,这样我们才能在1000ns内看到四个led灯的变化。
六、modelsim
图7. 设置测试文件
图8. 选择测试文件面板
图9. 添加测试文件面板
图10. 测试文件设置面板
图11. 打开仿真
图12. 仿真结果
七,引脚分配
图13. 引脚分配图
| 元件 | 管脚 |
|---|---|
| LED0 | G15 |
| LED1 | F16 |
| LED2 | F15 |
| LED3 | D16 |
| KEY0 | E15 |
| KEY1 | E16 |
| KEY2 | M16 |
| KEY3 | M15 |
| CLOCK(时钟) | E1 |
表1. 引脚信息表
八,运行效果
流水灯
以上就是今天要讲的内容,本文介绍了流水灯的设计,在下一期课程中,将会增加按键信号,制作更为复杂的按键控制led灯。由于仿真不是本章节的重点,所以只演示仿真的过程,没有细讲,这并不代表仿真不重要。后期的作品会出一期单独讲解仿真的课程(功能仿真和时序仿真)。提醒:后期作品以实验名称命名。敬请期待,谢谢观看!