目录
1. 位拼接实现
8个led灯以每个0.5ms的速率循环闪烁。
1.1 设计代码
module led_run1(
clk,
reset_n,
led
);
input clk;
input reset_n;
output reg[7:0]led;
reg [24:0]counter;
always@(posedge clk or negedge reset_n)
if(!reset_n)
counter <= 0;
else if(counter == 24999)
counter <= 0;
else
counter <= counter+1;
always@(posedge clk or negedge reset_n)
if(!reset_n)
led <= 8'b0000_0001;
else if(counter == 24999)
led <= {led[6:0],led[7]};
else
led <= led;
endmodule
1.2 testbench
`timescale 1ns / 1ns
module led_run_tb;
reg clk;
reg reset_n;
wire [7:0]led;
led_run led_run(
.clk(clk),
.reset_n(reset_n),
.led(led)
);
initial clk = 1;
always #10 clk = ~clk;
initial begin
reset_n = 0;
#201;
reset_n = 1;
#50000000;
$stop;
end
endmodule
1.3 仿真波形
2. 3-8译码器实现
2.1 设计代码
module led_run2(
clk,
reset_n,
led
);
input clk;
input reset_n;
output [7:0]led;
reg [24:0]counter;
always@(posedge clk or negedge reset_n)
if(!reset_n)
counter <= 0;
else if(counter == 24999)
counter <= 0;
else
counter <= counter+1'd1;
reg [2:0]cnt;
always@(posedge clk or negedge reset_n)
if(!reset_n)
cnt <= 0;
else if(counter == 24999)
cnt <= cnt+1'd1;
decoder_3_8 decoder_3_8(
.a(cnt[2]),
.b(cnt[1]),
.c(cnt[0]),
.out(led));
endmodule
其中3-8译码器的代码见FPGA 01 3-8译码器https://blog.csdn.net/SameenZhang/article/details/135256863
2.2 仿真波形
testbench同1.2,仿真波形见下图
3. 参数化实现
参数化意义:方便仿真、板级调试参数修改
3.1 设计代码
将闪烁时间设置为参数“MCNT”,代码如下
module led_run3(
clk,
reset_n,
led
);
input clk;
input reset_n;
output reg[7:0]led;
parameter MCNT = 25'd24999999;
reg [24:0]counter;
always@(posedge clk or negedge reset_n)
if(!reset_n)
counter <= 0;
else if(counter == MCNT)
counter <= 0;
else
counter <= counter+1;
always@(posedge clk or negedge reset_n)
if(!reset_n)
led <= 8'b0000_0001;
else if(counter == MCNT)
led <= {led[6:0],led[7]};
else
led <= led;
endmodule
3.2 testbench
为了提高仿真速度,将闪烁时间改为500ms,即在tb文件中重新定义参数MCNT的值
`timescale 1ns / 1ns
module led_run_self_tb;
reg clk;
reg reset_n;
wire [7:0]led;
led_run3 led_run3_inst0(
.clk(clk),
.reset_n(reset_n),
.led(led)
);
defparam led_run3_inst0.MCNT = 24999;
initial clk = 1;
always #10 clk = ~clk;
initial begin
reset_n = 0;
#201;
reset_n = 1;
#50000000;
$stop;
end
endmodule
3.3 仿真波形
4. 8位LED以不同的频率闪烁——参数化实现
Q:8位LED灯分别以0.1s,0.2s,0.3s,0.4s,0.4s,0.3s,0.2s,0.1s的速率闪烁。
4.1 设计代码
1.控制闪烁的文件(同led——flash)
module led_run4(
clk,
reset_n,
led
);
input clk;
input reset_n;
output reg[7:0]led;
parameter MCNT = 25'd24999999;
reg [24:0]counter;
always@(posedge clk or negedge reset_n)
if(!reset_n)
counter <= 0;
else if(counter == MCNT)
counter <= 0;
else
counter <= counter+1;
always@(posedge clk or negedge reset_n)
if(!reset_n)
led <= 0;
else if(counter == MCNT)
led <= !led;
endmodule
2.例化module led_run4,设置不同的MCNT数值
module led_run4_test(
clk,
reset_n,
led
);
input clk;
input reset_n;
output [7:0]led;
led_run4 led_run4_inst0(
.clk(clk),
.reset_n(reset_n),
.led(led[0])
);
defparam led_run4_inst0.MCNT = 2499999;
led_run4 led_run4_inst1(
.clk(clk),
.reset_n(reset_n),
.led(led[1])
);
defparam led_run4_inst1.MCNT = 4999999;
led_run4 led_run4_inst2(
.clk(clk),
.reset_n(reset_n),
.led(led[2])
);
defparam led_run4_inst2.MCNT = 7499999;
led_run4 led_run4_inst3(
.clk(clk),
.reset_n(reset_n),
.led(led[3])
);
defparam led_run4_inst3.MCNT = 9999999;
led_run4 led_run4_inst4(
.clk(clk),
.reset_n(reset_n),
.led(led[4])
);
defparam led_run4_inst4.MCNT = 9999999;
led_run4 led_run4_inst5(
.clk(clk),
.reset_n(reset_n),
.led(led[5])
);
defparam led_run4_inst5.MCNT = 7499999;
led_run4 led_run4_inst6(
.clk(clk),
.reset_n(reset_n),
.led(led[6])
);
defparam led_run4_inst6.MCNT = 4999999;
led_run4 led_run4_inst7(
.clk(clk),
.reset_n(reset_n),
.led(led[7])
);
defparam led_run4_inst7.MCNT = 2499999;
endmodule
4.2 testbench
对module led_run4_test文件进行仿真
`timescale 1ns / 1ps
module led_run4_test_tb;
reg clk;
reg reset_n;
wire [7:0]led;
led_run4_test led_run4_test(
.clk(clk),
.reset_n(reset_n),
.led(led)
);
initial clk = 1;
always #10 clk = ~clk;
initial begin
reset_n = 0;
#201;
reset_n = 1;
#500000000;
$stop;
end
endmodule