三分频电路设计

文章目录

偶数分频

通常情况下,偶数倍分频器,可以借助计数器实现。

二分频

最简单的,二分频时,直接把输入时钟加到D触发器上,输出端Q取反后,接回输入D端,就可以了。参考代码如下。

verilog 复制代码
module clk_div(
    input       i_clk       ,
    output      o_clk_div   
);
reg ro_clk_div = 0 ;
assign o_clk_div = ro_clk_div;
always @(posedge i_clk) begin
    ro_clk_div <= ~ro_clk_div;
end
endmodule

更大的2N偶数

其余2N倍数分频时,就需要借助计数器。举例,4分频时,1个输出时钟周期内,有4个输入时钟,按照50%的占空比算,输出时钟需要在4/2=2个时钟周期处翻转。

可以产生一个 0 1 0 1 的循环计数器,计数器到1,翻转输出即可,参考代码。

verilog 复制代码
module clk_div(
    input       i_clk       ,
    output      o_clk_div   
);
reg ro_clk_div = 0 ;
reg [1:0] r_cnt = 0;
assign o_clk_div = ro_clk_div;
always @(posedge i_clk) begin
    if(r_cnt == 2-1)
        r_cnt <= 0;
    else
        r_cnt <= r_cnt + 1;
end
always @(posedge i_clk) begin
    if(r_cnt == 2-1)
        ro_clk_div <= ~ro_clk_div;
end
endmodule

更具一般性的,4分频计数两个数,2N分频计数2N>>1个数,又由于计数器从0开始,则有:(2N>>1)-1 通式

verilog 复制代码
module clk_div #(
    parameter P_DIV_NUM = 6
)
(
    input       i_clk       ,
    output      o_clk_div   
);
reg ro_clk_div = 0 ;
reg [1:0] r_cnt = 0;
assign o_clk_div = ro_clk_div;
always @(posedge i_clk) begin
    if(r_cnt == (P_DIV_NUM>>1)-1)
        r_cnt <= 0;
    else
        r_cnt <= r_cnt + 1;
end
always @(posedge i_clk) begin
    if(r_cnt == (P_DIV_NUM>>1)-1)
        ro_clk_div <= ~ro_clk_div;
end
endmodule

至此,偶数倍分频都实现了。

奇数分频

三分频

三分频是面试、笔试高频问题。

如果只考虑信号在上升沿发生变化,3分频会有几种情况呢?

高电平:低电平

1 :2

2:1

两种而已,图示如下。

这种占空比非50%的是比较好实现的,只需要一个0~2的循环计数器即可

verilog 复制代码
//1:2
module clk_div(
    input       i_clk       ,
    output      o_clk_div   
);
reg ro_clk_div = 0 ;
reg [1:0] r_cnt = 0 ;
assign o_clk_div = ro_clk_div;
always @(posedge i_clk) begin
    if(r_cnt == 2)
        r_cnt <= 0;
    else
        r_cnt <= r_cnt + 1;
end
always @(posedge i_clk) begin
    if(r_cnt == 0 || r_cnt==1)
        ro_clk_div <= ~ro_clk_div;
end
endmodule

//2:1
module clk_div(
    input       i_clk       ,
    output      o_clk_div   
);
reg ro_clk_div = 0 ;
reg [1:0] r_cnt = 0 ;
assign o_clk_div = ro_clk_div;
always @(posedge i_clk) begin
    if(r_cnt == 2)
        r_cnt <= 0;
    else
        r_cnt <= r_cnt + 1;
end
always @(posedge i_clk) begin
    if(r_cnt == 0 || r_cnt==2)
        ro_clk_div <= ~ro_clk_div;
end
endmodule

如果是占空比50%的三分频呢?图示如下。一定会用到下降沿。

借鉴上面非50%占空比的思路,还是用计数器实现。

考虑两个时钟 或 运算,得到输出三分频时钟。

参考代码:

verilog 复制代码
module clk_div(
    input       i_clk       ,
    output      o_clk_div   
);
reg ro_clk_div = 0 ;
reg [1:0] r_cnt = 0 ;

reg clk1 = 0 , clk2 = 0 ;

assign o_clk_div = clk1 | clk2;

always @(posedge i_clk) begin
    if(r_cnt == 2)
        r_cnt <= 0;
    else
        r_cnt <= r_cnt + 1;
end

always @(posedge i_clk) begin
    if(r_cnt == 0 || r_cnt == 1)
        clk1 <= !clk1;
end

always @(negedge i_clk) begin
    if(r_cnt == 1 || r_cnt == 2)
        clk2 <= !clk2;
end
endmodule

这里clk2的变化是根据下降沿来的,数据稳定,建立时间、保持时间都能满足,所以在时钟沿立即就能变化,不会出现打一拍的现象。

而clk1的变化会有打一拍的现象。

另一种低翻转率的三分频。

verilog 复制代码
module clk_div(
    input       i_clk       ,
    output      o_clk_div   
);
reg ro_clk_div = 0 ;
reg [1:0] r_cnt = 0 ;

reg clk1 = 0 , clk2 = 0 ;

assign o_clk_div = clk1 ^ !clk2;

always @(posedge i_clk) begin
    if(r_cnt == 2)
        r_cnt <= 0;
    else
        r_cnt <= r_cnt + 1;
end

always @(posedge i_clk) begin
    if(r_cnt == 2)
        clk1 <= !clk1;
end

always @(negedge i_clk) begin
    if(r_cnt == 1)
        clk2 <= !clk2;
end
endmodule
相关推荐
明德扬2 小时前
FPGA MIPI 多路视频聚合方案
fpga开发·mipi视频拼接·mipi多路拼接·mipi协议·mipi视频拼接方案·fpga mipi方案·mipi csi
XMAIPC_Robot2 小时前
为什么大型储能需要边缘 AI 协调控制器?RK3588+FPGA 高速采集方案
人工智能·嵌入式硬件·fpga开发·arm+fpga·rk3588+fpga·协调控制器
szxinmai主板定制专家3 小时前
RK3576+CODESYS+RK182X+FPGA异构架构:半导体精密设备一体化控制器方案
人工智能·fpga开发·架构·rk3576+codesys
szxinmai主板定制专家3 小时前
半导体设备控制器:RK3576+CODESYS+RK182X异构架构,实现晶圆视觉检测与运动联动闭环
人工智能·fpga开发·架构·视觉检测·边缘计算·codesys·rk3576
szxinmai主板定制专家4 小时前
FPGA高速IO+RK182X AI算力|RK3576+CODESYS工业自动化运动控制平台设计
运维·人工智能·嵌入式硬件·fpga开发·自动化·zynq
FPGA小徐4 小时前
原理图分析:Type-C 转串口(CH340C)最小系统板 CSDN 博客
fpga开发
智感子5 小时前
FPGA采集:高采样率数据流与存储
fpga开发
狂奔蜗牛(bradley)20 小时前
拒绝SOEM黑盒!死磕EtherCAT主站:ARM+FPGA架构、DC同步与状态机修复等,50+篇实战开发文档全公开
arm开发·fpga开发·架构
XMAIPC_Robot1 天前
CODESYS 实时控制 + RK182X 大模型算力扩展|RK3576 工业边缘控制器设计
人工智能·fpga开发·机器人·rk3588+fpga
女神下凡1 天前
芯参谋(31):SPI NOR Flash 电路设计指南
arm开发·单片机·嵌入式硬件·fpga开发·设计规范