インフラプロジェクト(5)を説明するための任意のクロック分周器のプログラミング

EDITORIAL言葉

デジタル論理回路の設計においては、分周回路は、基本単位です。典型的には、所望の周波数を得るために、所定の周波数分割に使用されます。で除算 FPGAのデザインは非常に重要な役割を務めてきたが、それは周波数に来るとき、私は多くの人々が、所望のクロック周波数を取得するためにカウンタを使用するのではと思っていると信じていますが、問題はカウンター除算に使用されます、だけにしてどのように私はそれを行う必要があり、でも、周波数分割が、あれば必要な3つの周波数、周波数-第5、第7及びその奇数クラス分周器で実現することができますか?ここでは、夢の翼兄弟は任意の整数を達成するための方法を紹介します周波数分割の方法。

原則

また、このメソッドは、もちろん、我々が達成するために、ステートマシンを使用している、達成するためのカウンタを使用することです。まず、出力レベルが低いときにカウンタ値が分周クロックローの数よりも小さい場合、第1の状態で、高分周クロックの数と低い数を定義します出力が反転し、次の状態にジャンプするカウンタをクリアしている低レベルの数に等しいです。カウンタ時間がカウンタ値がハイレベルの数に等しい高分周クロック数、同じ出力レベル未満であるこの状態で、反転出力が状態にジャンプするためのカウンタをクリアしこれは、任意の周波数で達成することができます。

システムフレームワーク

ポート説明トップモジュール

ポート名

ポート説明

CLK

システムクロックが50MHz

RST_N

低レベルのシステムリセット信号

CLK_OUT

分周クロック出力

コード分​​析

/ ************************************************* ***          

 *エンジニア:ドリーム・ブラザーウイング

 * QQ:761664056

 *モジュールの機能:任意の周波数モジュール***************************************** ************ /

01   モジュール  分割

CLK 02     //システム・クロック入力

RST_N 03   //低リセットシステム

04 CLK_OUT //周クロック出力

05               )。

06

07       パラメータ  HW =  3 ;    //出力クロックハイレベル幅

08       パラメータ  LW =  2 ;    //出力クロックローレベル幅

09      

10       入力  CLK ;      //システム・クロック入力

11       入力  RST_N ;    //低レベルのシステム・リセット

12は、       出力  CLK_OUT ;  //分周クロック出力

13      

14       REGの  CLK_OUT

15       REG  [ 31である 0 ]  COUNT ;  //カウンタ

16      reg state;  //状态寄存器

17      

18      always @ (posedge clk or negedge rst_n) 

19      begin

20          if (!rst_n)         //异步复位

21              begin

22                  clk_out <= 1'b0; //赋初值

23                  count <= 0;

24                  state <= 0;

25              end

26          else

27              case (state)

28                  0 : if (count < LW-1) //输出低电平个数比较器

29                          begin

30                              count <= count + 1;

31                              state <= 0;

32                          end

33                      else //输出低电平个数等于设定的低电平个数

34                          begin

35                              count <= 0; //计数器清零

36                              clk_out <= 1'b1; //输出变为1

37                              state <= 1;

38                          end

39                                  

40                  1 : if (count < HW-1) //输出高电平个数比较器

41                          begin

42                              count <= count + 1;

43                              state <= 1;

44                          end

45                      else //输出高电平个数等于设定的高电平个数

46                          begin

47                              count <= 0; //计数器清零

48                              clk_out <= 1'b0; //输出变为0

49                              state <= 0;

50                          end

51                  default : state <= 0;

52                  endcase

53      end

54

55  endmodule

7~8行定义了2个参数,一个是输出高电平的个数,一个是低电平的个数,比如HW=3,LW=2输出就是一个5分频的时钟,

比如HW=3,LW=3输出就是一个6分频的时钟,可见只要改变HW和LW的值就可以实现任意分频。第18~53行就是利用状态机来实现分频的过程,用2个状态来计数输出高电平个数和低电平个数。

编写测试代码如下:

/****************************************************          

 *   Engineer      :   梦翼师兄

 *   QQ             :   761664056

 *   The module function : 任意分频测试模块 *****************************************************/

01  `timescale 1ns/1ps  //仿真时间单位是ns,仿真时间精度是ps         

02  module tb;

03

04  reg clk, rst_n; //仿真激励时钟,复位信号

05

06  wire clk_out;     //仿真输出分频信号

07

08  initial begin

09      clk = 0;                //clk时钟信号初始化

10      rst_n = 0;          //rst_n复位信号初始化

11      #200.1 

12      rst_n = 1;          //200.1ns之后,复位结束

13  end

14

15  always #10 clk = ~clk;  //产生50Mhz时钟信号

16

17  divide divide(   //把激励信号送进diveder模块       

18                  .clk(clk),                                  

19                  .rst_n(rst_n),

20                  .clk_out(clk_out)

21                   );

22              

23  endmodule

仿真分析

我们输入的时钟是50Mhz,一个周期是20ns,输出5分频的时钟,周期是100ns,可见我们的设计是正确的。

我们修改分频模块的参数将HW改为3,LW改为3,仿真波形如下:

同样输入的时钟是50Mhz,一个周期是20ns,输出6分频的时钟,周期是120ns,可见我们的设计是正确的。

 

 


 

おすすめ

転載: www.cnblogs.com/mengyi1989/p/11518333.html