设计要求:上电后4个LED灯呈现流水状。
//----------------------------------------------------------------------------------------
// Created by: Active_Zmw
// File name: flow_led
// Descriptions: 流水灯
//content: 源代码+仿真
//----------------------------------------------------------------------------------------
//源代码
module flow_led(
input sys_clk , //系统时钟
input sys_rst_n, //系统复位,低电平有效
output reg [3:0] led //4个LED灯
);
//reg define
reg [23:0] counter;
//*****************************************************
//** main code
//*****************************************************
//计数器对系统时钟计数,计时0.2秒
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n)
counter <= 24'd0;
else if (counter < 24'd1000_0000)
counter <= counter + 1'b1;
else
counter <= 24'd0;
end
//通过移位寄存器控制IO口的高低电平,从而改变LED的显示状态
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n)
led <= 4'b0001;
else if(counter == 24'd1000_0000)
led[3:0] <= {led[2:0],led[3]};
//初始0001、0.2S后0010、在0.2S后0100、在0.2S后1000、在0.2S后0001以此往复
else
led <= led;
end
endmodule
//仿真
`timescale 1ns/1ns // 定义仿真时间单位1ns和仿真时间精度为1ns
module flow_led_tb; // 测试模块
//parameter define
parameter T = 20; // 时钟周期为20ns
//reg define
reg sys_clk; // 时钟信号
reg sys_rst_n; // 复位信号
//wire define
wire [3:0] led;
//*****************************************************
//** main code
//*****************************************************
//给输入信号初始值
initial begin
sys_clk = 1'b0;
sys_rst_n = 1'b0; // 复位
#(T+1) sys_rst_n = 1'b1; // 在第21ns的时候复位信号信号拉高
end
//50Mhz的时钟,周期则为1/50Mhz=20ns,所以每10ns,电平取反一次
always #(T/2) sys_clk = ~sys_clk;
//例化led模块
flow_led u0_flow_led (
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n),
.led (led )
);
endmodule