1、实验目的
掌握流水灯原理并实现流水灯。
2、实验要求
流水灯:8个LED灯以0.5s间隔交替闪烁。
3、实验原理
使用计时器计时0.5s,每隔0.5s改变依次LED灯的状态。将8个LED灯流水式的点亮,在C语言中做流水灯的实验需要用到一个中间变量:
代码如下所示:
c
int data;
int temp1,temp2;
data = 0x01;
temp1 = data >> 7;
temp2 = data <<1;
data = temp1 | temp2;
1
2
3
4
5
6
7
2
3
4
5
6
7
数据位的搬移如图所示:
在FPGA的开发中使用的时基于硬件的硬件描述语言,实验中使用的硬件描述语言为verilog语言,verilog的处理单位为1bit;8bit的位宽数据可看作8个独立的信号线,这8个信号线之间的排序及相互之间的赋值可以随意组合;代码如下:
verilog
reg [7:0] data;
always @(posedge clk)
data <= {data[6:0],data[7]};
//或:
wire [7:0] data1;
wire [7:0] out;
assign out = {data1[6:0],data1[7]};
1
2
3
4
5
6
7
2
3
4
5
6
7
数据位移位如下图所示:
4、实验源码设计
计时器计时0.5s时归0重新计时,并且此时通过移位变更LED灯状态。
verilog
`timescale 1ns / 1ps
`define UD #1
module led_water(
input clk ,
input rstn ,
output [7:0] led
);
//=====================================================================
//reg and wire
reg [25:0] led_light_cnt = 26'd0 ;
reg [ 7:0] led_status = 8'b0000_0001 ;
//time counter
always @(posedge clk)
begin
if(!rstn)
led_light_cnt <= `UD 26'd0;
else if(led_light_cnt == 26'd24_999_999)
led_light_cnt <= `UD 26'd0;
else
led_light_cnt <= `UD led_light_cnt + 26'd1;
end
//led status change
always @(posedge clk)
begin
if(!rstn)
led_status <= `UD 8'b0000_0001;
else if(led_light_cnt == 25'd24_999_999)
led_status <= `UD {led_status[6:0],led_status[7]};
end
assign led = led_status;
endmodule
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
5、实验现象
打开烧录程序界面,设备连接好后连接JTAG,选择要下载的程序的sbit,如下所示:
下载完成后可以观察到流水灯:8个LED灯以0.5s间隔交替闪烁。LED1灯亮如下图所示:
LED8灯亮如下所示: