采用降频的方法实现六分频器
在 FPGA 中凡是时钟信号都要连接到全局时钟网络上,全局时钟网络也称为全局时钟树, 是 FPGA 厂商专为时钟路径而特殊设计的,它能够使时钟信号到达每个寄存器的时间都尽 可能相同,以保证更低的时钟偏斜(Skew)和抖动(Jitter)。而我们用这种分频的方式产 生的 clk_out 信号并没有连接到全局时钟网络上,但 sys_clk 则是由外部晶振直接通过管脚 连接到了 FPGA 的专用时钟管脚上,自然就会连接到全局时钟网络上,所以在 sys_clk 时钟 工作下的信号要比在 clk_out 时钟工作下的信号更容易在高速系统中保持稳定。绘制波形图:
根据绘制的波形图编写硬件代码:
module divider_six
(
input wire sys_clk,
input wire sys_rst_n,
//output reg clk_out
output reg clk_flag
);
reg [2:0] cnt;
//计数器实现从0到五的循环计数
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt <= 3'b0;
else if(cnt == 3'd5)
cnt <= 3'b0;
else
cnt <= cnt + 1'b1;
//没冲信号指示六分频
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
clk_flag <= 1'b0;
else if(cnt == 3'd4)
clk_flag <= 1'b1;
else
clk_flag <= 1'b0;
endmodule
代码所描述的硬件电路为:
编写仿真代码进行验证波形图:
`timescale 1ns/1ns
module tb_divider();
reg sys_clk;
reg sys_rst_n;
wire clk_flag;
initial begin
sys_clk <= 1'b1;
sys_rst_n <= 1'b0;
#20
sys_rst_n <= 1'b1;
end
always #10 sys_clk = ~sys_clk;
divider_six divider_six_inst
(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.clk_flag(clk_flag)
);
endmodule
调用modsim进行仿真验证: