要求:每个流水灯依次闪烁0.5s
实现方法3种:
1.使用移位法实现
module led_run(
clk,
reset,
led
);
input clk;
input reset;
output reg [7:0]led;
reg [24:0]counter;
always@(posedge clk or posedge reset)
if (!reset)
counter <= 0;
//else if (counter==24999999)
else if (counter==24999)
counter<=0;
else
counter<=counter+1'd1;//实现了计数器功能
always@(posedge clk or posedge reset)
if (!reset)
led<=8'b0000_0001;
//else if (counter==24999999)begin
else if (counter==24999)begin
if(led==8'b1000_0000)
led<=8'b0000_0001;
else
led<=led<<1;
end
endmodule
2.对位移位法
module led_run(
clk,
reset,
led
);
input clk;
input reset;
output reg [7:0]led;
reg [24:0]counter;
always@(posedge clk or posedge reset)
if (!reset)
counter <= 0;
//else if (counter==24999999)
else if (counter==24999)
counter<=0;
else
counter<=counter+1'd1;
always@(posedge clk or posedge reset)
if (!reset)
led<=8'b0000_0001;
//else if (counter==24999999)begin
else if (counter==24999)
led<={led[6:0],led[7]}; //和上边不一样的地方,这里简化了代码
endmodule
3.调用3-8译码器模块法
module led_run(
clk,
reset,
led
);
input clk;
input reset;
output [7:0]led;
reg [24:0]counter;
reg [2:0]counter_2;
always@(posedge clk or posedge reset)//计时器
if (!reset)
counter <= 0;
else if (counter==24999999)//不是最大值所以要加counter==24999999来使counter<=0
counter<=0;
else
counter<=counter+1'd1;
always@(posedge clk or posedge reset)//对应38译码器的一个计数器
if(!reset)
counter_2<=0;
// else if(counter_2==7)
// counter_2=0;这不用和上边计时器一样加这个,因为7是【2:0】的最大值,会自动回到0
else if(counter_2==24999999)
counter_2<=counter_2+1'b1;
decoder_3_8(//调用3-8译码器模块
.a(counter[2]),
.b(counter[1]),
.c(counter[0]),
.out(led)
)
endmodule