设计定义:让LED灯按照指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定,以0.25秒为一个变化周期,8个变化状态为一个循环。
一、代码实现
`timescale 1ns / 1ns
module led_step3(
input clk ,
input rstn ,
input[7:0] ctrl ,
output led
);
reg[23:0] cnt ;
reg[2:0] count ;
reg r_led ;
assign led = r_led ;
parameter MCNT = 12_500_000;
always @(posedge clk or negedge rstn) begin
if(!rstn)
cnt <= 0;
else if(cnt == MCNT - 1)
cnt <= 0;
else
cnt <= cnt + 1'd1;
end
always @(posedge clk or negedge rstn) begin
if(!rstn)
count <= 0;
else if(cnt == MCNT - 1)
count <= count + 1'd1;
end
always @(*) begin
case(count)
3'b000: r_led <= ctrl[0];
3'b001: r_led <= ctrl[1];
3'b010: r_led <= ctrl[2];
3'b011: r_led <= ctrl[3];
3'b100: r_led <= ctrl[4];
3'b101: r_led <= ctrl[5];
3'b110: r_led <= ctrl[6];
3'b111: r_led <= ctrl[7];
default: r_led <= 0;
endcase
end
endmodule
二、仿真
`timescale 1ns / 1ps
module led_step3_tb();
reg clk ;
reg rstn ;
reg[7:0] ctrl ;
wire led ;
led_step3 #(
.MCNT(12500)
)inst0(
.clk (clk ) ,
.rstn (rstn) ,
.ctrl (ctrl) ,
.led (led )
);
initial clk = 1;
always #10 clk = ~clk;
initial begin
rstn = 0;
ctrl = 0;
#201;
rstn = 1;
ctrl = 8'b01001011;
#1000_000_000;
$stop;
end
endmodule