奇分频
分频法
奇分频采用分频法要比偶分频复杂一些,首先采用上升沿采样得到中间变量clk_1,采用下降沿采样得到中间变量clk_2,然后二者进行或运算得到分频时钟clk_out,这里选择组合逻辑(assign语句),输出信号不会延迟一个周期,这样就得到下图所示的clk_out信号。
分频法代码如下:
module divider_5
(
input sys_clk ,
input rst_n ,
output clk_out
);
reg [2:0] cnt;
reg clk_1;
reg clk_2;
parameter N = 5;
always@(posedge sys_clk or negedge rst_n)begin
if(rst_n == 1'b0)
cnt <= 3'd0;
else if(cnt == 3'd4)
cnt <= 3'd0;
else
cnt <= cnt + 3'd1;
end
always@(posedge sys_clk or negedge rst_n)begin
if(rst_n == 1'b0)
clk_1 <=1'b0;
else if(cnt == N/2)
clk_1 <= ~clk_1;
else if(cnt == N-1)
clk_1 <= ~clk_1;
else
clk_1 <= clk_1;
end
always@(negedge sys_clk or negedge rst_n)begin
if(rst_n == 1'b0)
clk_2 <=1'b0;
else if(cnt == N/2)
clk_2 <= ~clk_2;
else if(cnt == N-1)
clk_2 <= ~clk_2;
else
clk_2 <= clk_2;
end
assign clk_out = (clk_1 | clk_2);
endmodule
仿真文件和偶分频一致,这里不再赘述,可参考笔者以前写的偶分频部分。
仿真结果如下:
###降频法
奇分频采用降频的原理和偶分频是一致的,皆是计数值达到N-2(这里N为5)时生成一个脉冲标志信号cnt_flag,然后持续一个周期。如图所示。
代码如下:
module divider_5
(
input sys_clk ,
input rst_n ,
// output clk_out
output reg cnt_flag
);
reg [2:0] cnt;
/* reg clk_1;
reg clk_2; */
parameter N = 3'd5;
always@(posedge sys_clk or negedge rst_n)begin
if(rst_n == 1'b0)
cnt <= 3'd0;
else if(cnt == N-3'd1)
cnt <= 3'd0;
else
cnt <= cnt + 3'd1;
end
always@(posedge sys_clk or negedge rst_n)begin
if(rst_n == 1'b0)
cnt_flag <=1'b0;
else if(cnt == N-3'd2)
cnt_flag <= 1'b1;
else
cnt_flag <= 1'b0;
end
endmodule
仿真文件和偶分频一致,仿真结果如图: