【FPGA】 基于FPGA分频,倍频设计实现


在FPGA程序设计中使用PLL是分频和倍频最方便的选择可以生成自己想要的频率脉冲,在分频和倍频选择上也可以使用计数器来完成实现

1、分频

1.分频系数方式

module pll #(
    parameter SYS_FREQ = 26'd50_000_000,
              OUT_FREQ = 20'd500_000
)
( 
    input				clk		,
    input				rst_n	

);								 
    //参数定义			 
                        
    //中间信号定义	
    reg                     clk_500k;	 
    wire [25:0]             coef    ;
    reg  [25:0]             cnt_500k;
    assign coef = (SYS_FREQ/OUT_FREQ) >>1;


always @(posedge clk or negedge rst_n)begin 
    if(!rst_n)begin
        cnt_500k <= 26'b1;
        clk_500k <= 1'b0;
    end 
    else if(cnt_500k < coef)begin 
        cnt_500k <= cnt_500k +26'd1;
    end 
    else if(cnt_500k == coef)begin
        clk_500k <= ~clk_500k;
        cnt_500k <= 26'b1;
    end
    else begin 
        cnt_500k <= cnt_500k;
    end 
end

在这里插入图片描述
这种方式分频需要给出模块时钟频率和分频得到的时钟频率,计算除分频系数使用计数器得到自己想要的时钟频率,这种当时分频得到的时钟缺点就是有些模块时钟的频率和得到的时钟频率计算除法会取整,误差太明显了,这种方式用来计算串口的波特率还是可以的,毕竟串口一次传输一字节的数据不会持续太久。

2.偶分频

2分频

module pll
( 
    input				clk		,
    input				rst_n	

);								 
    //参数定义			 
     parameter   num = 8'd2;                   
    //中间信号定义	
    wire [7:0]              num_r       ;
    reg                     clk_out     ;
    reg  [7:0]              cnt         ;
    
assign  num_r = num>>1;

always @(posedge clk or negedge rst_n)begin 
    if(!rst_n)begin
        clk_out <= 1'b0;
        cnt <= 8'd1;
    end 
    else if(cnt == num_r)begin
        clk_out <= ~clk_out;
        cnt <= 8'd1;
    end
    else if(cnt <= num_r)begin
        cnt <= cnt+8'd1;
    end
    else begin 
        clk_out <= clk_out;
        cnt <= cnt;
    end 
end


                        
endmodule

在这里插入图片描述

2.奇分频

7分频

module pll
( 
    input				clk		,
    input				rst_n	

);								 
    //参数定义			 
     parameter   num = 8'd7;                   
    //中间信号定义	
    wire [7:0]              num_r       ;
    reg                     clk_p       ;
    reg                     clk_n       ;
    wire                    clk_out     ;
    reg  [7:0]              cnt1        ;
    reg  [7:0]              cnt2        ;
    
assign  num_r = num>>1;

always @(posedge clk or negedge rst_n)begin 
    if(!rst_n)begin
        clk_p <= 1'b0;
        cnt1 <= 8'd1;
    end 
    else if(cnt1 <= num)begin
        cnt1 <= cnt1+8'd1;
    if(cnt1 == num_r || cnt1 == num)begin
        clk_p <= ~clk_p;
        if(cnt1 == num)
        cnt1 <= 8'd1;
        else
        ;
    end
    end
    else begin 
        clk_p <= clk_p;
        cnt1 <= cnt1;
    end 
end

always @(negedge clk )begin 
    if(!rst_n)begin
        clk_n <= 1'b0;
        cnt2 <= 8'd1;
    end 

    else if(cnt2 <= num)begin
     cnt2 <= cnt2+8'd1;
    if(cnt2 == num_r || cnt2 == num )begin
        clk_n <= ~clk_n;
        if(cnt2 == num)
        cnt2 <= 8'd1;
        else
        ;
    end
    end
    else begin 
        cnt2 <= cnt2;
        clk_n <= clk_n;
    end 
end

assign clk_out =  clk_p & clk_n;


                        
endmodule

在这里插入图片描述

2、倍频

建议还是使用pll,信号的改变是根据时钟的上升沿或下降沿产生的,将一个周期的时钟分为两个周期就相当于变化四次,但是一个周期时钟就上升沿或下降沿我不知到怎么去倍频,网上也有使用组合逻辑异或去倍频,我也试过,这种方式它产生变化后会马上返回之前的状态,保持不到一个时钟的四分之一,反正我没成功,要么就是用timescale 设置精度单位,但这种写法太不实际了也不建议,还是用pll,不然设计pll来干什么的麻,还有就是最近使用国产FPGA,用了高云、易灵思平台,因该还要接触复旦微,发现这些频台的的pll 都有误差,国产的平台都挺麻烦的,可能是自己使用不熟,还有就是易灵思的软件运行太慢,容易未响应,但易灵思FAE、工程师还可以的刚晚上11.了还打电话回我问题。

