Verilogコードをシミュレートしますが、FPGA上で予測されるように実行されません。

StackOverflow https://stackoverflow.com/questions/2435444

質問

私は自分のコードのビヘイビアシミュレーションをした、そしてそれが完璧に動作します。予想通りの結果があります。私は私のコードを合成およびSpartan 3E FPGA用にアップロードしてのChipScopeを使用して分析しようとすると、結果は私が期待したものにも、近くではありません。私は間違って何をしましたか? http://pastebin.com/XWMekL7rする

役に立ちましたか?

解決

あなたの問題は、状態レジスタの初期値を設定する行13〜16、である。

 reg    [OUTPUT_WIDTH-1:0] previousstate = 0;              
 reg    [OUTPUT_WIDTH-1:0] presentstate = 1;
 reg    [6:0] fib_number_cnt = 1;  
 reg    [OUTPUT_WIDTH-1:0] nextstate = 1; 

これは合成可能ではない、これらの値を割り当てる「初期」の文を書くと等価である - ハードウェアのデフォルト値のようなものはありません。あなたはFPGA内部のデザインを入れた場合、これらのレジスタのすべてがランダムな値になります。

リセットが高い場合には代わりに、あなたは、あなたの常にブロック内でこれらのカウンタ/状態を初期化する必要があります。

always @(posedge clk or posedge reset)
  if (reset) begin
     previousstate <= 0;
     presentstate <= 1;
     ... etc ...
  end

フォローアップの質問への回答:

あなたがそのようなコードを初期化すると、

、まったく何もハードウェアで起こりません - それは完全に無視されます、あなたは$表示声明に入れているかのように。合成ツールは、すべてのシミュレーションのみスキップし、通常はあなたに(実際にツールに依存していること)それについての警告のいくつかの種類を与えながら、構築ます。

さて、質問を遮断し、非ブロッキング:)非常に長い答えを必要とします。私はおそらく今まで被写体に書かれた最高の紙であるSNUG-2000からこの用紙にご案内いたします。それはあなたの質問と同様に、トピックに関する多くの人に答えます。その後、あなたは順序論理で、ブロッキングステートメントを使用して悪い習慣とみなされ、そして、なぜあなたのコードはとにかく文を遮断すると正常に動作理由を理解します。

http://cs.haifa.ac.il /courses/verilog/cummings-nonblocking-snug99.pdfする

<時間>

もっと答えます:

あなたのようなロジックを作成するための一般的な「パターン」プを定義し、常に二つのブロック、1はロジックを定義し、1を持つことです。生成された値を元に、あなたは、ロジックを実装するために、ブロッキングステートメントを使用し、後者では、あなたは、ラッチ(またはリセット)。したがって、このような何かます:

wire some_input;

// Main logic (use blocking statements)
reg state, next_state;
always @*
  if (reset) next_state = 1'b0;
  else begin
    // your state logic
    if (state) next_state = some_input;
    else next_state = 1'b0;
  end

// Flops (use non-blocking)
always @(posedge clock)
  if (reset) state <= 1'b0;
  else state <= next_state;

私は同期リセットを使用していることに注意していますが、必要に応じて非同期(async)を使用することができます。

他のヒント

行13-16が正しいです。 "REG [6:0] fib_number_cnt = 1;" 「初期」の文を使用するのと同じではありません。レジスタを初期化する方法の詳細については、ザイリンクスの合成ガイドをお読みください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top