6

これはおそらく yosys よりも iCEstick に関する質問ですが、Icestorm ツール チェーンを使用しているため、ここで質問します。

インターネット上のさまざまな場所が同意しているように見える、私のデザインのスタートアップ動作を指定したいと思います。これは、一般的に名前が付けられたrst信号に関連しています。そのような信号がどこから来るのかは私には明らかではなかったので、私は電源投入シーケンスを掘り下げました. 現在の理解は、このドキュメントの図 2 からのものです。

デバイスによって がハイに引き上げられた後CDONE、すべての内部レジスタが初期値にリセットされます。さて、各タイプのフリップフロップまたはハード IP がリセット信号を受信し、その内部状態で何かを行う方法についてのラティス ドキュメントをたくさん見つけましたが、それらの状態が何であるかを指定する方法をまだよく理解していません (またはそれらが何であるかを知っているだけでも、それらを使用できます)。

たとえば、電源投入後 (電源投入後のみ) 1 秒間 LED をハイにしたい場合、このリセット信号 (それが何であれ) が無効になった後にカウンターを開始する必要があります。

ice40ファミリのデータ シートとラティスのサイトを調べていると、グローバル セット/リセット信号の使用に関するこのドキュメントが見つかりました。GSRこれはファミリ データ シートの 2-3 ページの「クロック/制御分配ネットワーク」で参照されていることを確認しました。グローバル リセット信号は、グローバル バッファーの 1 つで使用GBUF[0-7]でき、グローバル/高ファンアウト分配ネットワークを使用してすべての LUT に (最大 4 つ) ルーティングできるようです。

これはまさに私が求めていたもののようですが、私のデザインでこれを使用する方法についての他の情報は見つかりません. GSR の使用に関するドキュメントには、次のようにネイティブ GSR コンポーネントをインスタンス化できると記載されています。

GSR GSR_INST (.GSR (<global reset sig>));

しかし、これがシミュレーションのためだけのものかどうかはわかりません。ここで私は完全に間違った方向に進んでいますか、それとも何かが欠けているだけですか? 私はFPGAとハードウェアに非常に慣れていないので、私のアプローチ全体に欠陥がある可能性は十分にあります。

4

1 に答える 1

7

その GSR 文書が実際に iCE40 に関するものかどうかはわかりません。Lattice iCEcube ツールは興味深いことに、GSR セルのインスタンスを受け入れますが、単純にそれらを一定のゼロ ドライバーとして扱っているようです。また、iCE40 sim ライブラリには GSR セル タイプのシミュレーション モデルはなく、Lattice が提供する iCE40 技術ライブラリ ドキュメントにもその説明はありません。

さらに、ラティス ツールを使用して次の 2 つのデザインを作成しました。生成されたビットストリーム ファイルの「コメント フィールド」のタイムスタンプを除いて、生成されたビットストリームは同一です。(このテストは、Synplify ではなく、合成ツールとして Lattice LSE を使用して実行されました。何らかの理由で Synplify を自分のマシンで実行するのに問題があり、1 年以上前に実行することを断念しました..)

これは私が使用した最初のテスト デザインです。

module top (
    input clk,
    output rst,
    output reg val
);
    always @(posedge clk, posedge rst)
        if (rst)
            val = 1;
        else
            val = 0;

    GSR GSR_INST (.GSR (rst));
endmodule

そして、これは 2 番目のテスト デザインです。

module top (
    input clk,
    output rst,
    output val
);
    assign val = 0, rst = 0;
endmodule

この結果を考えると、ラティス ツールは iCE40 設計の GSR セルを単に無視していると言って差し支えないと思います。(おそらく、他の FPGA ファミリとの互換性のためでしょうか?)

では、どのようにして最初の信号を生成するのでしょうか? たとえば、以下はresetn最初の 15 サイクルでアサート (Low にプル) する単純なリセット ジェネレータです。

input clk;
...

wire resetn;
reg [3:0] rststate = 0;
assign resetn = &rststate;
always @(posedge clk) rststate <= rststate + !resetn;

(IceStorm フローはレジスターの任意の初期化値をサポートしますが、ラティス ツールは初期化値を無視し、単にすべての FF をゼロに初期化します。そのため、デザインをツール間で移植可能にしたい場合は、regs のみをゼロに初期化することをお勧めします。 .)

PLL を使用している場合は、PLLLOCK出力を使用して信号を駆動するのがカスタムresetnです。残念ながら、「iCE40 sysCLOCK PLL 設計および使用ガイド」には、生成されLOCKた信号が生成されたクロックに既に同期しているかどうかが記載されていないため、メタスタビリティの問題を回避するためにクロックに同期させることをお勧めします。

wire clk, resetn, PLL_LOCKED;
reg [3:0] PLL_LOCKED_BUF;
...

SB_PLL40_PAD #( ... ) PLL_INST (
  ...
  .PLLOUTGLOBAL(clk),
  .LOCK(PLL_LOCKED)
);

always @(posedge clk)
    PLL_LOCKED_BUF <= {PLL_LOCKED_BUF, PLL_LOCKED};

assign resetn = PLL_LOCKED_BUF[3];

グローバル ネットの使用について: グローバル ネットを介して明示的に resetn 信号を配線できますが (SB_GBプリミティブを使用)、IceStorm フローを使用すると、arachne-pnr はセット/リセット信号を自動的に配線します (少数の FF で使用される場合)。 ) グローバル ネットが使用可能な場合は、グローバル ネットを介して。

于 2016-06-25T19:19:24.957 に答える