FPGA-VIVADO学习六:使用参数化设计实现模块的重用(同时点亮4个不同频率的LED)
verilog代码以及仿真实现
·
在本节学习中,如果要实现下面设计,你会怎么做呢

(计数器最大值怎么计算在前面的教学有。)
你会去写四个模块实现四种不同的LED上闪烁吗? 可行但是有些麻烦
下面就用最小代码量来解决吧
注意例化越多,消耗的FPGA的资源越多
Verilog代码
首先导入之前的LED灯闪烁代码
module led_twinkle(
Clk,
Reset_n,
Led
);
input Clk;
input Reset_n;
output reg Led;
reg [24:0]counter;
parameter MCNT=25000000-1;
always@(posedge Clk or negedge Reset_n)
if(!Reset_n)
counter<=0;
else if (counter==MCNT)//25000000-1
counter<=0;
else
counter<=counter+1'd1;
always@(posedge Clk or negedge Reset_n)
if(!Reset_n)
Led<=1'b0;
else if(counter==MCNT)
Led<=!Led;
endmodule
重点来了,就是我们例化4个模块
module led_twinkle_4(
Clk,
Reset_n,
Led
);
input Clk;
input Reset_n;
output [3:0]Led;
led_twinkle led_twinkle_inst0(
.Clk(Clk),
.Reset_n(Reset_n),
.Led(Led[0])
);
//led_twinkle_inst1使用#(.)方法,在上节学习有说
led_twinkle
#(
.MCNT(12499999)
)
led_twinkle_inst1(
.Clk(Clk),
.Reset_n(Reset_n),
.Led(Led[1])
);
//led_twinkle_inst2和3使用defparam方法,在上节学习有说
led_twinkle led_twinkle_inst2(
.Clk(Clk),
.Reset_n(Reset_n),
.Led(Led[2])
);
defparam led_twinkle_inst2.MCNT=6249999;
led_twinkle led_twinkle_inst3(
.Clk(Clk),
.Reset_n(Reset_n),
.Led(Led[3])
);
defparam led_twinkle_inst3.MCNT=2500000-1;
endmodule
仿真代码
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2025/03/19 15:09:16
// Design Name:
// Module Name: led_twinkle_4_tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module led_twinkle_4_tb();
reg Clk;
reg Reset_n;
wire [3:0]Led;
led_twinkle_4 led_twinkle_4_inst0(
.Clk(Clk),
.Reset_n(Reset_n),
.Led(Led)
);
initial Clk=1;
always #10 Clk=~Clk;
initial begin
Reset_n=0;
#201;
Reset_n=1;
#2000_000_000;
$stop;
end
endmodule
仿真结果

板子验证
又到了阅读板子手册的时间了
首先是Clk

幸好我的板子够4个LED灯哈哈哈

再来个按键做Reset,一般我用KEY1

IO配置如下图所示

然后烧到比特流


哇塞不错不错一遍过
使用参数化设计实现模块的重用(同时点亮4个不同频率的LED)
写在最后——额外的快速仿真
说到这里,前面我们仿真是用了不少时间的,有没有可以缩短仿真时间的简单方式呢
有的兄弟有的
module led_twinkle_4(
Clk,
Reset_n,
Led
);
input Clk;
input Reset_n;
output [3:0]Led;
parameter MCNT0=25000000-1;
parameter MCNT1=12500000-1;
parameter MCNT2=62500000-1;
parameter MCNT3=2500000-1;
led_twinkle led_twinkle_inst0(
.Clk(Clk),
.Reset_n(Reset_n),
.Led(Led[0])
);
defparam led_twinkle_inst0.MCNT=MCNT0;
//led_twinkle_inst1使用#(.)方法,在上节学习有说
led_twinkle
#(
.MCNT(MCNT1)
)
led_twinkle_inst1(
.Clk(Clk),
.Reset_n(Reset_n),
.Led(Led[1])
);
//led_twinkle_inst2和3使用defparam方法,在上节学习有说
led_twinkle led_twinkle_inst2(
.Clk(Clk),
.Reset_n(Reset_n),
.Led(Led[2])
);
defparam led_twinkle_inst2.MCNT=MCNT2;
led_twinkle led_twinkle_inst3(
.Clk(Clk),
.Reset_n(Reset_n),
.Led(Led[3])
);
defparam led_twinkle_inst3.MCNT=MCNT3;
endmodule
关于defparam 的用法前面的学习有详细讲解
接下来只要在tb文件中加入4句,拿其中一个LED灯举例,把25000000-1改为25000-1
defparam led_twinkle_4_inst0.MCNT0=25000-1;
把4个LED灯的数量级都改一下跑仿真就快了
收工
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)