一、设计目标
学习四的任务是:让led灯根据指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定。8个变化状态为一个循环,每个变化的时间值根据不同的应用场景选择。这里要补充的是:led分成8个状态,但是,其每个状态的时间值是相等的。五的任务则是点亮多个led。
二、设计思路
学习五是点亮多个led灯,思路有两种:
1、小梅哥的视频中提到了,直接在四的基础上添加ctrlB端口,类比点亮一个led,稍微容易些,我就不赘述。
2.我采用的是例化学习四的模块,这样更加方便快捷。
三、设计代码
1、代码1:学习四的代码
module counter_led4(clk,reset_n,ctrl,Time,led
);
input clk;
input reset_n;
input [7:0] ctrl;
input [30:0] Time;
output reg led;
reg [30:0]counter;
always@(posedge clk or negedge reset_n)
if(!reset_n)
counter <=0;
else if(counter == Time -1)
counter <=0;
else
counter <= counter + 1'b1;
reg [2:0]counter2;
always@(posedge clk or negedge reset_n)
if(!reset_n)
counter2 <=0;
else if(counter == Time -1)
counter2 <= counter2 + 1'b1;
always@(posedge clk or negedge reset_n)
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
endmodule
2、代码2:学习五的代码:
module counter_led5(
clk,
reset_n,
ctrlA,
ctrlB,
Time,
led
);
input clk;
input reset_n ;
input [30:0]Time;
output [1:0]led;
input [7:0]ctrlA;
input [7:0]ctrlB;
counter_led4 counter_led4_inst1(
.clk(clk),
.reset_n(reset_n),
.ctrl(ctrlA),
.Time(Time),
.led(led[0])
);
counter_led4 counter_led4_inst2(
.clk(clk),
.reset_n(reset_n),
.ctrl(ctrlB),
.Time(Time),
.led(led[1])
);
endmodule
四、测试文件代码
`timescale 1ns / 1ns
module counter_led5_tb;
reg clk;
reg reset_n;
reg [7:0]ctrlA;
reg [7:0]ctrlB;
reg [30:0]Time;
wire [1:0]led;
counter_led5 counter_led5(
.led(led),
.clk(clk),
.ctrlA(ctrlA),
.ctrlB(ctrlB),
.Time(Time),
.reset_n(reset_n)
);
initial clk=1;
always #10 clk=~clk;
initial begin
ctrlA =0;
ctrlB =0;
reset_n=0;
#20;
Time=150000;
reset_n=~reset_n;
#200;
ctrlA=8'b1010_1101;
ctrlB=8'b0101_0010;
#2000000000;
$stop;
end
endmodule
五、仿真波形
led输出的两位按照ctrlA和ctrlB变化,功能实现。