奇数分频实现(3分频为例子)

1、通过时钟相或实现奇数分频

原时钟clk通过上升沿和下降沿计数产生时钟clk1和clk2,clk1和clk2相或产生clk三分频的clk_div3时钟。

clk1:原时钟clk的上升沿产生。

clk2:原时钟clk的下降沿产生。

clk1和clk2的特征:

3分频——高电 : 低电平 = 1 : 2

2N+1分频——高电 : 低电平 = N : N+1

 代码:

`timescale 1ns/1ns

module test(
	input   clk_150     ,
    input   rst_n       ,
    
    output  clk_div3    
);

reg     [3:0]   cnt_1;  //上升沿计数
reg     [3:0]   cnt_2;  //下降沿计数

reg             clk1;
reg             clk2;

assign  clk_div3 = clk1 | clk2;

always@(posedge clk_150 or negedge rst_n)
begin 
    if (!rst_n)
        cnt_1 <= 4'd0;
    else 
        cnt_1 <= (cnt_1 == 4'd2) ? 4'd0 : cnt_1 + 4'd1;
end 

always@(posedge clk_150 or negedge rst_n)
begin 
    if (!rst_n)
        clk1 <= 1'b0;
    else 
        clk1 <= (cnt_1 == 4'd1) ? 1'b1 : 1'b0;
end 

always@(negedge clk_150 or negedge rst_n)
begin 
    if (!rst_n)
        cnt_2 <= 4'd0;
    else 
        cnt_2 <= (cnt_2 == 4'd2) ? 4'd0 : cnt_2 + 4'd1;
end 

always@(negedge clk_150 or negedge rst_n)
begin 
    if (!rst_n)
        clk2 <= 1'b0;
    else 
        clk2 <= (cnt_2 == 4'd1) ? 1'b1 : 1'b0;
end 

endmodule

仿真图:

 2、通过时钟相与实现奇数分频

原时钟clk通过上升沿和下降沿计数产生时钟clk1和clk2,clk1和clk2相与产生clk三分频的clk_div3时钟。

clk1:原时钟clk的上升沿产生。

clk2:原时钟clk的下降沿产生。

clk1和clk2的特征:

3分频——高电 : 低电平 = 2 : 1

2N+1分频——高电 : 低电平 = N+1 : N

 代码:

`timescale 1ns/1ns

module test(
	input   clk_150     ,
    input   rst_n       ,
    
    output  clk_div3    
);

reg     [3:0]   cnt_1;  //上升沿计数
reg     [3:0]   cnt_2;  //下降沿计数

reg             clk1;
reg             clk2;

assign  clk_div3 = clk1 & clk2;

always@(posedge clk_150 or negedge rst_n)
begin 
    if (!rst_n)
        cnt_1 <= 4'd0;
    else 
        cnt_1 <= (cnt_1 == 4'd2) ? 4'd0 : cnt_1 + 4'd1;
end 

always@(posedge clk_150 or negedge rst_n)
begin 
    if (!rst_n)
        clk1 <= 1'b0;
    else 
        clk1 <= (cnt_1 <= 4'd1) ? 1'b1 : 1'b0;
end 

always@(negedge clk_150 or negedge rst_n)
begin 
    if (!rst_n)
        cnt_2 <= 4'd0;
    else 
        cnt_2 <= (cnt_2 == 4'd2) ? 4'd0 : cnt_2 + 4'd1;
end 

always@(negedge clk_150 or negedge rst_n)
begin 
    if (!rst_n)
        clk2 <= 1'b0;
    else 
        clk2 <= (cnt_2 <= 4'd1) ? 1'b1 : 1'b0;
end 

endmodule

仿真图:

  3、通过时钟相异或实现奇数分频

原时钟clk通过上升沿和下降沿计数产生时钟clk1和clk2,clk1和clk2相异或产生clk三分频的clk_div3时钟。

clk1:原时钟clk的上升沿产生。

clk2:原时钟clk的下降沿产生。

clk1和clk2的特征:

3分频:clk1以原时钟clk的3个周期为单位翻转,clk2在clk1时钟的中间点发生翻转。

2N+1分频:clk1以原时钟clk的2N+1个周期为单位翻转,clk2在clk1时钟的中间点发生翻转。

代码:
 

module test(
	input   clk_150     ,
    input   rst_n       ,
    
    output  clk_div3    
);

reg     [3:0]   cnt_1;  //上升沿计数

reg             clk1;
reg             clk2;

assign  clk_div3 = clk1 ^ clk2;

always@(posedge clk_150 or negedge rst_n)
begin 
    if (!rst_n)
        cnt_1 <= 4'd0;
    else 
        cnt_1 <= (cnt_1 == 4'd2) ? 4'd0 : cnt_1 + 4'd1;
end 

always@(posedge clk_150 or negedge rst_n)
begin 
    if (!rst_n)
        clk1 <= 1'b0;
    else 
        clk1 <= (cnt_1 == 4'd2) ? ~clk1 : clk1;
end 

always@(negedge clk_150 or negedge rst_n)
begin 
    if (!rst_n)
        clk2 <= 1'b0;
    else 
        clk2 <= (cnt_1 == 4'd1) ? ~clk2 : clk2;
end 

endmodule

仿真图:

 

 

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值