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

2020-12-29 17:49:46 浏览数 (1)

大侠好,欢迎来到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

0 人点赞