(1)设计定义:开发板板载有4个led灯,fpga输出高电平给led灯时,会点亮led,现在设计一个程序,实现每个2秒,循环点亮led灯的效果。
(2)Visio视图:
(3)Verilog 代码:
module water_led(clk,reset_n,led_out);
input clk;
input reset_n;
output reg [3:0]led_out;
//2s = 2_000_000_000 ns = 20ns * 100_000_000 ,可以使用一个28位的寄存器进行计数
reg [27:0]cnt;
reg cnt_flag;
parameter MCNT = 28'd99_999_999;
//2s计数器模块设计
always@(posedge clk or negedge reset_n)
if(!reset_n)
cnt <= 28'd0;
else if(cnt == MCNT)
cnt <= 28'd0;
else
cnt <= cnt + 28'd1;
//计数完成标志信号cnt_flag信号设计
always@(posedge clk or negedge reset_n)
if(!reset_n)
cnt_flag <= 1'd0;
else if(cnt == MCNT - 28'd1)
cnt_flag <= 1'd1;
else
cnt_flag <= 1'd0;
//流水灯主程序设计
always@(posedge clk or negedge reset_n)
if(!reset_n)
led_out <= 4'b0001;
else if(cnt_flag)
led_out <= {led_out[2:0],led_out[3]};
else
led_out <= led_out;
endmodule
(4)仿真文件代码:
`timescale 1ns / 1ps
module water_led_tb;
reg clk;
reg reset_n;
wire [3:0]led_out;
water_led water_led_inst(
.clk(clk),
.reset_n(reset_n),
.led_out(led_out)
);
defparam water_led_inst.MCNT = 28'd99;
initial clk = 1'd1;
always #10 clk = ~clk;
initial begin
reset_n <= 1'd0;
#15;
reset_n <= 1'd1;
#20000;
$stop;
end
endmodule
(5)仿真波形:
(6)引脚绑定: