FPGA最基础的代码就是利用时钟构建任意时间的定时器啦!
非常简单的呢!!
定时器本质上就是一个计数器,因此首先要根据系统时钟的频率,以及自己需要的定时时间,先确定计数器的计数个数n
此外我们要非常熟悉时钟的单位:
频率单位为Hz---KHz----MHz---GHz ,从左向右以10^3增大
周期单位为 s------ms------us-----ns--- ps ,从左向右以10^3减小
假如时钟信号每输出n个周期,输出信号time_en由低电平向高电平翻转一次,则会得到n个系统时钟clk组成的计时器,可以代入以下公式计算得到n
总时间=单位时间*时间个数
若频率f=25Mhz 则周期T=1/25Mhz=40ns
若定时1ms,总时间1ms=10^6ns 10^6=单位时间40ns*n n=25000次
因此需要计数25000次
由于计数从0开始,所以我们计数的个数是n-1,也就是24999次
我们定义一个满足n个数要求的二进制计数器cnt即可
下面上代码!!
module timer(
input clk_25m,
input reset,
output reg time_en
);
reg [15:0]time_cnt;
always @(posedge clk_25m)begin
if(reset)begin
time_en<=0;
time_cnt<=0;
end
else if(time_cnt==24999)begin
time_en<=1;
time_cnt<=0;
end
else begin
time_en<=0;
time_cnt<=time_cnt+1;
end
end
endmodule
进行仿真!
module TB_timer(
);
reg clk_25m=0;
reg reset=0;
wire time_en;
timer inst_timer(
.clk_25m (clk_25m),
.reset (reset) ,
.time_en (time_en)
);
initial begin
clk_25m=0;
reset=1;
#100;
reset=0;
end
always #20 clk_25m=~clk_25m;
endmodule
看一下仿真结果!
可以看到两个time_en直接确实有1ms的定时,这样,我们就完成了一个任意时间的定时器(计数器)