源码系列:基于FPGA的任意分频器设计(附源工程)

2020-12-29 18:16:25 浏览数 (1)

大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。

今天给大侠带来基于FPGA的任意分频器设计,附源码,获取源码,请在“FPGA技术江湖”公众号内回复“任意分频器设计源码”,可获取源码文件。话不多说,上货。

设计概述

在FPGA设计中,分频器一直都担任着很重要的角色,我相信很多人都已经想到了利用计算器来计算想要使用的时钟频率,但问题是仅仅利用计数器来分频,只可以实现偶数分频,而如果我需要三分频,五分频,七分频等等奇数类分频,那究竟怎么办呢?在这里,让我介绍一个可以实现任意整数分频的方法,这个办法也是同样利用了计数器来计算,跟偶数分频不一样的地方是任意整数分频利用了两个计数器来实现。

设计原理

本次设计主要是设计一个可调的分频器,设置其参数,可以调节其输出的占空比,占空比的意思就是高电平所占周期的多少。我们通知计算高电平的时间和低电平的时间来实现,其实就是我们用两个计数器来控制的。

设计架构

设计框架图:

状态转移图:

通过对两个计数器的计数,一个计算到了跳转下一个状态,等下一计数器计数到了又调回第一个状态,从而完成任意分频器的设计。

设计代码

设计模块代码:

代码语言:javascript复制
module fenpinqi(clk,rst_n,clk0);
  input clk;
  input rst_n;
  
  output reg clk0;
  
  parameter HW = 7 ;
  parameter LW = 3 ;
  
  localparam s0 = 1'b0;
  localparam s1 = 1'b1;
  
  reg state;
  reg [2:0] count;
  
  always @(posedge clk or negedge rst_n)
    if(!rst_n)
      begin
        state <= 1'b0;
        count <= 3'b0;
        clk0 <= 1'b0;
      end
    else
      begin
        case (state)
          s0:begin
              /*if(0 == HW)
                state <= s1;*/
              if(HW   1 > 1)
              if(count < HW -1 )
                begin
                  clk0 <= 1'b1;
                  count <= count   1'b1;
                end
              else
                begin
                  count <= 1'b0;
                  state <= 1;
                end
            end
          s1:begin
              if(LW   1 > 1)
              if(count < LW -1)
                begin
                  clk0 <= 1'b0;
                  count <= count   1'b1;
                end
              else
                begin
                  count <= 1'b0;
                  state <= 0;
                end
            end
          default:state <= 0;
        endcase
      end
endmodule  

仿真测试

测试模块代码:

代码语言:javascript复制
`timescale 1ns/1ps
  module fenpinqi_tb();
  
    reg clk;
    reg rst_n;
  
    wire clk0;
    
    parameter HW = 7;
    parameter LW = 3;
    
    initial begin
      clk = 1'b1;
      rst_n = 1'b0;
      
      #200.1 rst_n = 1'b1;
      #2000 $stop;
    end
      always #10 clk = ~clk;
  
    fenpinqi #(.HW(HW),.LW(LW))
      fenpinqi_dut(
        .clk(clk),
        .rst_n(rst_n),
        .clk0(clk0)
        );
  endmodule 

仿真图:

图中我们通过数上升沿的个数可以看到输出clk0的输出为高7,低3,符合我们的设计。

END

后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!

0 人点赞