Verilogコードをシミュレートしますが、FPGA上で予測されるように実行されません。
質問
私は自分のコードのビヘイビアシミュレーションをした、そしてそれが完璧に動作します。予想通りの結果があります。私は私のコードを合成および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;" 「初期」の文を使用するのと同じではありません。レジスタを初期化する方法の詳細については、ザイリンクスの合成ガイドをお読みください。