fpga学习笔记1分频电路设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FPGA学习笔记1——分频电路设计
分频就是用一个时钟信号通过一定的电路结构变成不
同频率的时钟信号,这里介绍一下整数分频电路的设计方法。整数分频电路有偶数分频和奇数分频两种,我们以实现占空比为50%的分频电路为例子来解释一下分频电路设计的基
本原理。假设时钟周期为T,则二分频后输出的时钟周期为
2T,三分频后输出的时钟周期为3T,N分频后输出的时钟
周期为NT,这是设计分析的基本思路。1.偶数分频实现二分频电路设计二分频电路的实现是最为简单的,只需要用
一个D触发器便能实现,因为D触发的输出值每隔一个输入时钟周期T才更新一次值,所以我们只要每次D触发器寄存值的时候把它的输出值取反就可以了,这样它的高电平持续时间为T,低电平持续时间也为T,则为二分频。具体的代
码如下所示。module clkdiv(clk,rst_n,clk_2); input
clk,rst_n; output clk_2; reg q; always @(posedge clk or negedge rst_n) if(!rst_n) q<=1'b0; else
q<=~q; assign clk_2=q; endmodule 这个设计非常简单,不作过多解释。六分频电路设计按照设计的思路,六分频总的时钟周期应该为6T,高电平持续时间为3T,低电平持续时间为3T,我们只需要用一个0-5的计数器,计数从0到5一直循环,当计数器为0,1,2时,输出高电平,计
数器为3,4,5时,输出低电平。具体代码实现如下module clkdiv6(clk,rst_n,clk_2); input clk,rst_n; output clk_2; reg [2:0] q; //因为用到0-5的计数器,一共要3位D触发器reg clk_2; always @(posedge clk or negedge rst_n) if (!rst_n) q<=3'd0; else if(q==3'd5) q<=3'd0; else q<=q+1'b1; always @(posedge clk or negedge
rst_n) if(!rst_n) clk_2<=1'b0; else if(q<3'd3)
clk_2<=1'b1; else clk_2<=1'b0; endmodule 经过仿真,符合六分频的设计思路,占空比也为50%,3T的时间为高电平,3T的时间为低电平。2N分频电路设计思路偶数分频电路的基本实现思路就是利用计数器,利用
0-(2N-1)的计数器,当计数器计数在0-(N-1)的时候输出高电平,其余时间输出低电平就可以完成占空比50%的2N分频电路了2.奇数分频实现三分频电路实现三分频的电路如果按照偶数分频的思想来设计就会遇到一个难题,因为是奇数,不能做到计数器计数到一半的时候输出取反,也就是说按照偶数分频的思路做不到占空比50%,在这里要换一个思路来设计。我们仍然分析一下三分频电路的特点,三分频电路的周期为3T,高电平持续时间为1.5T,低电平持续时间也为1.5T。假设用上面的思路,用1个计数器来分频,则也可以得到三分频,但是占空比为66.7%,即高电平持续时间为2T,低电平持续时间为1T。以下为占空比50%的三分频电路
实现,用2个三进制计数器,第1个为时钟上升沿触发,第2个为时钟下降沿触发。对第1个计数器而言,小于2取高电平则,0-2T为高电平,2T-3T为低电平,对第2个计数器而言,小于2取高电平,则0.5T-2.5T为高电平,2.5T-3.5T 为低电平,实质上第2个的波形延时了0.5T,他们公共的取高电平的时间为0.5T-2T,刚好是1.5T,正式三分频占空比为50%高电平所持续的时间。下面为具体代码实现。module clkdiv3(clk,rst_n,clk_2); input clk,rst_n; output clk_2; reg [1:0]count1;//上升沿触发的3进制计数器1 reg [1:0]count2;//下降沿触发的3进制计数器2 reg
clk_p,clk_n; always @(posedge clk or negedge rst_n)//上升沿触发的3进制计数器1 if(!rst_n) count1<=2'd0; else if(count1==2'd2) count1<=1'b0; else
count1<=count1+1'b1; always @(posedge clk or negedge rst_n) if(!rst_n) clk_p<=1'b0; else
if(count1<2'd2) clk_p<=1'b1; else clk_p<=1'b0; always @(negedge clk or negedge rst_n)//下降沿触发的3进制计数器2 if(!rst_n) count2<=2'd0; else
if(count2==2'd2) count2<=2'd0; else
count2<=count2+1'b1; always @(negedge clk or negedge rst_n) if(!rst_n) clk_n<=1'b0; else if (count2<2'd2) clk_n<=1'b1; else clk_n<=1'b0;
assign clk_2=clk_p&clk_n; endmodule 仿真的波形图如下可见,实现了三分频占空比为50%的功能,但是仍然有不足的地方就是相位不是和原始时钟同相,延迟了0.5T。五分频电路设计按照三分频的分频思路,五分频的代码如下module clkdiv5(clk,rst_n,clk_2); input clk,rst_n; output clk_2; reg [2:0]count1;//上升沿触发的5进制计数器1 reg [2:0]count2;//下降沿触发的5进制计数器2 reg clk_p,clk_n; always @(posedge clk or negedge rst_n)//上升沿触发的5进制计数器1 if(!rst_n)
count1<=3'd0; else if(count1==3'd4) count1<=1'b0; else count1<=count1+1'b1; always @(posedge clk or negedge rst_n) if(!rst_n) clk_p<=1'b0; else
if(count1<5'd4) clk_p<=1'b1; else clk_p<=1'b0; always @(negedge clk or negedge rst_n)//下降沿触发的5进制计数器2 if(!rst_n) count2<=3'd0; else
if(count2==3'd4) count2<=3'd0; else
count2<=count2+1'b1; always @(negedge clk or negedge rst_n) if(!rst_n) clk_n<=1'b0; else if (count2<3'd4) clk_n<=1'b1; else clk_n<=1'b0; assign clk_2=clk_p&clk_n; endmodule 设计的思路和三分频一样,只是把计数器的进制改动了,并且把翻转时的判断逻辑改动了。总结按照以上偶数分频和奇数分频