一、基础知识
1.时间之间的换算:
1s=1000ms
1ms=1000us
1us=1000ns
1ns=1000ps
1ps=1000fs
2.频率之间的换算
1Ghz=1000Mhz
1Mhz=1000Kz
1khz=1000hz
例:计算50Mhz的周期T方式如下
T=1/f=1/50Mhz=1/50*10^6= 0.00000002 s*10^9=20ns
三、简单计算周期方法
1\x(Mhz) * 1000 = y(ns)
二、计时器实现
1.Design Source
//time_top.v
module time_top(
input clk, //定义一个时钟信号输入
input reset, //定义个一复位按钮
output time_en //定义一个时间输出
);
reg [15:0]cnt_num=0; //建立一个16位的计数器
always @(posedge clk) begin //若在时钟的上升沿,则运行该循环
if (reset) begin
cnt_num<=16'd0;
end
else if (cnt_num==299) begin
cnt_num<=16'd0;
end
else begin
cnt_num=cnt_num+16'd1;
end
end
assign time_en = (cnt_num==16'd299)?16'd1:16'd0; //cnt_num是否等于预设值,若到则赋值1,否则赋值0
endmodule
2.simulation Sources
//TB_time_top
module TB_time_top(
);
reg clk1;
reg reset1;
wire time_en1;
initial begin //初始化各个信号
clk1=0;
reset1=1;
#1000;
reset1=0;
end
always #50 clk1=~clk1; //创建一个矩形波信号
time_top inst_time_top( //实例化设计文件,该处函数名必须和设计文件中的函数名相同
.clk(clk1),
.reset(reset1),
.time_en(time_en1)
);
endmodule
最终右键设置仿真器,选择Questa
若有错误,根据错误提示进行修改,一般有提示错误,基本上为代码问题,仔细检查
三、波形图
右键inst,将实例化的波形图添加到波形列表中,之后点击下图红圈内的Restart将波形图进行重置
重置完成后,此时波形图为空,之后在下图命令框中输入run 10ms 让其程序跑10ms,之后查看inst_time_en中两个相邻的上升沿的波形图,若与预期一致,则说明该程序无错误,否则,查看时钟设置第模块,查找错误。
结果:两个time_en上升沿时间间隔与预期相同,此时说明结果正确