在整个电路中,一般晶振提供固定的时钟信号频率,但是在需要其他频率的时钟的时候,一种是器件厂商提供的锁相环(PLL),另一种是自己动手来用Verilog代码描述。
在自己进行Verilog描述的时候,通过计数器统计时钟脉冲,然后做出相应的操作,以达到奇数分频(3, 5, 7…),偶数分频(2, 4, 6…),占空比(高电平时间占整个周期T的时间比例设置…
偶分频 占空比50%
module diviter_6(
input clk,
input rstn,
output clk_div
);
reg [7:0] cnt
always @(posedge clk, negedge rstn)begin
if(!rstn)
cnt <= 0;
else if(cnt==8'd3)
cnt <= 0;
else
cnt<=cnt + 1
end
always @(posedge clk,negedge rstn)
if(!rstn)
clk_div <= 1'b0;
else if(cnt==8'd3)
clk_div<=~clk_div;
endmodule
偶分频 脉冲信号分频
module diviter_6(
input clk,
input rstn,
output clk_flag
);
reg [7:0] cnt
always @(posedge clk, negedge rstn)begin
if(!rstn)
cnt<=0;
else if(cnt==8'd5)
cnt<=0;
else
cnt<=cnt + 1
end
always @(posedge clk,negedge rstn)
if(!rstn)
clk_flag <= 1'b0;
else if(cnt==8'd5)
clk_flag<=1'b1;
else
clk_flag<=1'b0;
endmodule
奇分频 占空比50%
module diviter_5
(
input clk,
input rstn,
output clk_div
);
reg [7:0] cnt;
reg clk_pos,clk_neg;
assign clk_div = clk_pos | clk_neg;
always @(posedge clk or negedge rstn)begin
if(!rstn)
cnt <= 8'b0;
else if(cnt==8'd4)
cnt <= 8'b0;
else
cnt <= cnt + 1'b1;
end
always @(posedge clk or negedge rstn)begin
if(!rstn)
clk_pos <= 1'b0;
else if(cnt==8'd2)
clk_pos <= 1'b1;
else if(cnt==8'd4)
clk_pos <= 1'b0;
end
always @(negedge clk or negedge rstn)begin
if(!rstn)
clk_neg <= 1'b0;
else if(cnt==8'd2)
clk_neg <= 1'b1;
else if(cnt==8'd4)
clk_neg <= 1'b0;
end
endmodule
奇分频 脉冲信号分频
module diviter_5
(
input clk,
input rstn,
output clk_flag
);
reg [7:0] cnt;
reg clk_flag
always @(posedge clk or negedge rstn)begin
if(!rstn)
cnt <= 8'b0;
else if(cnt==8'd4)
cnt <= 8'b0;
else
cnt <= cnt + 1'b1;
end
/*通过设置cnt,可以灵活调整占空比*/
always @(posedge clk or negedge rstn)begin
if(!rstn)
clk_flag<= 1'b0;
else if(cnt==8'd3)
clk_flag <= 1'b1;
else
clk_flag<= 1'b0;
end
endmodule