3、tb程序

`timescale 1ns/1ns
                
module pll_tb();
//激励信号定义 
reg				tb_clk  	;
reg				tb_rst_n	;

                                      
//时钟周期参数定义					        
    parameter		CLOCK_CYCLE = 20;    
                                          
pll u_pll(			      
.clk			(tb_clk			),			      
.rst_n		    (tb_rst_n		)		      			      
);
//产生时钟							       		
initial 		tb_clk = 1'b0;		       		
always #(CLOCK_CYCLE/2) tb_clk = ~tb_clk;  		
                                                
//产生激励							       		
initial  begin						       		
    tb_rst_n = 1'b1;																
    #(CLOCK_CYCLE*2);				            
    tb_rst_n = 1'b0;							
    #(CLOCK_CYCLE*20);				            
    tb_rst_n = 1'b1;							
                                                
                                                
                                                
end 									       	
endmodule 	
  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: FPGA资源可以通过分频倍频实现对信号频率的调整。分频是指将原始信号的频率降低为原始频率的分之一,而倍频则是将原始信号的频率提高为原始频率的倍数。 在FPGA中,分频倍频可以通过计数器来实现。计数器是一种常见的数字电路,可以根据输入的时钟信号进行计数,并在达到特定计数值时输出一个脉冲信号。通过设定计数器的计数值,我们可以将原始信号的频率按照一定比例进行调整。 在分频方面,可以使用一个计数器来将原始信号的频率分为更低的频率。例如,如果原始信号的频率为100MHz,我们可以设置计数器的计数值为10,则每经过10个时钟周期后才会输出一次脉冲信号,即得到一个10MHz的频率。 而在倍频方面,可以使用一个计数器来将原始信号的频率提高为更高的频率。例如,如果原始信号的频率为10MHz,我们可以设置计数器的计数值为10,则每经过一个时钟周期后就会输出10次脉冲信号,即得到一个100MHz的频率。 通过对FPGA资源进行分频倍频操作,我们可以实现对信号频率的灵活调整。这在数字电路设计中非常有用,可以适应不同频率的信号处理需求。同时,FPGA资源的分频倍频功能也能够帮助我们实现时序控制、数据处理和通信接口等功能。 ### 回答2: FPGA资源可以进行分频倍频操作。分频是指将输入信号的频率降低为原来的某个倍数,而倍频是指将输入信号的频率提高为原来的某个倍数。FPGA中的时钟管理器(Clock Manager)模块可以用于实现这些功能。 对于分频操作,我们可以使用FPGA内部的分频器(Divider)来将输入时钟的频率降低。分频器可以将输入时钟分成多个相等的时钟周期,并生成一个较低频率的时钟输出。这对于需要低频工作的外设或电路非常有用,可以提高系统的灵活性和性能。 对于倍频操作,FPGA中的锁相环(PLL)模块可以用于实现。PLL能够通过锁定输入时钟与输出时钟之间的相位关系,将输入时钟的频率提高为倍数。PLL内部包含相位比较器、低通滤波器和控制电路等部分,能够实现高精度和稳定的频率倍增。 通过分频倍频的组合操作,我们可以根据实际需求来调整系统中的时钟频率。这对于匹配不同外设的工作频率、减少功耗、提高系统性能等方面都起到了重要作用。当然,在进行这些操作时需要注意时序约束、时钟分布和时钟域等问题,以确保系统的正确性和稳定性。 ### 回答3: FPGA(现场可编程门阵列)是一种灵活可编程的集成电路芯片,它可以通过重新配置内部的逻辑门和连线来实现不同的功能。在FPGA中,资源可以分频倍频是指通过配置FPGA内部的时钟分频器和倍频器来改变时钟信号的频率。 FPGA中通常包含多个时钟资源,如全局时钟资源和局部时钟资源。全局时钟资源是通过外部输入的时钟信号产生的,而局部时钟资源是由全局时钟经过分频倍频处理生成的。通过使用FPGA提供的时钟分频器和倍频器,我们可以将原始的时钟信号分频倍频得到所需的频率。 在FPGA设计中,通过合理配置时钟资源的分频倍频比例,可以实现不同的时序要求。如在高速数据传输中,我们通常需要较高的工作频率以满足数据的传输速率;而在低功耗设计中,可以通过降低时钟频率来减少功耗。此外,还可以通过分频倍频来减少时钟信号的抖动,提高系统的稳定性和抗干扰性。 通过在FPGA设计中合理使用分频倍频功能,我们可以灵活地调整时钟频率以满足不同的设计需求。但是需要注意的是,分频倍频也会对系统的性能和功耗产生影响,因此需要综合考虑设计的可靠性、性能和功耗等方面的要求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值