刚开始学习写led亮灭仿真的时候很多人都会遇到仿真时间太长,耗费时间的问题,尤其是电脑性能不怎么好的,那是真的等到天荒地老,半天看不到LED的波形翻转,还以为自己的程序写的有问题呢
其实我们可以利用parameter来定义参数,然后在仿真里面再用defparam来修改这个定义的参数就可以大大的缩短仿真的时间。下面我们来用个实际的例子来示范一下
工程代码:
- module led(
- clk,
- rst_n,
- led
- );
- input clk;
- input rst_n;
- output reg led;
- reg [25:0] cnt;
- always @ (posedge clk or negedge rst_n)
- begin
- if (!rst_n)
- cnt <= 26'd0;
- else if (cnt < 26'd49_999_999)
- cnt <= cnt + 1'b1;
- else
- cnt <= 26'd0;
- end
-
- always @ (posedge clk or negedge rst_n)
- begin
- if (!rst_n)
- led <= 1'b1;
- else if (cnt < 26'd49_999_999)
- led <= led;
- else
- led <= ~led;
- end
- endmodule
复制代码
仿真文件代码:
- `timescale 1ns/1ps
- module led_tb;
- reg clk;
- reg rst_n;
- wire led;
- led led_inst(
- .clk(clk),
- .rst_n(rst_n),
- .led(led)
- );
-
- always #10 clk = ~clk;
-
- initial begin
- clk = 1;
- rst_n = 0;
- #201;
- rst_n = 1;
-
- repeat (10000) begin
- #60000;
- end
-
- $stop;
- end
- endmodule
复制代码
我们接下来跑仿真,结果跑了老半天都看不到led的波形翻转,因为仿真要足足跑1秒钟的时间led的波形才会翻转,而这里的仿真时间单位是纳秒(ns),可以算算要跑多长时间
现在我们把代码稍微修改一下:
工程代码:
- module led(
- clk,
- rst_n,
- led
- );
- input clk;
- input rst_n;
- output reg led;
-
- parameter CNT_MAX = 26'd49_999_999; // 差异部分
- reg [25:0] cnt;
- always @ (posedge clk or negedge rst_n)
- begin
- if (!rst_n)
- cnt <= 26'd0;
- else if (cnt < CNT_MAX) // 差异部分
- cnt <= cnt + 1'b1;
- else
- cnt <= 26'd0;
- end
-
- always @ (posedge clk or negedge rst_n)
- begin
- if (!rst_n)
- led <= 1'b1;
- else if (cnt < CNT_MAX) // 差异部分
- led <= led;
- else
- led <= ~led;
- end
- endmodule
复制代码
仿真文件代码:
- `timescale 1ns/1ps
- module led_tb;
- reg clk;
- reg rst_n;
- wire led;
- led led_inst(
- .clk(clk),
- .rst_n(rst_n),
- .led(led)
- );
-
- defparam led_inst.CNT_MAX = 10; // 差异部分
-
- always #10 clk = ~clk;
-
- initial begin
- clk = 1;
- rst_n = 0;
- #201;
- rst_n = 1;
-
- #2000;
-
- $stop;
- end
- endmodule
复制代码
我们接下来跑仿真,结果很快就看到led的波形翻转了
注:这种方法不会修改实际代码的延时时间,因为只是在仿真代码里面将CNT_MAX改成10的,所以这个改动也只会在仿真里面生效
|