module counter
#(
parameter CNT_MAX = 25'd24_999_999
)
(
input wire sys_clk,
input wire sys_rst_n,
output reg led_out
);
reg [24:0] cnt;
reg cnt_flag;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt <= 25'd0;
else if(cnt == CNT_MAX)
cnt <= 25'd0;
else
cnt <= cnt + 25'd1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt_flag <= 1'b0;
else if(cnt == (CNT_MAX-25'd1))
cnt_flag <= 1'b1;
else
cnt_flag <= 1'b0;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
led_out <= 1'd0;
else if(cnt_flag == 1'b1)
led_out <= ~led_out;
else
led_out <= led_out;
endmodule
1:`timescale 1ns/1ns
写在所有仿真文件(.v)的代码首行,时间尺度、精度单位定义,时间尺度预编译指令,用来定义模块仿真时的时间单位和时间精度,不可被综合,但在可综合代码中也可以写,只是会在仿真时表达效果,而综合时会自动被综合器优化掉。格式如下:
`timescale 时间尺度/时间精度 或 `timescale timeunit / timeprecision
注意:仿真时间单位和时间精度的数字只能是1、10、100,不能为其它的数字。而且,时间精度不能比时间单位还要大。最多两者一样大。比如:下面定义都是对的:
`timescale 1ns/1ns
`timescale 100ns/100ns
下面的定义是错的
`timescale 1ps/1ns
时间的进位关系如下:
1秒(s) =1000毫秒(ms)
1毫秒(ms)=1000微秒 (us)
1微秒(us)=1000纳秒 (ns)
1纳秒(ns)=1000皮秒 (ps)
时间精度就是模块仿真时间和延时的精确程序,比如:定义时间精度为10ns,那么时序中所有的延时至多能精确到10ns,而8ns或者18ns是不可能做到的。
2:时间精度对仿真时间的影响
`timescale的时间精度设置是会影响仿真时间的,如下面几种设置。最后一种设置可能是第一种的一倍还多,并且占用更多的内存,所以如果没有必要,应尽量将时间精度设置得更大一些。
`timescale 1ns/1ns
`timescale 1ns/100ps
`timescale 1ns/10ps
`timescale 1ns/1ps
3:timescale对相对时间的影响
如果设定`timescale 1ns/1ps,#100是相对时间,等价于#100ns,而#100.1111会被认为是#100.111ns,因为它的精度高于timescaled的时间精度,而被四舍五入。
4:timescale的作用范围
假如咱们延时x个时间单位,那延时的总时间time = x*time_unit,但最后真正延时的时间是根据time_precision对time进行四舍五入后的结果,以下面的代码所示。
`timescale 100ns / 10ns // 时间单位100ns,时间精度10ns module tb; reg [4:0] set; parameter d1 = 20, d2 = 1.5, d3 = 1.54, d4 = 1.55; initial begin #d1 set = 0; // real_delay = round(20*100) = 2000ns, 以10ns为精度作四舍五入 #d2 set = 1; // real_delay = round(1.5*100) = 150ns #d3 set = 2; // real_delay = round(1.54*100) = 150ns #d4 set = 3; // real_delay = round(1.55*100) = 160ns end endmodule
参考:
https://wuzhikai.blog.csdn.net/article/details/124299401?spm=1001.2101.3001.6650.1