FPGA提供的是50M的系统时钟clk,在具体设计的时候需要对时钟分频以满足各个模块的要求,此处因为我要使用传感器,传感器的读写时序是以微秒计算的,于是需要对clk进行50分频产生1MHz的分频时钟。此处使用计数器的方法进行分频,这种方法是一种加法器的变形电路,实现较为简单。
偶数分频的分频系数N,通过时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,以此循环下去,此处使用50分频,于是反转条件为50/2-1=24
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n) begin
cnt <= 5'b0;
clk_1us <= 1'b0;
end
else if(cnt < 5'd24)
begin
cnt <= cnt + 1'b1;
clk_1us <= clk_1us;
end
else begin
cnt <= 5'b0;
clk_1us <= ~clk_1us;
end
end
经过编写testbench程序在modelsim里进行仿真得到如下仿真图
如图在10ns之前由于复位信号未产生作用,信号处于不定态(红线),而1010ns时完成一个时钟周期,所以T=1000ns,即0.000001s,T=1s/1M,完成50分频得到1M信号的既定功能。