fpga分频器是一种常用于数字信号处理、通信系统、雷达系统等领域的电路,其作用是将信号分成多个频段。在fpga设计中,分频器是不可或缺的组成部分之一,通过对信号进行分频,可以方便地对不同频段进行处理和传输。本文将详细介绍fpga分频器的设计方法,并附上verilog代码示例,以供参考。
一、分频器定义分频器是通过控制时钟信号的周期来实现分频。在实际应用中,fpga时钟信号的产生有两种方法:使用pll(phase locked loop,锁相环)或mmcm(mixed-mode clock manager)生成倍频、分频信号,或者是使用verilog构建分频电路。
分频器通常由两个部分组成:计数器和比较器。计数器用于计数,每计数到一定的值就会触发比较器,比较器会向输出引脚发出0或1的信号。这样就实现了对时钟信号的分频。
分频器一般可以分为3类:偶数分频、奇数分频、小数分频。
二、偶数分频1、设计方法2分频时钟设计,只需要循环计数0~1,计数为0时输出低电平,计数为1时输出高电平。
4分频时钟设计,只需要循环计数0~3,计数为0和1时输出低电平,计数为2和3时输出高电平。
8分频时钟设计,只需要循环计数07,计数为03时输出低电平,计数为4~7时输出高电平。
下图分别画出了基准时钟、2分频时钟、4分频时钟、8分频时钟。
由此可以推导出,偶数分频设计的方法:设为2n分频,只需设计一个计数器在上升沿时循环计数0n-1,每隔0n-1时输出翻转一次。
2、verilog代码实现任意偶数分频设计,可通过设置参数num,设定分频数,具体代码如下所示:
module clk_divider_even#(
   parameter num = 8
)(
    input clk,
    input rst,    
    output reg clk_o
);
//参数定义
localparam width = $clog2(num);
localparam cnt_end = num/2 - 1;
reg [width-1:0] cnt;
//计数模块
always@(posedge clk or posedge rst)begin
    if(rst)
        cnt <= 'b0;            
    else if(cnt == cnt_end) //计满则清零       
        cnt <= 'b0;            
    else
        cnt <= cnt + 1'b1;
end
//分频时钟输出模块
always@(posedge clk or posedge rst)begin
    if(rst)                  
        clk_o <= 1'b0;       
    else if(cnt == cnt_end)  //计满则输出反转
        clk_o <= ~clk_o;        
    else                            
        clk_o<= clk_o;       
end
endmodule
仿真测试结果图:
从图中看出,输出了8分频时钟信号,与预期一致。
三、奇数分频1、设计方法3分频时钟设计,只需要在上升沿时循环计数0~2,上升沿计数时钟信号和下降沿计数时钟信号,都是前1个周期为低电平,后2个周期为高电平;
5分频时钟设计,只需要在上升沿时循环计数0~4,上升沿计数时钟信号和下降沿计数时钟信号,都是前2个周期为低电平,后3个周期为高电平;
7分频时钟设计,只需要在上升沿时循环计数0~6,上升沿计数时钟信号和下降沿计数时钟信号,都是前3个周期为低电平,后4个周期为高电平;
下图分别画出了基准时钟、3分频时钟、5分频时钟、7分频时钟。
由此可以推导出,奇数分频设计的方法:设为2n+1分频,只需设计一个计数器在上升沿时循环计数0~2n,上升沿计数时钟信号和下降沿计数时钟信号,都是前n个周期为低电平,后n+1个周期为高电平;
2、verilog代码实现任意偶数分频设计,可通过设置参数num,设定分频数,具体代码如下所示:
module clk_divider_odd#(
   parameter num = 7
)(
    input clk,
    input rst,    
    output wire clk_o
);
//参数定义
localparam width = $clog2(num);
localparam cnt_end = num - 1;
localparam cnt_end0 = num/2 - 1;
reg [width-1:0] cnt; 
reg clk_pos, clk_neg;
//计数模块
always@(posedge clk or posedge rst)begin
    if(rst)
        cnt <= 'b0;            
    else if(cnt == cnt_end) //计满则清零       
        cnt <= 'b0;            
    else
        cnt <= cnt + 1'b1;
end
//分频时钟输出模块,时钟上升沿
always@(posedge clk or posedge rst)begin
    if(rst)                  
        clk_pos <= 1'b0;       
    else if(cnt == cnt_end0)
        clk_pos <= 1'b1;
    else if(cnt == cnt_end ) 
        clk_pos <= 1'b0;          
    else                            
        clk_pos <= clk_pos;       
end
//分频时钟输出模块,时钟下降沿
always@(negedge clk or posedge rst)begin
    if(rst)                  
        clk_neg <= 1'b0;       
    else if(cnt == cnt_end0)
        clk_neg <= 1'b1;
    else if(cnt == cnt_end)
        clk_neg <= 1'b0;         
    else                            
        clk_neg <= clk_neg;       
end
//输出时钟
assign clk_o = clk_pos && clk_neg;
endmodule
仿真结果如下图:
从图中看出,输出了7分频时钟信号,与预期一致。
四、总结本文分享了“偶数分频和奇数分频”的原理和实现方法,实际应用中一般使用pll或mmcm ip来实现分频输出。
			
			
       	 	
    	嵌入式实时虚拟机ZVM介绍
         	 	
    	验证FPGA设计的策略
         	 	
    	电容降压稳压电源电路
         	 	
    	真会玩!支付宝:今天“扫福字得福卡”已达上限,明天再约哦
         	 	
    	磁性的本质
         	 	
    	FPGA分频器的设计方法
         	 	
    	GaAs基激光器的减薄和抛光问题
         	 	
    	电阻的单位换算方式简介
         	 	
    	MM32F031C8T6可兼容STM32F030C8T6,它的产品特性介绍
         	 	
    	Digi推出业内首个含有五种不同无线技术的车队管理远程信息处
         
       	 	
    	蓝牙耳机系统电路的设计方案详细说明
         	 	
    	一款名为CytoPAN的紧凑型自动化细胞计数测试装置
         	 	
    	利用网络代理扩展1-Wire范围
         	 	
    	小米6还会是1999元吗?看看MIUI官方怎么回答,4月19下午两点见分晓
         	 	
    	合资SUV只是绣花枕头?看了哈弗H9就不想看其他的了
         	 	
    	智能合约如何才能真正实现大规模应用
         	 	
    	中国5G通信锂电池行业的未来发展前瞻
         	 	
    	南京大学人工智能创新_计划5年内引进不少于50家企业及研发机构
         	 	
    	虹科新品来袭!这款流量生成器帮你全面评估确定性网络,最高可达高达 3 Gbps
         	 	
    	三家电信运营商拟定两组三网融合试点城市名单待国务院决策