前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FPGA学习altera 系列 第二十六篇 奇分频设计

FPGA学习altera 系列 第二十六篇 奇分频设计

作者头像
FPGA技术江湖
发布2020-12-29 17:49:46
2910
发布2020-12-29 17:49:46
举报
文章被收录于专栏:FPGA技术江湖FPGA技术江湖

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

今天给大侠带来“FPGA学习系列 altera"系列,持续更新。此学习心得是本人之前所写,所用设计软件为Quartus II 13.1,现Quartus II 新版本已更新到19+,以下仅供初学者学习参考。后续会更新其他系列,敬请关注。话不多说,上货。

对于每一个的小实验,我们都可以把它看作是一个小项目,逐步的去分析,设计,调试,最后完成功能。下面我们就开始我们的“小项目”。

项目名称:奇分频;

具体要求:奇分频且占空比为50%;

项目分析:将外部的时钟进行奇数分频,且要求占空比为50%。

架构图如下:

系统设计:

1. 工程的名称:div_freq。

2. 假设进行奇分频(3分频),只在上升沿的时候发生动作是不可能完成占空比为50%(占空比是1/3或者2/3)。所以我们考虑在时钟的上升沿和下降沿发生动作。

3. 设计方法

使用两个计数器,一个计数器在上升沿计数,一个计数器在下降沿计数(假设5分频)。

然后根据两个计数器形成对应的波形(前面3周期的高电平,后面两个低电平):

分析形成的clk1和clk2:

如果把上述的clk1和clk2相与那么就可以得出2.5周期的高电平(占空比为50%):

设计代码如下:

代码语言:javascript
复制
/*
模块名称:div_freq
模块功能:奇分频且占空比为50%
作者:郝旭帅
邮箱:746833924@qq.com
*/
  module div_freq (clk, rst_n, clk_out);

  input clk;
  input rst_n;
  
  output clk_out;

  parameter N = 3;

  reg [25:0] cnt1;
  reg [25:0] cnt2;
  
  wire clk1;
  wire clk2;
  
  always @ (posedge clk or negedge rst_n)
    begin
      if (!rst_n)
        cnt1 <= 26'd0;
      else  
        if (cnt1 < N - 1)
          cnt1 <= cnt1 + 1'b1;
        else
          cnt1 <= 26'd0;
    end
  
  assign clk1 = (cnt1 <= (N - 1)/2) ? 1'b1 : 1'b0;

  always @ (negedge clk or negedge rst_n)
    begin
      if (!rst_n)
        cnt2 <= 26'd0;
      else  
        if (cnt2 < N - 1)
          cnt2 <= cnt2 + 1'b1;
        else
          cnt2 <= 26'd0;
    end
  
  assign clk2 = (cnt2 <= (N - 1)/2) ? 1'b1 : 1'b0;

  assign clk_out = clk1 & clk2;

endmodule

解析:

parameter N = 3;N代表奇分频的几分频

clk1 = (cnt1 <= (N - 1)/2) ? 1'b1 : 1'b0; 如果进行N分频,那么应该先做出来高电平为(N-1)/2 + 1个周期,剩下的为低电平。假设为5分频,那么高电平应为(5-1)/2 + 1 = 3个周期。

激励代码如下:

代码语言:javascript
复制
/*
模块名称:div_freq_tb
模块功能:为div_freq模块提供激励信号
作者:郝旭帅
邮箱:746833924@qq.com
*/
  `timescale 1ns/1ps

module div_freq_tb;
  
  reg clk;
  reg rst_n;
  
  wire clk_out;

  initial begin
    clk = 1'b1;
    rst_n = 1'b0;
    # 200.1
    rst_n = 1'b1;
    # 2000
    $stop;
  end

  always # 10 clk = ~clk;

  div_freq #(
          .N(5)//传递参数
        )
        div_freq_dut(
          .clk(clk),
          .rst_n(rst_n),
          .clk_out(clk_out)
        );

endmodule

仿真波形与上述设计时的波形一致。

如果设计要求与笔者的设计不同,请自行更改设计,以保证设计的正确性。如果还是有不明白的读者可以发邮件到我邮箱或者加群询问。

本次FPGA学习altera系列就更新到这里,后续更新其他内容,敬请关注。

END

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

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

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

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

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