FC2カウンター FPGAの部屋 2010年01月04日
FC2ブログ

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

FPGAの部屋

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

ISE11.4のXSTとModelSimの差異

今、VHDLコードを書いていて奇妙な現象に遭遇した。ModelSimのシミュレーションでは、問題なく動作しているように見受けられるが、実機が動作しなかった。なぜだろうとかなり調べていたら、XSTとModelSimの解釈が違っているところが見受けられるようだ。
まずは、ソースコードの一部を示す。

library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

...

constant THRESHOLD_LEVEL : integer := 6; -- 符号化する数値の下限

attribute keep : string;
attribute keep of h_data_th : signal is "TRUE";
attribute keep of h_data_9bits : signal is "TRUE";
begin


...

    h_data_9bits <= ('0'&bram_rd_data) - ('0'&bram_data_1d);
    v_data_9bits <= ('0'&ydata_1d) - ('0'&bram_data_1d);
    d_data_9bits <= ('0'&cam_ydata_2d) - ('0'&bram_data_1d);

...

    -- スレッショルド処理を行ったh, v, d データ
    th_level_9bit <= CONV_STD_LOGIC_VECTOR(THRESHOLD_LEVEL, 9);
    -- th_level_9bit_mi <= not(th_level_9bit-1);
    th_level_9bit_mi <= not(th_level_9bit)+1;
    h_data_th<=(others => '0') when signed(h_data_9bits)>signed(th_level_9bit_mi) and signed(h_data_9bits)<signed(th_level_9bit) else h_data_9bits;
    v_data_th<=(others => '0') when signed(v_data_9bits)>signed(th_level_9bit_mi) and signed(v_data_9bits)<signed(th_level_9bit) else v_data_9bits;
    d_data_th<=(others => '0') when signed(d_data_9bits)>signed(th_level_9bit_mi) and signed(d_data_9bits)<signed(th_level_9bit) else d_data_9bits;


結局は、小さい値を0に丸める回路を生成しようとしている。その場合のth_level_9bit_mi が問題となった。上のVHDLコードでModelSimではエラーやウォーニングなしにコンパイルが通って、シミュレーションでも正しい値が出ていた。
ISE_vs_ModelSim_1_100104.png

(注:h_data_9bits とh_data_thに 注目すると、h_data_9bits の002 がh_data_th では000 に丸められている)
ISE11.4での結果がおかしいので、ChipScopeを入れて監視しようとすると、h_data_th をKeepしていたはずが、信号がなくなってh_data_th_mi だけになってしまった。(h_data_th_mi <= not (h_data_th-1);、ちなみにどちらも2の補数表示の同じ絶対値のマイナスの数を計算する式)
ChipScope Analyzer の結果を見ると、全く丸めていない。
ISE_vs_ModelSim_2_100104.png

おかしいので、XSTのレポートを見ると、データ幅がちがうというウォーニングが出ていた。

WARNING Xst:1610 - "C:/HDL/FndISEWork/DWM2008_07/CamDispCntrl_SRAM_MPWavelet_inv/Sources/Camera_Controller.vhd" line 876: Width mismatch. has a width of 9 bits but assigned expression is 10-bit wide.


9ビットの予定なのに10ビットだそうだ。おかしい?
上のVHDLコードの代わりにコメントアウトされている

th_level_9bit_mi <= not(th_level_9bit-1);


に変更したら、XSTのウォーニングもなくなって正常動作するようになった。ChipScope Analyzer の表示画面を示す。今度は、正常にh_data_th がプローブできた。
ISE_vs_ModelSim_3_100104.png

何がおかしいのか分からないが、XSTでは、少なくとも9ビットのデータをnot して、+1 するとビット幅が増えてしまうことがあるようだ。注意する必要がありそうだ。
  1. 2010年01月04日 15:13 |
  2. FPGAのトラブル
  3. | トラックバック:0
  4. | コメント:2