目录
Visio波形图绘制
分频方法:
降频方法:
代码编写
分频方法:
module divider_six
(
input wire sys_clk ,
input wire sys_rst_n ,
output reg clk_out
);
reg [2:0] cnt;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt <= 2'd0;
else if(cnt == 2'd2)
cnt <= 2'd0;
else
cnt <= cnt + 2'd1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
clk_out <= 1'b0;
else if(cnt == 2'd2)
clk_out <= ~clk_out;
else
clk_out <= clk_out;
endmodule
降频方法:
module divider_six
(
input wire sys_clk ,
input wire sys_rst_n ,
output reg clk_flag
);
reg [2:0] cnt;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt <= 3'd0;
else if(cnt == 3'd5)
cnt <= 3'd0;
else
cnt <= cnt + 3'd1;
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
两种方法的调用
分频方法:
always@(posedge clk_out or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
A <= 4’b0;
else
A <= A + 1’b1;
降频方法:
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
A <= 4’b0;
else if(clk_flag == 1’b1)
A <= A + 1’b1;
总结
若分频方法使用系统时钟,分频方法调用代码如下
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1’b0)
A <= 4’b0;
else if(clk_out == 1’b1)
A <= A + 1’b1;
波形图中可以看到:
分频方法的输出(clk_out)的高电平在6个时钟周期中持续3个系统时钟周期,所以在调用代码中A信号在6个时钟周期后半段中响应了3次,并没有实现分频功能。 但是clk_out在6个时钟周期内只有一个上升沿,可以利用这个上升沿进行分频,也就是直接使用输出信号作为后续模块时钟。
而降频方法的输出(clk_flag)的高电平在6个时钟周期内只保持了一个时钟周期,因此直接使用系统时钟。