[FPGA] Verilogのはカスタマイズカウントダウンタイマーを実装する(例えば24秒)

言いたかったです...

実装は、本明細書に簡単な例を与えるために、24秒のカウントダウン、関数定義、カウントダウン動作を24秒であり、シミュレーション機能と連動し、次いで試料を拡大し、Aのように呼び出すことができますモジュール。

この記事では、ディスプレイモジュールとは関係ありません。

サンプルカウンタエッジ検出_

コードを説明しました

まず、サンプルコード。

module CntDwn
(input CK//Clock
,output[4:0]CD//CountDown
);
parameter[4:0]cd=5'd24;//Define a parameter which can be modified when called
reg[4:0]dif=0;//Difference
always@(posedge CK)
if(dif==cd)
    dif<=0;
else
    dif<=dif+1;
assign CD=cd-dif;
endmodule

このコードは、直接カウンタエッジ検出タイミング機能を達成するために利用される非常に単純な原理であり、完全かつ明確な差に等しいカウントダウンの数との差と、各論理は、立ち上がり微分(DIF)がインクリメントされていることを検出。

この初期化コードの間に24の数をカウントダウンし、この数がカウントダウンで変更することができる他のモジュールを起動し、携帯されます。

シミュレーションデモ

`timescale 1 ns/ 1 ns
module CntDwn_vlg_tst();
reg CK;
wire[4:0]CD;
CntDwn i1 (.CD(CD),.CK(CK));
initial begin
CK=0;
end
always begin
#1 CK<=~CK;
end
endmodule

上記サンプルシミュレーションファイルのコード(の.Vt)のModelSimによって以下シミュレーション波形であります

MW7hNt.jpg

あなたはシミュレーションファイル転送コールのパラメータを変更した場合、5行目を変更

CntDwn #(.cd(10)) i1 (.CD(CD),.CK(CK));

なお、図の波形に従います。

MW7I9f.png

目に見える、サンプルコードのカウントダウンの実装を成功は、その後、サンプルコードを展開します。

_カスタムカウントダウンカウントダウン間隔数を拡大し、

コードを説明しました

module CntDwn
(input CK//Clock
,output[4:0]CD//CountDown
);
parameter[4:0]cd=5'd24;//Define a parameter which can be modified when called
parameter[25:0]div=26'd50;//Frequency Division
reg[25:0]cnt=0;//Timer.Control the period
reg[4:0]dif=0;//Difference
always@(posedge CK)
if(cnt==div)begin
    cnt<=0;
    dif<=dif+1;
end
else if(dif==cd)
    dif<=0;
else
    cnt<=cnt+1;
assign CD=cd-dif;
endmodule

これはコードの拡張であり、追加の分割は、呼び出されたときにカウントダウン間隔とカスタム関数の数を達成するために、送信パラメータを変更し、カウントダウン間隔をカスタマイズすることができます。

符号分割パラメータはすでに、50にデバッグを容易にするために、以下のシミュレーションを初期化されます。

シミュレーションデモ

以下のシミュレーションファイル

`timescale 1 ns/ 1 ns
module CntDwn_vlg_tst();
reg CK;
wire[4:0]CD;
CntDwn i1 (.CD(CD),.CK(CK));
initial begin
CK=0;
end
always begin
#1 CK<=~CK;
end
endmodule

波形は、以下の

MWbBQO.png

周波数分割パラメータは、カウントダウンがまだスケーリングクロック信号の他の寸法(稠密あるいはのみ太線として示さに)充填されているように、サンプルよりも50倍以上に相当する、50であるため、適切に間隔機能を機能正しいです。

概要

この記事では、Verilogでどのようにカウントダウンの概要を提供し、知識の波形シミュレーション、検証、便利なデバッグに参加しましたが、も考慮にコールのイデオロギーのパラメータを受け取り、およびコードの可読性、保守性や移植性を向上させます。

あなたが32以上(5ビット幅)が必要な場合は、トップレベルのコードは、幅パラメータをビットたときにカウントダウン番号呼び出しに、この記事のコードはまだ例えば、不足していることに留意すべきで手動で変更する必要があり、非常に便利ではない、1つの解決策は、カウントダウンを数えることですまた、それはまた、異なるパラメータで送信することができるように、WIDTHパラメータ幅ビットとして定義されている。分割パラメータが広い大部分の基本的なニーズを満たすために26ビットとして定義されている、一般的に演算ビット幅を変更する必要はありません。

秒のカウントダウンを達成するために、シミュレーションパラメータのレベルでの効果を達成するために、分周クロック信号であっても、その期間は、励起と一致して、1秒間隔ことがありますが、ボードの開発を実現したい場合は、ボードには水晶のパラメータを考慮する必要があります、 1秒の間隔を達成するためにパラメータを変更直接呼び出す場合や、周波数分割パラメータが算出され、パラメータが渡されます。

例_24秒のカウントダウン

module CntDwn_24s
(input CK//Clock
,output[4:0]CD//CountDown
);
parameter[4:0]cd=5'd24;//Define a parameter which can be modified when called
parameter[25:0]div=26'd12000000;//Frequency Division,12M
reg[25:0]cnt=0;//Timer.Control the period
reg[4:0]dif=0;//Difference
always@(posedge CK)
if(cnt==div)begin
    cnt<=0;
    dif<=dif+1;
end
else if(dif==cd)
    dif<=0;
else
    cnt<=cnt+1;
assign CD=cd-dif;
endmodule

12Mのオンボード発振器の通常運転の場合には、このコード。

おすすめ

転載: www.cnblogs.com/Clouds42/p/11897777.html