FC2カウンター FPGAの部屋 DDR SDRAMコントローラの変更
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

DDR SDRAMコントローラの変更

またまた、Verilog版DDR SDRAMコントローラを変更した。(前の記事の詳報です)なるべくIPで入れたときに階層が異なって書き換えの必要なUCFを使わずにVerilogソースに制約を記述することを目的とした。といってもパッド位置は階層が変わらないので、そのままUCFに記述し、FFをIOBに入れる制約をVerilogソースに記述した。下のように。。。

(* IOB = "TRUE" *) reg [DDR_ADDRESS_WIDTH-1 :0] ddr_addr_node_2d;


後、Verilog版DDR SDRAMコントローラのVerilogソースをインプリメントしてみたら、DQからリードする最初のDDRのFF(といっても、私の回路では32ビット幅の出力うち半分は使っていないので片側のFFは消えてしまうので、DDRとはならないのだが。。。)がIOBに入らないで、SLICEに行ってしまっている。(下の図で右下のFFを使用しないで入力パッドから右に抜けているのがわかるだろうか?)
DDR_SDRAMC_DQ0_ISE92SP4_080320.png

これではまずいので、Spartan3E用のデータ(DQ)入力用FFを推定させる記述(下)を

    always @(posedge reset, posedge clk) begin // DQのIOB内のDDRレジスタを推定させる
        if (reset==1'b1)
            dq_rise <= 0;
        else // 立ち上がり
            dq_rise <= ddr_dq;
    end
    always @(posedge reset, negedge clk) begin
        if (reset==1'b1)
            dq_fall <= 0;
        else // 立下り
            dq_fall <= ddr_dq;
    end


IBUFプリミティブとIDDR2プリミティブを使用した記述に書き換えた。

    // 入力用DDRレジスタ
    generate
    genvar i;
        for (i=DDR_DATA_WIDTH-1; i>=0; i=i-1) begin : IDDR_GEN
            IBUF IBUF_inst(
                .I(ddr_dq[i]),
                .O(dq_ibuf[i])
            );
            IDDR2 #(
                .DDR_ALIGNMENT("NONE"),
                .SRTYPE("ASYNC")
            ) IDDR2_inst(
                .Q0(dq_rise[i]),
                .Q1(dq_fall[i]),
                .C0(clk),
                .C1(clkx),
                .CE(1'b1),
                .D(dq_ibuf[i]),
                .R(reset),
                .S(1'b0)
            );
        end
    endgenerate


これでUCFにIOB=TRUE制約を書かなくてもIOBのDDRレジスタを使うようになったと思った。
これでISE9.2iSP4でインプリメントをしてみると、MAPでINTERNAL_ERRORが出てしまってインプリメントができない。これは出力ポートの半分を使用していないためIDDR2の半分のFFが消されたのでDRCエラーになったのかな? INTERNAL_ERRORは出てはまずいと思うが、とりあえず使っていない出力も拡張ポートに出力するようにしたらINTERNAL_ERRORはでなくなった。とりあえず良かった。IDDR2の出力の1つを使用していないとINTERNAL_ERRORになってしまうので注意。
これでインプリメントしたら、IOBの入力用のDDRレジスタを使用するようになった。(上の図と比べて右下のFFを使用するようになったのがわかるだろうか?)
DDR_SDRAMC_DQ0_IDDR2_ISE92SP4_080321.png

以前のバージョンではIOBの入力用FFを使用したのだが、修正したので使われなくなったのだろうか?それでも修正したのはこのモジュールではないところなのだけれど。。。ISEのバージョンが変わったからかもしれない。。。ということでXSTにIOBの入力用FFを推定させることは危ないというか、ちゃんとそうなっているかFPGA Editorで確認したほうが良いと思う。それがいやならば、最初から決めうちのプリミティブを使ってしまったほうが良いだろう。しかし、こうするとAlteraに乗り換えるときはおろか、Xilinxのほかのチップに乗り換えるときにも書き換えが必要になるときがあるがしょうがない。
なかなか、この辺のチップの中の構造を積極的に使用する必要があるアプリの場合には、1つソースを書いてどのチップででも適応できるというのが難しい。そこで、CoreGenではチップごとに最適なソースを生成する必要があるんだろう。。。
DCMの位置固定は大体ISEがいいところを使ってくれるようなので大丈夫だろうと思う。私のインプリメントでは、DCM_INST_EXTがDCM_X1Y1(これはDCM_X0Y1でもよさそう、つまりつぎのDCMとひっくり返っても)、DCM_INSTがDCM_X0Y1、DCM_INST1がDCM_X1Y0だった。大きく外れているときにはFloorplannerで位置を固定したほうが良いと思う。
とりあえずVerilog版DDR SDRAMコントローラは修正して、実際にSpartan3E Starter Kitで動作を確認した。使用する方は再度ダウンロードしてみてください。
IFD_DELAY_VALUEは2のままです。
  1. 2008年03月22日 06:09 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/759-3cb02cd4
この記事にトラックバックする(FC2ブログユーザー)