一、实验任务
本节的实验任务是使用达芬奇开发板上的四个 LED 灯顺序点亮并熄灭,循环往复产生流水灯的效果,流水间隔时间为 0.5s。LED 灯硬件原理图如下图所示:
二、程序设计
2.1 流水灯模块设计
模块flow_led。输入:sys_clk,sys_rst_n。输出:led。
2.2 流水灯波形图
系统时钟为50MHZ,0.5s需要0.5*50_000_000=25_000_000个时钟周期,所以cnt需要计数25000000-1次。
2.3 RTL代码设计
RTL代码flow_led.v如下:
module flow_led(
input sys_clk;
input sys_rst_n;
output reg [3:0] led;
);
reg [24:0] cnt;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
cnt <= 25'd0;
else if(cnt == 25'd25000000 - 25'd1)
cnt <= 25'd0;
else
cnt <= cnt + 1;
end
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
led <= 4'b0001;
else if(cnt == 25'd25000000 - 25'd1)
led <= {led[2:0],led[3]};
else
led <= led;
end
endmodule
2.3 仿真验证
仿真代码tb_flow_led.v如下:
`timescale 1ns/1ns
module tb_flow_led();
parameter CLK_PERIOD = 20; //时钟周期为20ns
reg sys_clk;
reg sys_rst_n;
initial begin //初始化时钟与复位
sys_clk <= 1'b0;
sys_rst_n <= 1'b0;
#200
sys_rst_n <= 1'b1;
end
always @(#CLK_PERIOD) sys_clk = ~sys_clk;
flow_led u_flow_led(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.led (led)
);
endmodule
由于0.5s仿真周期太长,所以我们将flow_led.v中的cnt的周期缩短为25。
仿真结果如下图:
三、下载验证
3.1引脚约束
#时序约束
create_clock -period 20.000 -name sys_clk -waveform {0.000 10.000} [get_ports sys_clk]
#IO 管脚约束
set_property -dict {PACKAGE_PIN R4 IOSTANDARD LVCMOS33} [get_ports sys_clk]
set_property -dict {PACKAGE_PIN U2 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]
set_property -dict {PACKAGE_PIN R2 IOSTANDARD LVCMOS33} [get_ports {led[0]}]
set_property -dict {PACKAGE_PIN R3 IOSTANDARD LVCMOS33} [get_ports {led[1]}]
set_property -dict {PACKAGE_PIN V2 IOSTANDARD LVCMOS33} [get_ports {led[2]}]
set_property -dict {PACKAGE_PIN Y2 IOSTANDARD LVCMOS33} [get_ports {led[3]}]
3.2 分析与综合
通过vivado分析与综合后结果如下:
3.3 上板验证
将开发板与电脑连接下载验证,结果与预期符合呈现流水灯效果。