FPGA——时钟分频

时钟分频也是笔试题里面经常出现的,(我已经遇到过了),看完这一篇,分分钟掌握!

目录

偶数分频

D触发器级联法

 计数器法

奇数分频

占空比50% 的奇数分频

占空比无要求的奇数分频

任意小数分频


偶数分频

 如上图输入给clk,输出将其变成周期为2倍的clk_out2, 将其变成周期为4倍的clk_out4,将其变成周期为8倍的clk_out8,占空比为50%

D触发器级联法

对于偶数分频电路,在不考虑时钟同步时钟延迟的问题时,直接使用D触发器级联来实现:关键在于,上升沿才能触发翻转,但是一个周期只有一个上升沿,因此周期翻倍

`timescale 1ns/1ns

module even_div
    (
    input     wire rst ,
    input     wire clk_in,
    output    wire clk_out2,
    output    wire clk_out4,
    output    wire clk_out8
    );

    reg clk_out2_r, clk_out4_r, clk_out8_r;
    
    always@(posedge clk_in or negedge rst) begin
        if(~rst)
            clk_out2_r <= 0;
        else
            clk_out2_r <= ~clk_out2_r;
    end
    
    always@(posedge clk_out2 or negedge rst) begin
        if(~rst)
            clk_out4_r <= 0;
        else
            clk_out4_r <= ~clk_out4_r;
    end
    
    always@(posedge clk_out4 or negedge rst) begin
        if(~rst)
            clk_out8_r <= 0;
        else
            clk_out8_r <= ~clk_out8_r;
    end
    
    assign clk_out2 = clk_out2_r;
    assign clk_out4 = clk_out4_r;
    assign clk_out8 = clk_out8_r;

endmodule

 计数器法

2、4、8恰好是2的次方,可构造一个3位计数器,依靠第0位,第1位,第2位的变化速度来实现:

2分频的输出=cnt第0位(由于计数器在clk=高电平时才+1,因此本身就是2倍的周期)

4分频输出=cnt第1位

8分频输出=cnt第2位

eg 4分频:000 001 010 011 100 101 110 111 000

`timescale 1ns/1ns
module even_div
    (
    input     wire rst ,
    input     wire clk_in,
    output    wire clk_out2,
    output    wire clk_out4,
    output    wire clk_out8
    );


    reg [2:0]cnt;
    always@(posedge clk_in or negedge rst)
        if(!rst)
            cnt <= 3'b111;//初始赋全1
    else
        cnt <= cnt+1;
    
    assign clk_out2 = ~cnt[0];//根据波形,一开始全为高电平
    assign clk_out4 = ~cnt[1];
    assign clk_out8 = ~cnt[2];
endmodule

奇数分频

占空比50% 的奇数分频

设计一个同时输出7分频的时钟分频器,占空比要求为50% 

对于奇数分频电路,主要难点在于50%占空比的实现。单触发沿在奇数分频中是没有办法实现50%占空比的,因此需要考虑使用双边沿加组合逻辑实现50%占空比

设置计数器,计数器从0→6,当计数器==3,上升沿触发得到clk_pos,下降沿触发得到clk_neg,

而输出的7分频clk,上升沿在clk_neg触发,下降沿在clk_pos触发,是clk_neg和clk_pos进行或运算的结果

根据这个思路,我们可以得到任意奇数分频,占空比为50%的输出,修改N值即可,代码如下:

