以下为基于quartus Ⅱ的分频器设计:

偶数分频器(以四分频为例)

verilog HDL代码:

module class6(clkout,inclk,reset,count);//模块名和端口列表
input inclk,reset;//输入时钟信号inclk和清零信号reset
output clkout;//输出合并倍率后的时钟信号
output reg[3:0] count;//计数器,位宽为4
parameter N=6;//设置一个N参数,初始数值设置为6,用于下面分频器倍率的计算
reg clkout;//输出的时钟信号设置为寄存器型
always@(posedge inclk or negedge reset)//敏感信号列表,当输入时钟信号的上升沿到来或者清零信号下降沿到来的时候触发
    if(!reset)//如果清零信号为低电平,执行下面操作
        begin
            clkout<=0;//输出时钟信号清零
            count<=0;//计数器清零
        end
    else
        begin
            if(count==(N/2)-2)//当计数器累计到6/2-2=1的时候(4分频)
                begin
                    clkout<=~clkout;//输出时钟信号电平反转
                    count<=0;//计数器清零
                end
            else
                count<=count+1'b1;//否则计数器执行累加操作
        end
endmodule

偶数分频器仿真

_OKEQRR_Y_GO`57VTX9ZC_S.png
如图所示为四分频的分频器设计仿真结果,当输入周期信号为四个周期的时候,输出周期信号为一个。

奇数分频器(以三倍率为例)

verilog HDL代码:

module class7(clkout,inclk,reset,clkout_p,clkout_n,count1,count2);//模块名和端口列表
output clkout;//输出合并倍率后的时钟信号
input inclk,reset;//输入时钟信号inclk和清零信号reset
output reg clkout_p;//由计数器count1控制的输出信号p,寄存器型
output reg clkout_n;//由计数器count2控制的输出信号n,寄存器型
parameter N=3;//设置一个N参数,初始数值设置为3,用于下面分频器倍率的计算
output reg [0:3]count1,count2;//计数器位宽为4,均为寄存器型
always@(posedge inclk or negedge reset)//敏感信号列表,当输入时钟信号的上升沿到来或者清零信号下降沿到来的时候触发
if(!reset)////如果清零信号为低电平,执行下面操作
    begin
        clkout_p<=0;//输出时钟信号p清零
        count1<=0;//计数器清零
    end
else
    begin
        if(count1<(N-1)/2)//当计数器count1小于(3-1)/2=1时
            clkout_p<=1;
        else
            clkout_p<=0;
        if(count1<(N-1))//当计数器count1小于3-1=2时
            count1<=count1+1'b1;//计数器累加
        else
            count1<=0;//否则计数器清零
    end
always@(negedge inclk or negedge reset)//敏感信号列表,下降沿触发,可以与输出p叉开
    if(!reset)//计数与输出方法同上,由count2控制输出信号n
        begin
            clkout_n<=0;
            count2<=0;
        end
    else
        begin
            if(count2<(N-1)/2)
                clkout_n<=1;
            else
                clkout_n<=0;
            if(count2<(N-1))
                count2<=count2+1'b1;
            else
                count2<=0;
        end
assign clkout=(clkout_p || clkout_n)?1'b1:1'b0;//逻辑功能描述,将输出的信号p和信号n合并,实现输出奇数分频器功能
endmodule

奇数分频器仿真

I059ZI`WUKF__@MJ8NK~WKL.png

如图所示为三倍率奇数分频器的仿真图,当输入周期信号为3个周期的时候,输出周期信号为1个。

总结

奇数分频器与偶数分频器的区别在于偶数分频器可以容易得将输入的时钟信号进行倍数分频,而奇数分频器需要分别通过两个不同的输出时钟信号,通过触发方式的不同叉开,然后合成成为一个周期信号。设计上,奇数分频器要分两部来,而偶数分频器只需要一个计数器进行判断即可。