2017-02-22 6 views
-1

私はシンプルなカウンタを設計しました。 以下のコードです。シミュレーションとVerilog alwaysブロックの合成の差異

input sig; 
reg [3:0] cnt; 
always @(sig) begin 
    if(sig) 
     cnt = cnt + 1; 
end 

Modelsimによるシミュレーションは正しく機能します。私は、シグネチャが高い場合、カウンタが連続的にカウントされると、FPGA上でコードを実装しました(ise 14.7でSpartan 6)。 私の悪い英語を申し訳ありません。

答えて

3

Modelsimのシミュレーションは「正しく動作しますが、「正しく」定義する方法は指定していません。私はそれをシミュレートし、何も面白いことは起こりません。cntは、それを初期化する仕組みがないので、4'bxのままです。私はあなたがsigのすべての立上りエッジでインクリメントするようにcntを意図していると思います。あなたがcntを初期化(コメントアウトコードを参照)ない場合、これが発生します。このコードを合成することができる一方で、しかし

https://www.edaplayground.com/x/4zXf

を、(これは同期デザインではなく、それはナンセンスに合成します加算器と4つのラッチ)。あなたがsigの立ち上がりエッジ毎にインクリメントするcntを必要とし、あなたはこの設計をインクリメントする必要があると仮定すると、同期

always @(posedge sig) 
    cnt <= cnt + 1; 

これは、加算器と4 D型フリップフロップに合成されます。

実際のハードウェアではカウンタが不明な値を持つため(シミュレーションでは4'bx)、カウンタをリセットするのが普通です。

reg [3:0] cnt = 4'b0; 

ができますが、代わりにリセット信号を検討する必要があります:あなたは、FPGAに cntを初期化して逃げることができ

always @(posedge sig, posedge reset) 
    if(reset) 
    cnt <= 4'b0; // or some other reset value 
    else 
     cnt <= cnt + 1; 

私はsigのあなたの命名に悩まされています。ほとんどの人はこれをclkまたはclockなどと呼んでいます。この名前は、おそらく同期設計に慣れていないことを示唆しています。もしそうなら、あなたはそれについて知っているべきであり、この答えhereも読むべきです。

関連する問題