精华内容
下载资源
问答
  • 基于FPGA的任意整数分频器的设计.pdf
  • Verilog任意整数分频器

    千次阅读 2017-07-24 16:13:46
    Verilog任意整数分频器Verilog任意整数分频器 偶数分频 奇数分频 两种情况结合一下 在实际设计中有的时候需要简单的任意整数分频器,整数分频器主要解决两种情况下的分频,一个是偶数分频,另一个是奇数分频 偶数...

    Verilog任意整数分频器

    在实际设计中有的时候需要简单的任意整数分频器,整数分频器主要解决两种情况下的分频,一个是偶数分频,另一个是奇数分频

    偶数分频

    偶数分频比较简单,可以使用一个计数器来实现,对输入时钟进行计数,当计数器的值为N/2-1时,将输出翻转,同时将计数器清零即可。(N为分频系数)

    module EvenDiv_v100(
    N,
    fin,
    rst,
    fout
    );
    
    
    input [4:0] N;
    input fin,rst;
    
    output reg fout;
    
    
    reg [4:0] cnter;
    always @(posedge fin or posedge rst)
    begin
     if(rst) 
      begin
       cnter<=5'd0;
       fout<=1'b0;
      end
     else if(cnter>=({1'b0,N[4:1]}-1))
      begin
       cnter<=5'd0;
       fout<=~fout;
      end
     else
      cnter<=cnter+5'd1;
    end
    
    endmodule

    奇数分频

    奇数分频稍微复杂一些,针对需要输出为50%占空比的情况下,要采用两个计数器分别对输入时钟的上升沿和下降沿计数,计数到(N-1)/2时对输出进行翻转,继续计数到N-1的时候对输出进行再次翻转同时清空计数器,将两个计数器(分别是上升沿和下降沿)输出结果相或输出即可。

    module OddDiv_v100(
    N,
    fin,
    rst,
    fout
    
    );
    
    input [4:0] N;
    input fin,rst;
    
    output wire fout; assign fout=PosOut|NegOut;
    
    reg [4:0] PosCnter,NegCnter;
    reg PosOut,NegOut;
    
    always @(posedge fin or posedge rst)
    begin
     if(rst)
      begin
       PosOut<=1'b0;
       PosCnter<=5'd0;
      end
     else if(PosCnter==(N-1)/2)
      begin
       PosCnter<=PosCnter+5'd1;
       PosOut<=~PosOut;
      end
     else if(PosCnter==(N-1))
      begin
       PosCnter<=5'd0;
       PosOut<=~PosOut;
      end
     else
      PosCnter<=PosCnter+5'd1;
    end
    
    always @(negedge fin or posedge rst)
    begin
     if(rst)
      begin
       NegCnter<=5'd0;
       NegOut<=1'b0;
      end
     else if(NegCnter==(N-1)/2)
      begin
       NegCnter<=NegCnter+5'd1;
       NegOut<=~NegOut;
      end
     else if(NegCnter==(N-1))
      begin
       NegCnter<=5'd0;
       NegOut<=~NegOut;
      end
     else
      NegCnter<=NegCnter+5'd1;
    end
    
    endmodule

    两种情况结合一下

    将上述对奇数和偶数分频逻辑集合一下,可以直接判定输入分频系数N为奇数或偶数来决定输出奇数分频结果或者偶数分频结果

    module FrequencyDivision_v100(
    N,
    fin,
    rst,
    fout
    );
    
    input [4:0] N;
    
    input fin,rst;
    
    output wire fout; assign fout=N[0]?OddFout:EvenFout;
    
    
    reg [4:0] EvenCnter,OddCnter1,OddCnter2;
    reg EvenFout,OddFout1,OddFout2;
    
    wire OddFout; assign OddFout=OddFout1|OddFout2;
    
    //==============Even Frequency Division===========//
    always @(posedge fin or posedge rst)
    begin
     if(rst)
      begin
       EvenCnter<=5'd0;
       EvenFout<=1'b0;
      end
     else if(EvenCnter>=({1'b0,N[4:1]}-1))
      begin
       EvenCnter<=5'd0;
       EvenFout<=~EvenFout;
      end
     else
      EvenCnter<=EvenCnter+5'd1;
    end
    
    //==============Odd Frequency Division===========//
    always @(posedge fin or posedge rst)
    begin
     if(rst)
      begin
       OddFout1<=1'b0;
       OddCnter1<=5'd0;
      end
     else if(OddCnter1==(N-1)/2)
      begin
       OddCnter1<=OddCnter1+5'd1;
       OddFout1<=~OddFout1;
      end
     else if(OddCnter1==(N-1))
      begin
       OddCnter1<=5'd0;
       OddFout1<=~OddFout1;
      end
     else
      OddCnter1<=OddCnter1+5'd1;
    end
    
    always @(negedge fin or posedge rst)
    begin
     if(rst)
      begin
       OddCnter2<=5'd0;
       OddFout2<=1'b0;
      end
     else if(OddCnter2==(N-1)/2)
      begin
       OddCnter2<=OddCnter2+5'd1;
       OddFout2<=~OddFout2;
      end
     else if(OddCnter2==(N-1))
      begin
       OddCnter2<=5'd0;
       OddFout2<=~OddFout2;
      end
     else
      OddCnter2<=OddCnter2+5'd1;
    end
    
    
    endmodule
    展开全文
  • 基于VHDL的任意整数分频器的设计,梁颖,,本文对分频原理进行了详细分析,以简单的2、3分频为例对分频原理进行形象的图形分析,方便对原理的理解,并完成了两个不同方案的�
  • 基于FPGA 的等占空比任意整数分频器的设计
  • FPGA基础入门篇(七) 多路分频器的实现——任意整数分频器(二) 本次介绍分频的主要设计方法,如得到任意整数的分频器该怎么设计。前面介绍了2、3、4、8分频的设计方法。其实本质是利用计数器对时钟上升沿进行计数...

    FPGA基础入门篇(七) 多路分频器的实现——任意整数分频器(二)

    本次介绍分频的主要设计方法,如得到任意整数的分频器该怎么设计。前面介绍了2、3、4、8分频的设计方法。其实本质是利用计数器对时钟上升沿进行计数的基本操作。
    所以简单的解决办法就是产生计数器,然后对计数进行高低电平处理。

    一、2的幂次方分频
    1. 对于2分频,可以利用每次时钟上升沿进行输出反转操作,得到2分频。
    2. 对于4分频,可以利用上一次分频后的信号,进行信号上升沿反转。
      也可以定义1位1bit的计数器,产生0、1的循环序列,在0状态时,取反,其他状态保持,可以产生4分频;
      对于8分频,除了利用上一次分频后的信号,进行信号上升沿反转。定义2位2bit计数器,00状态取反,其他状态保持,可以产生8分频。
    3. 同样对于16等2n分频,均利用计数器的方式。对于16分频,定义三位3bit的计数器,在000状态取反,其他状态保持,可以产生16分频。

    所以对于2n分频,定义一个n-1 位计数器,在0…0(n-1个)状态下反转,其他状态保持。即可以得到2n分频。

    二、奇数分频
    1. 先讨论3分频的情况,即半时钟周期的奇数倍。需要用到时钟的上升沿和下降沿。
      因此先定义两个二位2bit的计数器。一个计数器用于在时钟上升沿的情况下计数,产生00、01、11三种状态,另一个计数器用于在时钟下降沿的情况下计数,产生00、01、11三种状态。再定义两个寄存器,分别在00状态下赋值为高电平,然后将两个计数器输出逻辑相或
    2. 对于5分频的情况,同样先定义两个3位3bit计数器,分别在时钟上升沿和下降沿计数,产生000、001、010、011、100五种状态,再分别定义两个寄存器,在000、001均赋值为1,其他赋值为0,然后逻辑相或得到五分频。
      (至于为什么三或五个状态,主要取决于多少分频,一个n分频等价于n倍时钟周期,所以需要n个状态)

    所以对于奇数n分频,需要定义两个m位m bit的计数器(最小的m值,使2m > n),产生n个状态计数,再定义两个寄存器,然后在n/2之前的的状态计数赋值为1,其他均为0,最后逻辑相或即可得到奇数n分频

    三、偶数分频

    对于偶数n分频除了可以按照上面的奇数分频来定义n个状态,然后在前n/2个之前赋值为1,其他为0。还可以用到偶数的特性,可以减小一个bit位。即只需产生n/2个奇数状态即可,利用反转特性,即可得到。

    1. 对于6分频,定义一个2位2bit的计数器,产生00、01、11三种计数状态,然后在00状态下反转,其他保持,即可得到6分频。

    所以对于偶数n分频,定义一个m位计数器(最小的m,2m >= n/2),产生n/2个计数状态,在0…0 (n/2个) 反转,其他保持,可以得到偶数n分频。
    其中偶数2幂次放分频作为2m = n/2的特例,如8分频,m=2,16分频,m=3。

    展开全文
  • 等占空比任意整数分频器的verilog语言实现 尽管在FPGA设计中,广泛使用芯片厂家集成的锁相环资源如altera的PLL,Xilinx的DLL来进行时钟的分频,倍频以及相移。但在对时钟要求不高或资源有限的情况下,使用硬件描述...

    等占空比任意整数分频器的verilog语言实现

        尽管在FPGA设计中,广泛使用芯片厂家集成的锁相环资源如altera的PLL,Xilinx的DLL来进行时钟的分频,倍频以及相移。但在对时钟要求不高或资源有限的情况下,使用硬件描述语言设计电路来进行时钟的分频相移非常实用。因此分频器的设计仍然是FPGA中比较常用的一个设计,同时又被许多公司拿来作为面试题,称其为经典设计也不为过。本文所要讨论的是使用Verilog语言来设计等占空比任意整数分频器。为方便使用和比较,将不同分频倍数的分频器放在了一个模块中。奇偶数分频只需修改参数即可实现任意分频倍数的分频,具体的设计思路可以参考代码的注释,及结合Modelsim的仿真时序图。设计经过Modelsim验证时序正确。设计过程中参考了网上的资料。

        有需要的童鞋可以参考下,欢迎批评指正。

        以下是设计的Verilog实现:freq_divide.v

    ContractedBlock.gif ExpandedBlockStart.gif View Code
      1 `timescale 1ns / 100ps
    2 ////
    3 // Company: hangzhou dianzi university
    4 // Engineer: D.H.j.
    5 //
    6 // Create Date: 2011.10.13
    7 // Design Name: freq_divide
    8 // Module Name: freq_divide
    9 // Target Device: <target device>
    10 // Tool versions: QuartusII9.0
    11 // Description:
    12 // 等占空比任意整数分频的verilog语言实现
    13 ////
    14
    15 module freq_divide(
    16 clkin,
    17 rst_n,
    18 clkout1,//2分频
    19 clkout2,//2的n次方分频
    20 clkout3,//偶数倍(2J)分频
    21 clkout4,
    22 clkout5,
    23 clkout6//奇数倍(2K+1)分频
    24 );
    25
    26 input clkin;//50MHz
    27 input rst_n;
    28 output reg clkout1;
    29 output clkout2;
    30 output reg clkout3;
    31 output reg clkout4;
    32 output reg clkout5;
    33 output clkout6;
    34
    35 //counter
    36 reg[7:0] cnt1;
    37 reg[7:0] cnt2;
    38 reg[7:0] cnt3;
    39 reg[7:0] cnt4;
    40
    41 /*
    42 reg[7:0] cnt;//counter
    43 always@( posedge clkin or negedge rst_n )
    44 begin
    45 if(!rst_n)
    46 cnt <= 0;
    47 else
    48 cnt <= cnt + 1'b1;
    49 end
    50 */
    51
    52 //*****************任意整数分频*****************//华丽的分割线
    53
    54 //最简单的2分频
    55 always@( posedge clkin or negedge rst_n )
    56 begin
    57 if(!rst_n)
    58 clkout1 <= 0;
    59 else
    60 clkout1 <= ~clkout1;
    61 end
    62
    63 //2的n次方分频
    64 /*
    65 2 0010
    66 4 0100
    67 8 1000
    68 ...
    69 */
    70 parameter I = 2;//实现4分频 4=2^I I=2
    71 always@( posedge clkin or negedge rst_n )
    72 begin
    73 if(!rst_n)
    74 cnt1 <= 0;
    75 else
    76 cnt1 <= cnt1 + 1'b1;
    77 end
    78 assign clkout2 = cnt1[I-1];
    79
    80 //偶数倍(2J)分频
    81 //计数器计到一半时,输出时钟翻转,计数器复位
    82 parameter J = 3;//实现6分频 6=2M J=3
    83 always@( posedge clkin or negedge rst_n )
    84 begin
    85 if(!rst_n) begin
    86 clkout3 <= 0;
    87 cnt2 <= 0;
    88 end
    89 else begin
    90 if(cnt2==J-1) begin
    91 clkout3 <= ~clkout3;
    92 cnt2 <= 0;end
    93 else
    94 cnt2 <= cnt2 + 1'b1;
    95 end
    96 end
    97
    98 //奇数倍(2K+1)分频 经典面试题
    99 /*
    100 分别利用上升沿和下降沿触发产生两个占空比为(K+1)/(2K+1)的时钟,
    101 再将两个时钟进行逻辑与操作,得到奇数倍分频的时钟
    102 */
    103 parameter K = 5;//实现11分频 11=2K+1 K=5
    104 //上升沿计数器
    105 always@( posedge clkin or negedge rst_n )
    106 begin
    107 if(!rst_n) begin
    108 cnt3 <= 0;
    109 end
    110 else begin
    111 if(cnt3==2*K)
    112 cnt3 <= 0;
    113 else
    114 cnt3 <= cnt3 + 1'b1;
    115 end
    116 end
    117
    118 //一个周期内,正电平占(K+1)/(2K+1)
    119 always@( posedge clkin or negedge rst_n )
    120 begin
    121 if(!rst_n) begin
    122 clkout4 <= 0;
    123 end
    124 else begin
    125 if(cnt3==K-1)
    126 clkout4 <= 1;
    127 else if(cnt3==2*K)
    128 clkout4 <= 0;
    129 end
    130 end
    131
    132 //下降沿计数器
    133 always@( negedge clkin or negedge rst_n )
    134 begin
    135 if(!rst_n) begin
    136 cnt4 <= 0;
    137 end
    138 else begin
    139 if(cnt4==2*K)
    140 cnt4 <= 0;
    141 else
    142 cnt4 <= cnt4 + 1'b1;
    143 end
    144 end
    145
    146 always@( negedge clkin or negedge rst_n )
    147 begin
    148 if(!rst_n) begin
    149 clkout5 <= 0;
    150 end
    151 else begin
    152 if(cnt4==K-1)
    153 clkout5 <= 1;
    154 else if(cnt4==2*K)
    155 clkout5 <= 0;
    156 end
    157 end
    158
    159 assign clkout6 = clkout4 & clkout5;
    160
    161 endmodule

     

    以下是testbench代码:freq_divide_tb.v

    ContractedBlock.gif ExpandedBlockStart.gif View Code
     1 ////
    2 // Company: hangzhou dianzi university
    3 // Engineer: D.H.j.
    4 //
    5 // Create Date: 2011.10.13
    6 // Design Name: freq_divide_tb
    7 // Module Name: freq_divide_tb
    8 // Target Device: <target device>
    9 // Tool versions: QuartusII9.0
    10 // Description:
    11 // 等占空比任意整数分频的verilog语言实现testbench
    12 ////
    13
    14 module freq_divide_tb;
    15
    16 reg clkin;
    17 reg rst_n;
    18 //counter
    19 reg[7:0] cnt1;
    20 reg[7:0] cnt2;
    21 reg[7:0] cnt3;
    22 reg[7:0] cnt4;
    23
    24 always #10 clkin = ~clkin;//50MHz
    25
    26 initial
    27 begin
    28 clkin = 0;
    29 rst_n = 0;
    30 #10 rst_n = 1;
    31 end
    32
    33 freq_divide u(
    34 .clkin(clkin),
    35 .rst_n(rst_n),
    36 .clkout1(clkout1),
    37 .clkout2(clkout2),
    38 .clkout3(clkout3),
    39 .clkout4(clkout4),
    40 .clkout5(clkout5),
    41 .clkout6(clkout6)
    42 );
    43
    44 endmodule

     

    最后是Modelsim的仿真时序图:



    转载于:https://www.cnblogs.com/5uperDing/archive/2011/10/16/2214086.html

    展开全文
  • 分频器是FPGA设计中使用频率非常高的基本设计之一,尽管在目前大部分设计中,广泛使用芯片厂家集成的锁相环资源,如赛灵思(Xilinx)的DLL.来进行时钟的分频,倍频以及相移。 但是对于时钟要求不高的基本设计,通过...
  • 尽管在FPGA设计中,广泛使用芯片厂家集成的锁相环资源如altera的PLL,Xilinx的DLL来进行时钟的分频,倍频以及相移。但在对时钟要求 不高或资源...本文所要讨论的是使用Verilog语言来设计等占空比任意整数分频器。...

    尽管在FPGA设计中,广泛使用芯片厂家集成的锁相环资源如altera的PLL,Xilinx的DLL来进行时钟的分频,倍频以及相移。但在对时钟要求 不高或资源有限的情况下,使用硬件描述语言设计电路来进行时钟的分频相移非常实用。因此分频器的设计仍然是FPGA中比较常用的一个设计,同时又被许多公司拿来作为面试题,称其为经典设计也不为过。本文所要讨论的是使用Verilog语言来设计等占空比任意整数分频器。为方便使用和比较,将不同分频倍数的分频器放在了一个模块中。

    以下是设计的Verilog实现:freq_divide.v

    `timescale 1ns / 100ps
    ////
    // Company: hangzhou dianzi university
    // Engineer: D.H.j.
    //
    // Create Date: 2011.10.13
    // Design Name: freq_divide
    // Module Name: freq_divide
    // Target Device: <target device>
    // Tool versions: QuartusII9.0
    // Description:
    //    等占空比任意整数分频的verilog语言实现
    ////
                
    module freq_divide(
    clkin,
    rst_n,
    clkout1,//2分频
    clkout2,//2的n次方分频
    clkout3,//偶数倍(2J)分频
    clkout4,
    clkout5,
    clkout6//奇数倍(2K+1)分频
    );
    
    input clkin;//50MHz
    input rst_n;
    output reg clkout1;
    output clkout2;
    output reg clkout3;
    output reg clkout4;
    output reg clkout5;
    output  clkout6;
    
    //counter
    reg[7:0] cnt1;
    reg[7:0] cnt2;
    reg[7:0] cnt3;
    reg[7:0] cnt4;
    
    /*
    reg[7:0] cnt;//counter
    always@( posedge clkin or negedge rst_n )
    begin
        if(!rst_n)
          cnt <= 0;
        else 
          cnt <= cnt + 1'b1;    
    end
    */
    
    //*****************任意整数分频*****************//华丽的分割线
    
    //最简单的2分频
    always@( posedge clkin or negedge rst_n )
    begin
       if(!rst_n) 
          clkout1 <= 0;
       else 
          clkout1 <= ~clkout1;    
    end
    
    //2的n次方分频
    /*
      2 0010
      4 0100
      8 1000
      ...
    */
    parameter I = 2;//实现4分频 4=2^I I=2
    always@( posedge clkin or negedge rst_n )
    begin
        if(!rst_n) 
          cnt1 <= 0;
        else 
          cnt1 <= cnt1 + 1'b1;
    end
    assign clkout2 = cnt1[I-1];
     
    //偶数倍(2J)分频
    //计数器计到一半时,输出时钟翻转,计数器复位
    parameter J = 3;//实现6分频 6=2M J=3
    always@( posedge clkin or negedge rst_n )
    begin
        if(!rst_n) begin
          clkout3 <= 0;
          cnt2 <= 0;
          end
        else begin
            if(cnt2==J-1) begin
            clkout3 <= ~clkout3;    
              cnt2 <= 0;end
            else 
            cnt2 <= cnt2 + 1'b1;
        end
    end
    
    //奇数倍(2K+1)分频 经典面试题
    /*
    分别利用上升沿和下降沿触发产生两个占空比为(K+1)/(2K+1)的时钟,
    再将两个时钟进行逻辑与操作,得到奇数倍分频的时钟
    */
    parameter K = 5;//实现11分频 11=2K+1 K=5
    //上升沿计数器
    always@( posedge clkin or negedge rst_n )
    begin
        if(!rst_n) begin
          cnt3 <= 0;
          end
        else begin
          if(cnt3==2*K)
            cnt3 <= 0;
          else
            cnt3 <= cnt3 + 1'b1;
        end
    end
    
    //一个周期内,正电平占(K+1)/(2K+1)
    always@( posedge clkin or negedge rst_n )
    begin
        if(!rst_n) begin
          clkout4 <= 0;
          end
        else begin
          if(cnt3==K-1) 
            clkout4 <= 1;    
          else if(cnt3==2*K)
            clkout4 <= 0;
         end
    end
    
    //下降沿计数器
    always@( negedge clkin or negedge rst_n )
    begin
        if(!rst_n) begin
          cnt4 <= 0;
          end
        else begin
          if(cnt4==2*K)
            cnt4 <= 0;
          else
            cnt4 <= cnt4 + 1'b1;
        end
    end
    
    always@( negedge clkin or negedge rst_n )
    begin
        if(!rst_n) begin
          clkout5 <= 0;
          end
        else begin
          if(cnt4==K-1) 
            clkout5 <= 1;    
          else if(cnt4==2*K)
            clkout5 <= 0;
         end
    end
    
    assign clkout6 = clkout4 & clkout5;
    
    endmodule

     

     

     以下是testbench代码:freq_divide_tb.v

    ////
    // Company: hangzhou dianzi university
    // Engineer: D.H.j.
    //
    // Create Date: 2011.10.13
    // Design Name: freq_divide_tb
    // Module Name: freq_divide_tb
    // Target Device: <target device>
    // Tool versions: QuartusII9.0
    // Description:
    //    等占空比任意整数分频的verilog语言实现testbench
    ////
        
    module freq_divide_tb;
    
    reg clkin;
    reg rst_n;
    //counter
    reg[7:0] cnt1;
    reg[7:0] cnt2;
    reg[7:0] cnt3;
    reg[7:0] cnt4;
    
    always #10 clkin = ~clkin;//50MHz
    
    initial
    begin
    clkin = 0;
    rst_n = 0;
    #10 rst_n = 1;
    end
    
    freq_divide u(
    .clkin(clkin),
    .rst_n(rst_n),
    .clkout1(clkout1),
    .clkout2(clkout2),
    .clkout3(clkout3),
    .clkout4(clkout4),
    .clkout5(clkout5),
    .clkout6(clkout6)
    );
    
    endmodule

     

     

    仿真图如下

    转载于:https://www.cnblogs.com/lihao602/p/3375191.html

    展开全文
  • Verilog语言“加减可控任意进制计数器”及“占空比50%的任意整数分频器”设计 今天(2017年12月28)考EDA实验,考的真是惊险刺激,最后实现了四分之三的功能。 今天的使用时设计一个可以实现使用指定拨码开关控制...
  • 直接上代码吧,将奇数以及偶数分频合并在一起,需要注意当频数为1时情况的书写 module test01( input clk_in, input rst_n, output clk_out); localparam div_width = 3, //分频计数器位宽 fre_div ...
  • VHDL语言实现的任意整数分频器

    千次阅读 2015-05-26 23:39:00
    分频器应该是每 1.5 的 clock 就 0 变 1 、 1 变 0 ,但问题来了,哪来的 1.5 个 clock? 计数器并不能产生 1.5!! 正源触发与负源触发的间隔时间刚好是 0.5 个 clock? 所以我们产生两个 clock ,一个是 posedge clk ...
  • 一.设计目标 对输入时钟信号进行1~16分频。 二....从分频数来看,整个设计可分为三部分:1分频、奇数分频、偶数分频。 ①1分频:可直接将输入时钟信号进行输出。 ②偶数分频:使用一个计数器在上升沿或者下降沿进行...
  • VHDL语言实现的任意整数分频器

    千次阅读 2008-08-05 18:02:00
    分频器应该是每 1.5 的 clock 就 0 变 1 、 1 变 0 ,但问题来了,哪来的 1.5 个 clock? 计数器并不能产生 1.5!! 正源触发与负源触发的间隔时间刚好是 0.5 个 clock? 所以我们产生两个 clock ,一个是 posedge clk ...
  • 任意整数分频器任意整数分频器任意整数分频器任意整数分频器任意整数分频器任意整数分频器任意整数分频器

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,985
精华内容 794
关键字:

任意整数分频器