`timescale 1ns/1ns


module odo_div_or
  #(parameter N = 7)
   (
    input    wire  rst ,
    input    wire  clk_in,
    output   wire  clk_out7
    );



   reg [3:0]            cnt ;
   always @(posedge clk_in or negedge rst) begin
      if (!rst) begin
         cnt    <= 'b0 ;
      end
      else if (cnt == N-1) begin
         cnt    <= 'b0 ;
      end
      else begin
         cnt    <= cnt + 1'b1 ;
      end
   end

   reg                  clkp ;
   always @(posedge clk_in or negedge rst) begin
      if (!rst) begin
         clkp <= 1'b0 ;
      end
      else if (cnt == (N>>1)) begin 
        clkp <= 1 ;
      end
      else if (cnt == N-1) begin 
        clkp <= 0 ;
      end
   end
  

   reg                  clkn ;
   always @(negedge clk_in or negedge rst) begin
      if (!rst) begin
         clkn <= 1'b0 ;
      end
      else if (cnt == (N>>1) ) begin 
        clkn <= 1 ;
      end
      else if (cnt == N-1) begin 
        clkn <= 0 ;
      end
   end


   assign clk_out7 = clkp | clkn ;


endmodule

占空比无要求的奇数分频

实现一个5分频clk,占空比可修改

由于一个cnt其实=2个clk_in ,所以在占空比不要求的情况下,即使是奇数分频也=一个偶数,我们可以把这个偶数分成2个偶数的和,(例如5分频相当于10clk_in,10=4+6,可以4clk_in低电平,6clk_in高电平)(而要求占空比的时候,10=5+5,需要参考上面的做法)

一个完整的clk周期要包含5个clk_in,但是占空比不要求,那么设置一个计数器cnt,计数范围0-4,每个clk_in周期加1。当计数器数值在0~1时,clk_out5==1;当计数器数值在2~4时,clk_out5==0。这样就实现了周期为5、占空比为3/5 ​的clk_out5

`timescale 1ns/1ns


module odd_div (    
    input     wire rst ,
    input     wire clk_in,
    output    wire clk_out5
);

parameter N = 5;

reg [2:0] cnt;
reg       clk_n;

always @(posedge clk_in or negedge rst)
begin
  if(!rst)
    cnt <= 3'b000;
  else if (cnt == N-1)
    cnt <= 3'b000;
  else
    cnt <= cnt + 1'b1;
end

