FC2カウンター FPGAの部屋 procedureを使うときの注意点
FC2ブログ

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

FPGAの部屋

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

procedureを使うときの注意点

SMMのモデルをVHDLで作っているが、ここ数日間、SMMからWriteするprocedureとSMMからReadするprocedureを作っていた。そんなに日にちがかかるものでもないのだが、エラーが解消できなくて困ってしまった。次にまた同じ問題に悩まないようにブログに書いておく。

さて、procedureは下のようにpackageに宣言してあった。

package SMM_noUART_sim_pack is
    procedure SMM_WR_CYCLE(
        WR_ADDR : in std_logic_vector; -- 書き込みアドレスをセットする
        WR_DATA : in std_logic_vector; -- 書きこむデータをセットする
        WR_BE : in std_logic_vector; -- 書きこむBEをセットする
        
        clk : in std_logic;
        signal rnw : out std_logic;
        signal cs : out std_logic;
        signal addr : out std_logic_vector;
        signal dout : out std_logic_vector;
        signal be : out std_logic_vector
    );
    
    procedure SMM_RD_CYCLE(
        RD_ADDR : in std_logic_vector; -- 読み出しアドレスをセットする
        RD_BE : in std_logic_vector; -- 読み出し時のBEをセットする
        signal RD_DATA : out std_logic_vector; -- 読み出しデータ
        
        clk : in std_logic;
        signal rnw : out std_logic;
        signal cs : out std_logic;
        signal addr : out std_logic_vector;
        din : in std_logic_vector;
        signal be : out std_logic_vector
    );
end SMM_noUART_sim_pack;


いつも、入力はsignal宣言を書かずに、出力だけsignal宣言を書いてある。これは、”HDL設計入門 VHDL階層構造とサブプログラム”によると、すべての信号をsignal宣言すると並列プロシージャとなって、入力信号が変化すると自動的に出力値が変化するそうだ。これは結局、入力信号をすべてセンシティビティ・リストに入れたprocess文と同じと考えることができると思う。
私が使うとしているのは、順次プロシージャなのだが、out信号はsignal宣言をしている。今回も入力のclkはsignal宣言をしていなかった。
下にpackage body を示す。ここでは、wait untilでclkの立ち上がりを待つ記述を使用している。

package body SMM_noUART_sim_pack is
    procedure SMM_WR_CYCLE(
        WR_ADDR : in std_logic_vector; -- 書き込みアドレスをセットする
        WR_DATA : in std_logic_vector; -- 書きこむデータをセットする
        WR_BE : in std_logic_vector; -- 書きこむBEをセットする
        
        clk : in std_logic;
        signal rnw : out std_logic;
        signal cs : out std_logic;
        signal addr : out std_logic_vector;
        signal dout : out std_logic_vector;
        signal be : out std_logic_vector
    ) is
    begin
        wait until clk'event and clk='1'; -- clkの立ち上がりまでwait
        wait for 1 ns; -- 遅延を挟んで
        rnw <= '0'; -- Write
        cs <= '1'; -- enable
        addr <= WR_ADDR;
        dout <= WR_DATA;
        be <= WR_BE;
        
        wait until clk'event and clk='1'; -- clkの立ち上がりまでwait
        wait for 1 ns; -- 遅延を挟んで
        cs <= '0';
    end SMM_WR_CYCLE;
    
    procedure SMM_RD_CYCLE(
        RD_ADDR : in std_logic_vector; -- 読み出しアドレスをセットする
        RD_BE : in std_logic_vector; -- 読み出し時のBEをセットする
        signal RD_DATA : out std_logic_vector; -- 読み出しデータ
        
        clk : in std_logic;
        signal rnw : out std_logic;
        signal cs : out std_logic;
        signal addr : out std_logic_vector;
        din : in std_logic_vector;
        signal be : out std_logic_vector
    ) is
    begin
        wait until clk'event and clk='1'; -- clkの立ち上がりまでwait
        wait for 1 ns; -- 遅延を挟んで
        rnw <= '1'; -- Read
        cs <= '1'; -- enable
        addr <= RD_ADDR;
        be <= RD_BE;
        
        wait until clk'event and clk='1'; -- clkの立ち上がりまでwait
        RD_DATA <= din;
        wait for 1 ns; -- 遅延を挟んで
        cs <= '0';
    end SMM_RD_CYCLE;
end SMM_noUART_sim_pack;


これでISimでコンパイルすると、下のようにエラーが出てしまう。

ERROR:HDLCompiler:989 - "H:/HDL/FndtnISEWork/Simple_MicroBlaze_xapp1141/SMM_Ref/S3A_LCD_Ref/Work/ise/../src/Simulation/SMM_noUART_sim_pack.vhd" Line 48: Attribute event requires a static signal prefix
ERROR:HDLCompiler:989 - "H:/HDL/FndtnISEWork/Simple_MicroBlaze_xapp1141/SMM_Ref/S3A_LCD_Ref/Work/ise/../src/Simulation/SMM_noUART_sim_pack.vhd" Line 56: Attribute event requires a static signal prefix
ERROR:HDLCompiler:989 - "H:/HDL/FndtnISEWork/Simple_MicroBlaze_xapp1141/SMM_Ref/S3A_LCD_Ref/Work/ise/../src/Simulation/SMM_noUART_sim_pack.vhd" Line 74: Attribute event requires a static signal prefix
ERROR:HDLCompiler:989 - "H:/HDL/FndtnISEWork/Simple_MicroBlaze_xapp1141/SMM_Ref/S3A_LCD_Ref/Work/ise/../src/Simulation/SMM_noUART_sim_pack.vhd" Line 81: Attribute event requires a static signal prefix
ERROR:HDLCompiler:854 - "H:/HDL/FndtnISEWork/Simple_MicroBlaze_xapp1141/SMM_Ref/S3A_LCD_Ref/Work/ise/../src/Simulation/SMM_noUART_sim_pack.vhd" Line 34: Unit ignored due to previous errors.


なんだろう?と思って悩んでいたが、ModelSimでコンパイルしてみて、eventが”wait until clk'event and clk='1';”の所のeventだということにやっと気がついた。
clk : in std_logic;

signal clk : in std_logic;
にして、やっとエラーが消えた。

ブログに書いたprocedureを調べてみたら、”VHDLでOVLアサーションを使用する3(VHDLからVerilog OVLを使用する)”で、” wait until clk'event and clk='1';”を使ったprocedureを使っていて、clkの宣言もちゃんと”signal clk : in std_logic;”としてあった。進歩がない。。。退歩している。。。頭に刻みつけようと思う。

  1. 2010年12月01日 05:44 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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