前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >源码系列:基于FPGA的任意分频器设计(附源工程)

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

作者头像
FPGA技术江湖
发布2020-12-29 18:16:25
5690
发布2020-12-29 18:16:25
举报
文章被收录于专栏:FPGA技术江湖FPGA技术江湖

大侠好,欢迎来到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等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FPGA技术江湖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档