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,可见我们的设计是正确的。