以前小伙伴一起讨论过关于
关于 FPGA 时钟分频? 这些奇葩的分频,可能也只在IC内部用的到吧,由于好奇,我也来尝试一下。
一、 具有50% 占空比的奇数的整数分频
对时钟进行N分频,创建由时钟沿触发的计数器,计数到N-1
对于3分频,从0计数到2 即是 N=3
对于3分频,从0计数到3 即是 N=4
……
图:3分频
代码如下:
- module half_clk_dai(
- clk_in,
- rst,
- clk_out,
- cnt
- );
- input clk_in;
- input rst;
- output clk_out;
- output [0:1] cnt;
- reg clk_out;
- reg [0:1] count= 2'b00;
- assign cnt = count;
- always@(posedge clk_in or negedge rst or negedge clk_in)
- begin
- if(!rst)
- clk_out<=0;
- else
- begin
- if(count==2)
- begin
- count=0;
- clk_out<=~clk_out;
- end
- else
- count=count+1;
-
- end
-
- end
- endmodule
二、非50%占空比的非整数分频
实现一个 4.5 倍分频,占空比为40%,不含毛刺。
图:4.5倍分频 40% 占空比
代码如下:
- module half_clk_dai(
- clk_in,
- rst,
- clk_out,
- cnt
- );
- input clk_in;
- input rst;
- output clk_out;
- output [0:1] cnt;
- reg clk_out;
- reg [0:2] count= 3'b00;
- reg [0:1] flag=2'b00;
- reg [0:3]temp =4'b0011;
- assign cnt = count;
- always@(posedge clk_in or negedge rst or negedge clk_in)
- begin
- if(!rst)
- clk_out<=0;
- else
- begin
- if(count == temp )
- begin
- count=0;
- clk_out<=~clk_out;
- if(flag==2)
- begin
- if(temp==3)temp=4;
- else temp=3;
- flag = 0;
- end
- flag=flag+1;
- end
- else
- count=count+1;
- end
- end
- endmodule
三、小结
分频主要是对时钟的操作,以及计数器的实现。
参考: 群聊天
网络
《硬件架构的艺术》