一、设计目标
让led灯根据指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定。8个变化状态为一个循环,每个变化的时间值根据不同的应用场景选择。这里要补充的是:led分成8个状态,但是,其每个状态的时间值是相等的。
二、设计思路
根据设计目标可知,八个状态为一个循环周期,而每个状态的时间是固定的,首先确定输入为clk、reset_n,输出为led,但是由于需要用户指定变化模式,故8个转态下加入8位的控制变量ctrl,此处Ctrl对应指定8个状态,故需为8位,同时每个状态的时间也由用户指定,加入时间变量Time(此处Time为计数器计数的值,需要由时间/20ns得到,对应位数需要根据所需定义的时间计算)。同时,加入了计数器2,即counter2,此处counter2是当counter满一次则进1,定义为3位,正好对应8个状态。
三、设计代码
module counter_led4(
clk,
reset_n,
ctrl,
Time,
led
);
input clk;
input reset_n ;
input [30:0]Time;
output reg led;
input [7:0]ctrl;
reg [26:0]counter ;
reg [2:0]counter2;
always@(posedge clk or negedge reset_n)begin
if(!reset_n)
counter <= 0;
else if(counter==Time-1)
counter <= 0;
else
counter <= counter+1'b1;
end
always@(posedge clk or negedge reset_n)begin
if(!reset_n)
counter2 <= 0;
else if(counter2==3'b111)
counter2 <= 0;
else if(counter==Time-1)
counter2 <= counter2+1'b1;
end
always@(posedge clk or negedge reset_n)begin
if(!reset_n)
led <= 0;
else case(counter2)
3'b000:led <=ctrl[1];
3'b001:led <=ctrl[2];
3'b010:led <=ctrl[3];
3'b011:led <=ctrl[4];
3'b100:led <=ctrl[5];
3'b101:led <=ctrl[6];
3'b110:led <=ctrl[7];
3'b111:led <=ctrl[0];
default:led<=led;
endcase
end
endmodule
四、测试文件代码
`timescale 1ns / 1ns
module counter_led4_tb;
reg clk;
reg reset_n;
reg [7:0]ctrl;
reg [30:0]Time;
wire led;
counter_led4 counter_led(
.led(led),
.clk(clk),
.ctrl(ctrl),
.reset_n(reset_n)
);
initial clk=1;
always #10 clk=~clk;
initial begin
ctrl =0;
reset_n=0;
#201;
Time=15_000_000;
reset_n=~reset_n;
ctrl=8'b1010_1101;
#2000000000;
$stop;
end
endmodule
五、仿真波形
由波形,可以看到,led根据ctrl的预设值在变化,即随用户定义的模式变化,设计实现。