//方法1:一是通过计数器、或运算实现
Module AAA(
Input clk,
Input rst_n,
Output clk_out
);
Reg clk_pos ;
Reg clk_neg ;
Reg [2:0] cnt_pos;
Reg [2:0] cnt_neg;
//进行pos计数器构造
always@(posedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
cnt_pos <= 3’b000 ;
end
else
if(cnt_pos ==4)
begin
cnt_pos <= 3’b000 ;
end
else
begin
cnt_pos <= cnt_pos +1’b1 ;
end
end
//进行neg计数器构造
always@(negedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
cnt_neg <= 3’b000 ;
end
else
if(cnt_neg ==4)
begin
cnt_neg <= 3’b000 ;
end
else
begin
cnt_neg <= cnt_neg +1’b1 ;
end
end
//下面进行分频技术pos
always@(posedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
clk_pos <= 0 ;
end
else
if(cnt_pos ==0 || cnt_pos ==2) //此处需要注意翻转的时刻
begin
clk_pos <= ~clk_pos ;
end
else
begin
clk_pos <= clk_pos ;
end
end
always@(negedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
clk_neg <= 0 ;
end
else
if(cnt_neg ==0 || cnt_neg ==2)
begin
clk_neg <= ~ clk_neg ;
end
else
begin
clk_neg <= clk_neg ;
end
end
assign clk_out <= clk_pos | clk_neg ; //或运算
endmodule
//方法2:通过计数器和xor运算实现
Module AAA(
Input clk,
Input rst_n,
Output clk_out
);
Reg clk_pos ;
Reg clk_neg ;
Reg [2:0] cnt_pos;
Reg [2:0] cnt_neg;
//进行pos计数器构造
always@(posedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
cnt_pos <= 3’b000 ;
end
else
if(cnt_pos ==4)
begin
cnt_pos <= 3’b000 ;
end
else
begin
cnt_pos <= cnt_pos +1’b1 ;
end
end
//进行neg计数器构造
always@(negedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
cnt_neg <= 3’b000 ;
end
else
if(cnt_neg ==4)
begin
cnt_neg <= 3’b000 ;
end
else
begin
cnt_neg <= cnt_neg +1’b1 ;
end
end
//下面进行分频技术pos
always@(posedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
clk_pos <= 0 ;
end
else
if(cnt_pos ==0) //此处需要注意翻转的时刻
begin
clk_pos <= ~clk_pos ;
end
else
begin
clk_pos <= clk_pos ;
end
end
always@(negedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
clk_neg <= 0 ;
end
else
if(cnt_neg ==2) //此处需要注意翻转的时刻
begin
clk_neg <= ~ clk_neg ;
end
else
begin
clk_neg <= clk_neg ;
end
end
assign clk_out <= clk_pos ^clk_neg ; //或运算
endmodule
//方法3:使用状态机实现分频
//原理上可以理解成:首先实现的是6+4效果,再利用posedge和negedge相差半个时钟即1个山峰,最后利用或运算将6+4变成了5+5效果。实现50%占空比的效果。
Module(
Input clk,
Input rst_n,
Output clk_out
);
Reg [3:0] state1 ;
Reg [3:0] state2 ;
//构造上升沿的5分频
always@(posedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
state1 <= 4’b0000 ;
end
else
begin
case(state1)
4’b0000: state1 <= 4’b0010;
4’b0010: state1 <= 4’b0110;
4’b0110: state1 <= 4’b0001;
4’b0001: state1 <= 4’b0011;
4’b0011: state1 <= 4’b0000;
Default: state1 <= 4’b0000;
endcase
end
end
//构造下降沿的5分频
always@(negedge clk or negedge rst_n)
begin
if(rst_n==0)
begin
state2 <= 4’b0 ;
end
else
begin
case(state2)
4’b0000: state2 <= 4’b0010;
4’b0010: state2 <= 4’b0110;
4’b0110: state2 <= 4’b0001;
4’b0001: state2 <= 4’b0011;
4’b0011: state2 <= 4’b0000;
Default: state2 <= 4’b0000;
endcase
end
end
assign clk_out = state1[0] | state2[0] ;//进行或运算得到50%分频效果
endmodule