1、实验目的
在逻辑派Z1开发板上利用8个led灯进行呼吸灯闪烁。
2、实验原理
由原理图可知,逻辑派Z1开发板板载led为高电平点亮。我们可以利用板卡输出PWM波来控制小灯亮灭,在相同时间段内的不同占空比,即在同样小时间段内,小灯亮的时间依次增加到最大后再依次减小,从而实现渐亮到渐灭的“呼吸”效果。
3、代码设计
我们可以使用简单的计数器原理实现呼吸灯功能,其具体代码如下:
verilog
`timescale 1ns/1ns
module breath_led #(
parameter CNT_1US_MAX = 6'd49, // 1us计数器的最大值
parameter CNT_1MS_MAX = 10'd999, // 1ms计数器的最大值
parameter CNT_1S_MAX = 10'd999 // 1s计数器的最大值
)(
input wire sys_clk, // 系统时钟50MHz
input wire sys_rst_n, // 全局复位
output wire [7:0] led_out // 输出信号,控制LED灯
);
// 内部寄存器定义
reg [5:0] cnt_1us;
reg [9:0] cnt_1ms;
reg [9:0] cnt_1s;
reg cnt_1s_en;
reg led;
// 将单个LED信号扩展为8位,用于控制8个LED
assign led_out = {8{led}};
// 1us计数器
always @(posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
cnt_1us <= 6'b0;
else if (cnt_1us == CNT_1US_MAX)
cnt_1us <= 6'b0;
else
cnt_1us <= cnt_1us + 1'b1;
// 1ms计数器
always @(posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
cnt_1ms <= 10'b0;
else if (cnt_1ms == CNT_1MS_MAX && cnt_1us == CNT_1US_MAX)
cnt_1ms <= 10'b0;
else if (cnt_1us == CNT_1US_MAX)
cnt_1ms <= cnt_1ms + 1'b1;
// 1s计数器
always @(posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
cnt_1s <= 10'b0;
else if (cnt_1s == CNT_1S_MAX && cnt_1ms == CNT_1MS_MAX && cnt_1us == CNT_1US_MAX)
cnt_1s <= 10'b0;
else if (cnt_1ms == CNT_1MS_MAX && cnt_1us == CNT_1US_MAX)
cnt_1s <= cnt_1s + 1'b1;
// 1s计数器使能信号
always @(posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
cnt_1s_en <= 1'b0;
else if (cnt_1s == CNT_1S_MAX && cnt_1ms == CNT_1MS_MAX && cnt_1us == CNT_1US_MAX)
cnt_1s_en <= ~cnt_1s_en;
// LED 控制信号
always @(posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
led <= 1'b0;
else if ((cnt_1s_en == 1'b1 && cnt_1ms < cnt_1s) || (cnt_1s_en == 1'b0 && cnt_1ms > cnt_1s))
led <= 1'b0;
else
led <= 1'b1;
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
代码中定义了一个微秒级、毫秒级和秒级的计数器。通过这三个计数器,系统时钟被精确分割为1微秒、1毫秒和1秒的时间单位。每当微秒计数器达到50个时钟周期(即1微秒)时,它会复位并重新开始计数。类似地,当毫秒计数器达到1000微秒时,也会复位,1秒计数器则是每过1000毫秒递增一次。
在1秒计数器中,使能信号cnt_1s_en会每过1秒时翻转一次,控制LED亮度的渐变方向。具体来说,当使能信号为高时,LED逐渐变亮;当使能信号为低时,LED逐渐变暗。输出信号led_out通过八位宽度的信号控制LED灯,使所有连接的LED灯同时亮暗变化,呈现出呼吸灯的效果。
通过这种逐渐增加和减少亮度的方式,LED实现了类似呼吸的效果。
约束文件如下:
verilog
create_clock -name {clk} [get_ports {sys_clk}] -period {20.000} -waveform {0.000 10.000}
define_attribute {p:led_out[7]} {PAP_IO_DIRECTION} {OUTPUT}
define_attribute {p:led_out[7]} {PAP_IO_LOC} {28}
define_attribute {p:led_out[7]} {PAP_IO_VCCIO} {1.2}
define_attribute {p:led_out[7]} {PAP_IO_STANDARD} {LVCMOS12}
define_attribute {p:led_out[7]} {PAP_IO_DRIVE} {2}
define_attribute {p:led_out[7]} {PAP_IO_NONE} {TRUE}
define_attribute {p:led_out[7]} {PAP_IO_SLEW} {SLOW}
define_attribute {p:led_out[6]} {PAP_IO_DIRECTION} {OUTPUT}
define_attribute {p:led_out[6]} {PAP_IO_LOC} {27}
define_attribute {p:led_out[6]} {PAP_IO_VCCIO} {1.2}
define_attribute {p:led_out[6]} {PAP_IO_STANDARD} {LVCMOS12}
define_attribute {p:led_out[6]} {PAP_IO_DRIVE} {2}
define_attribute {p:led_out[6]} {PAP_IO_NONE} {TRUE}
define_attribute {p:led_out[6]} {PAP_IO_SLEW} {SLOW}
define_attribute {p:led_out[5]} {PAP_IO_DIRECTION} {OUTPUT}
define_attribute {p:led_out[5]} {PAP_IO_LOC} {26}
define_attribute {p:led_out[5]} {PAP_IO_VCCIO} {1.2}
define_attribute {p:led_out[5]} {PAP_IO_STANDARD} {LVCMOS12}
define_attribute {p:led_out[5]} {PAP_IO_DRIVE} {2}
define_attribute {p:led_out[5]} {PAP_IO_NONE} {TRUE}
define_attribute {p:led_out[5]} {PAP_IO_SLEW} {SLOW}
define_attribute {p:led_out[4]} {PAP_IO_DIRECTION} {OUTPUT}
define_attribute {p:led_out[4]} {PAP_IO_LOC} {25}
define_attribute {p:led_out[4]} {PAP_IO_VCCIO} {1.2}
define_attribute {p:led_out[4]} {PAP_IO_STANDARD} {LVCMOS12}
define_attribute {p:led_out[4]} {PAP_IO_DRIVE} {2}
define_attribute {p:led_out[4]} {PAP_IO_NONE} {TRUE}
define_attribute {p:led_out[4]} {PAP_IO_SLEW} {SLOW}
define_attribute {p:led_out[3]} {PAP_IO_DIRECTION} {OUTPUT}
define_attribute {p:led_out[3]} {PAP_IO_LOC} {24}
define_attribute {p:led_out[3]} {PAP_IO_VCCIO} {1.2}
define_attribute {p:led_out[3]} {PAP_IO_STANDARD} {LVCMOS12}
define_attribute {p:led_out[3]} {PAP_IO_DRIVE} {2}
define_attribute {p:led_out[3]} {PAP_IO_NONE} {TRUE}
define_attribute {p:led_out[3]} {PAP_IO_SLEW} {SLOW}
define_attribute {p:led_out[2]} {PAP_IO_DIRECTION} {OUTPUT}
define_attribute {p:led_out[2]} {PAP_IO_LOC} {23}
define_attribute {p:led_out[2]} {PAP_IO_VCCIO} {1.2}
define_attribute {p:led_out[2]} {PAP_IO_STANDARD} {LVCMOS12}
define_attribute {p:led_out[2]} {PAP_IO_DRIVE} {2}
define_attribute {p:led_out[2]} {PAP_IO_NONE} {TRUE}
define_attribute {p:led_out[2]} {PAP_IO_SLEW} {SLOW}
define_attribute {p:led_out[1]} {PAP_IO_DIRECTION} {OUTPUT}
define_attribute {p:led_out[1]} {PAP_IO_LOC} {22}
define_attribute {p:led_out[1]} {PAP_IO_VCCIO} {1.2}
define_attribute {p:led_out[1]} {PAP_IO_STANDARD} {LVCMOS12}
define_attribute {p:led_out[1]} {PAP_IO_DRIVE} {2}
define_attribute {p:led_out[1]} {PAP_IO_NONE} {TRUE}
define_attribute {p:led_out[1]} {PAP_IO_SLEW} {SLOW}
define_attribute {p:led_out[0]} {PAP_IO_DIRECTION} {OUTPUT}
define_attribute {p:led_out[0]} {PAP_IO_LOC} {21}
define_attribute {p:led_out[0]} {PAP_IO_VCCIO} {1.2}
define_attribute {p:led_out[0]} {PAP_IO_STANDARD} {LVCMOS12}
define_attribute {p:led_out[0]} {PAP_IO_DRIVE} {2}
define_attribute {p:led_out[0]} {PAP_IO_NONE} {TRUE}
define_attribute {p:led_out[0]} {PAP_IO_SLEW} {SLOW}
define_attribute {p:sys_clk} {PAP_IO_DIRECTION} {INPUT}
define_attribute {p:sys_clk} {PAP_IO_LOC} {5}
define_attribute {p:sys_clk} {PAP_IO_VCCIO} {1.2}
define_attribute {p:sys_clk} {PAP_IO_STANDARD} {LVCMOS12}
define_attribute {p:sys_clk} {PAP_IO_PULLUP} {TRUE}
define_attribute {p:sys_rst_n} {PAP_IO_DIRECTION} {INPUT}
define_attribute {p:sys_rst_n} {PAP_IO_LOC} {20}
define_attribute {p:sys_rst_n} {PAP_IO_VCCIO} {1.2}
define_attribute {p:sys_rst_n} {PAP_IO_STANDARD} {LVCMOS12}
define_attribute {p:sys_rst_n} {PAP_IO_PULLUP} {TRUE}
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
4、实验现象
逻辑派Z1开发板上8个led灯以两秒为一个周期进行闪烁,形成呼吸灯的效果。