always @(posedge clk_in or negedge rst) 
begin
  if(!rst)
    clk_n <= 1'b0;
  else if (cnt == (N-1)/2)
    clk_n <= ~clk_n;
  else if (cnt <= 3'b000)
    clk_n <= ~clk_n;
  else
    clk_n <= clk_n;
end

assign clk_out5 = clk_n;


endmodule

任意小数分频

 小数分频器是分频器中最难的一种,而且不能像整数分频那样得到均匀且占空比为50%的分频输出

`timescale 1ns/1ns

module div_M_N(
     input  wire clk_in,
     input  wire rst,
     output wire clk_out
);
    parameter M_N = 8'd87; 
    parameter c89 = 8'd24;  // 8/9时钟切换点
    parameter div_e = 5'd8; //偶数周期
    parameter div_o = 5'd9; //奇数周期
//*************code***********//
    reg [3:0] clk_cnt;
    reg [6:0] cyc_cnt;
    reg div_flag;
    reg clk_out_r;
    
    always@(posedge clk_in or negedge rst) begin
        if(~rst)
            clk_cnt <= 0;
        else if(~div_flag)
            clk_cnt <= clk_cnt==(div_e-1)? 0: clk_cnt+1;
        else
            clk_cnt <= clk_cnt==(div_o-1)? 0: clk_cnt+1;
    end
    
    always@(posedge clk_in or negedge rst) begin
        if(~rst)
            cyc_cnt <= 0;
        else
            cyc_cnt <= cyc_cnt==(M_N-1)? 0: cyc_cnt+1;
    end
    
    always@(posedge clk_in or negedge rst) begin
        if(~rst)
            div_flag <= 0;
        else
            div_flag <= cyc_cnt==(M_N-1)||cyc_cnt==(c89-1)? ~div_flag: div_flag;
    end
    
    always@(posedge clk_in or negedge rst) begin
        if(~rst)
            clk_out_r <= 0;
        else if(~div_flag)
            clk_out_r <= clk_cnt<=((div_e>>2)+1);
        else
            clk_out_r <= clk_cnt<=((div_o>>2)+1);
    end
    
    assign clk_out = clk_out_r;
//*************code***********//
endmodule

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于FPGA的定时与分频实验是通过使用现场可编程门阵列(FPGA)来实现定时和分频功能的实验。FPGA是一种可重构的数字电路设备,可以根据需要重新配置其逻辑功能。 在这个实验中,我们可以使用FPGA来实现各种定时任务,比如测量信号的脉冲宽度、产生精确的时钟信号等。同时,FPGA还可以用于实现频率的分频,将一个高频信号分成更低频的信号。 在进行定时实验时,首先需要将所需的定时参数编程到FPGA中。这可以通过使用硬件描述语言(HDL)编写代码,并使用FPGA开发工具进行综合和实现来实现。编程完成后,FPGA将根据所编写的代码配置其逻辑功能,并开始执行定时任务。 对于分频实验,我们可以通过将输入的高频信号输入FPGA,并在FPGA内部使用计数器来实现频率的分频。通过编程计数器的初始值和计数范围,可以将输入信号的频率分成我们需要的任何低频信号。 通过这些实验,我们可以研究和理解FPGA的定时和分频原理。同时,我们还可以通过改变FPGA的配置参数,并重新编程来实现不同的定时和分频功能。这使得FPGA在电子系统设计和数字信号处理等领域中具有很大的应用潜力。 ### 回答2: 基于FPGA的定时与分频实验是利用FPGA(现场可编程门阵列)芯片的灵活性和可编程性进行的一种实验。FPGA是一种集成电路,具有逻辑门阵列、可编程连线和时钟驱动器等功能。 首先,定时实验是指通过FPGA来生成所需的精确的时间信号。在FPGA中,可以使用可编程逻辑门阵列来构建计数器电路,并通过时钟信号驱动其计数,从而实现定时。可以根据实验需求,以不同的精度和频率来生成相应的时间信号。例如,我们可以使用FPGA生成1秒的脉冲信号,或者使用FPGA生成1毫秒的脉冲信号。 其次,分频实验是指使用FPGA来将输入信号的频率进行分频。通过调节FPGA内部的计数器电路,可以实现将输入信号的频率分频到所需的频率。这在很多应用中非常有用,比如将高频输入信号分频到低频,以适应其他器件的工作频率要求。 基于FPGA的定时与分频实验具有很多优点。首先,由于FPGA具有可编程性,可以根据实验需求来设计电路,灵活性非常高。其次,FPGA具有快速的计算和响应能力,能够实现高精度的定时和分频。此外,FPGA还可以与其他器件进行接口,比如外部触发器、数码管等,便于实验的扩展和结果的显示。 总结来说,基于FPGA的定时与分频实验是一种利用FPGA芯片的可编程能力,通过构建逻辑电路和计数器电路来生成所需的精确时间信号,并将输入信号的频率进行分频的实验。这种实验具有灵活性高、精度高和扩展性强的特点。 ### 回答3: 基于FPGA(Field-Programmable Gate Array)的定时与分频实验是利用FPGA芯片实现定时和分频功能的实验。 FPGA芯片是一种可编程逻辑器件,它包含大量的可编程逻辑门和触发器,可以实现各种数字电路的设计和实现。在定时与分频实验中,我们可以利用FPGA芯片的可编程特性,设计并实现一个定时器或分频器。 首先,我们可以使用硬件描述语言(如Verilog或VHDL)来描述定时器或分频器的功能和结构。我们可以设置一个计数器来记录时间或频率的周期,并设置一个触发电平或时钟信号来触发计数器的计数。当计数器达到一定的计数值时,我们可以产生一个输出信号来表示定时或分频的结果。 接下来,我们利用FPGA开发工具对设计的硬件描述代码进行编译和综合,生成对应的逻辑网表或布局文件。然后,我们可以使用FPGA开发板将生成的文件下载到FPGA芯片中进行配置。配置后,FPGA芯片就可以按照我们设计的逻辑进行工作了。 在实验中,我们可以使用示波器或逻辑分析仪等测试仪器来观察和验证FPGA芯片的工作状态。通过测量输出信号的波形或频率,我们可以判断定时与分频功能的实现是否正确。 基于FPGA的定时与分频实验具有灵活性和可编程性,可以根据需求进行不同参数的设置和调整。同时,FPGA芯片的性能和资源丰富,可以实现较高的精度和稳定性。因此,这种实验方法在数字电路设计和嵌入式系统开发中具有较广泛的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值