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

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

FPGAの部屋

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

ZedBoard用CMOSカメラ回路の作製7(バグ発見)

 前回、バグがあって、カメラのデータを表示しないという記事を書いたが、少なくとも1つのバグは見つけたので、記事に書いておく。
それは、M_AXI_AWLEN の保持タイミングが遅れているというバグだ。

AWLENはAWVALIDの立ち上がりで確定している必要がある。(下図参照)
AXI_Protcol_3_111209.png

これをミスってしまっていた。ChipScopeで測定した波形を下に示す。
ZedBoard_Cam_30_130114.png 

上のタイミングチャートでOカーソルが示す位置がバグがあるAXIバスアクセスの開始位置である。awvalid  が 1 になって、AXIバスアクセスが開始される。その時点での awlen は 0 だった。次にクロックで、awlen が 1 となり、本来の値になった。それでも、PSセクションの Processing_System_7 (PS) の S_AXI_HP0 に接続された、DDR3 SDRAMコントローラ(たぶん?)は、awlen が 0 と認知してしまって、Xカーソルの部分で、M_AXI_WREADY を 1 クロックだけ 1 にしてそれで終了してしまっている(たぶん?)。

次に、Verilog HDL ソースを見てみよう。

    -- write_count の処理 (pfifo_rd_data_count は当てにならない。使わないほうが良い)
    pfifo_rd_dcount_dec <= unsigned(pfifo_rd_data_count) - 1;
    process(ACLK) begin
        if ACLK'event and ACLK='1' then
            if reset='1' then
                write_count <= (others => '0');
                awlen <= (others => '0');
            else
                if wrt_wv_cs=idle_wvalid then
                    if pfifo_rd_data_count/=std_logic_vector(to_unsigned(0, 9)) then
                        write_count <= std_logic_vector(pfifo_rd_dcount_dec(7 downto 0));
                        awlen <= std_logic_vector(pfifo_rd_dcount_dec(7 downto 0));
                    end if;
                elsif wrt_wv_cs=wvalid_assert and M_AXI_WREADY='1' and unsigned(write_count)/=0 then
                    write_count <= std_logic_vector(unsigned(write_count) - 1);
                end if;
            end if;
        end if;
    end process;

 if wrt_wv_cs=idle_wvalid then という行があるが、wrt_wv_cs は、Writeデータを扱うステートマシンなので、awlen のタイミングが遅延してしまう。これを awvalid と同期して変化するように Verilog HDL ソースを変更する。(ZedBoard用CMOSカメラ回路の作製2(HDLソースの公開1)を後ほど修正します)
  1. 2013年01月14日 12:35 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0