Sim's blog

電子工作はじめてみました

ROMの推論

2008-12-03 01:36:20 | FPGA
XilinxのISEは、HDLのパターンを見て、専用ハードウェアを推論する機能があります。例えば、レジスタ出力のRAMのパターンを見つけるとブロックRAMにしてくれたりします。
ISE自体は外部のプログラムを使って、FPGAの論理合成や配置配線を行うのですが、推論機構はXSTというプログラムで実装されているようです。それというのも「XSTユーザーガイド」(xst.pdf)というドキュメントに、パターンはこういうふうに書けという情報が載っているからです(2章)。

XSTユーザーガイドの10.1のp.247から「ブロックRAMリソースを使用したROMのHDLコーディング手法」がはじまっています。p.251を見ると、次のように書くとROMとしてブロックRAMを推論してくれるように書いてあります。
module rom(
    input clk, en,
    input [8:0] adr,
    output reg [11:0] out);

    always @(posedge clk)
        if(en)
            case (adr)
            9'h00 : out <= 12'hA12;
            9'h01 : out <= 12'hC08;
            9'h02 : out <= 12'h006;
            9'h03 : out <= 12'hCC7;
            9'h04 : out <= 12'h002;
            9'h05 : out <= 12'h066;
            9'h06 : out <= 12'h069;
            9'h07 : out <= 12'h800;
            9'h08 : out <= 12'hC0D;
            9'h09 : out <= 12'h028;
            9'h0A : out <= 12'hC01;
            9'h0B : out <= 12'h021;
            9'h0C : out <= 12'h201;
            9'h0D : out <= 12'h743;
            9'h0E : out <= 12'hA0C;
            9'h0F : out <= 12'h2E8;
            9'h10 : out <= 12'hA0A;
            9'h11 : out <= 12'h800;
            9'h12 : out <= 12'h901;
            9'h13 : out <= 12'h249;
            9'h14 : out <= 12'h026;
            9'h15 : out <= 12'h908;
            9'h16 : out <= 12'h666;
            9'h17 : out <= 12'hA1A;
            9'h18 : out <= 12'h289;
            9'h19 : out <= 12'hA1B;
            9'h1A : out <= 12'h0C9;
            9'h1B : out <= 12'hE07;
            9'h1C : out <= 12'h029;
            9'h1D : out <= 12'hA13;
            default : out <= 12'hfff;
            endcase
endmodule

(この例の元はトラ技12月号のROMの記述を改造したものです。)

このモジュール単体だと、ブロックRAMを推論してくれるのですが、他のモジュールとまぜるとなぜかブロックRAMになってくれません。

xst.pdfを見ていると、強制的にブロックRAMを推論させる方法がありました(p.436)。1行目(moduleの前の行)に以下を書いてやります。
(* rom_style = "block" *)

enはなくてもいいみたいでした。

xst.pdfですが、日本語版もあります。ISEを最新版にupdateすると、インストールしたディレクトリの中にいます。私の環境では次のディレクトリにいました。

c:¥Xilinx¥10.1¥ISE¥doc¥japanese¥books¥docs¥xst
(¥は全角になってます)

バージョンがかわったりすると、推論機能も変わったりするので注意が必要です。心配なときは、推論に頼らない記述にしたほうがいいみたいです。ただし、推論に頼らないときは、Xilinxべったりの記述になってしまうので、Alteraにもっていきたいときとかに困ってしまいます。へたをすると、同じXilinx同士でも移植できないことがあります(VirtexのDSP48とか)。悩ましいところですね。

参考、以前書いた「core generatorでROMを作る

最新の画像もっと見る

コメントを投稿