FC2カウンター FPGAの部屋 ChipScope ProのVIOを使う2
FC2ブログ

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

FPGAの部屋

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

ChipScope ProのVIOを使う2

ChipScope ProのVIOを使う1”の続き。

今度は、生成したICON, VIO, ILAコアを接続していく。前回のvio_aをクリックして、View HDL Instantiaion Template をダブルクリックすると、component文とインスタンスの例が出るので、それを参考にする。
cs_vio_13_100618.png

こんな感じで接続した。

    vio_icon_inst : vio_icon port map (
        CONTROL0 => CONTROL0,
        CONTROL1 => CONTROL1,
        CONTROL2 => CONTROL2,
        CONTROL3 => CONTROL3,
        CONTROL4 => CONTROL4
    );
    
    vio_a_inst : vio_a port map(
        CONTROL => CONTROL0,
        CLK => mclk,
        SYNC_IN => a_sync_in,
        SYNC_OUT => a_sync_out
    );
    select_sig <= a_sync_out;
    a_sync_in(18 downto 0) <= a_sig0;
    a_sync_in(37 downto 19) <= a_sig1;
    a_sync_in(56 downto 38) <= a_sig2;
    a_sync_in(75 downto 57) <= a_sig3;
    
    vio_h_inst : vio_h port map(
        CONTROL => CONTROL1,
        CLK => mclk,
        SYNC_IN => h_sync_in
    );
    h_sync_in(18 downto 0) <= h_sig0;
    h_sync_in(37 downto 19) <= h_sig1;
    h_sync_in(56 downto 38) <= h_sig2;
    h_sync_in(75 downto 57) <= h_sig3;
    
    vio_v_inst : vio_v port map(
        CONTROL => CONTROL2,
        CLK => mclk,
        SYNC_IN => v_sync_in
    );
    v_sync_in(18 downto 0) <= v_sig0;
    v_sync_in(37 downto 19) <= v_sig1;
    v_sync_in(56 downto 38) <= v_sig2;
    v_sync_in(75 downto 57) <= v_sig3;
    
    vio_d_inst : vio_d port map(
        CONTROL => CONTROL3,
        CLK => mclk,
        SYNC_IN => v_sync_in
    );
    d_sync_in(18 downto 0) <= d_sig0;
    d_sync_in(37 downto 19) <= d_sig1;
    d_sync_in(56 downto 38) <= d_sig2;
    d_sync_in(75 downto 57) <= d_sig3;
    
    vio_ila_inst : vio_ila port map(
        CONTROL => CONTROL4,
        CLK => mclk,
        DATA => ila_data,
        TRIG0 => ila_trig0
    );
    ila_trig0(0) <= cam_vsync_2d_rpulse;
    ila_trig0(1) <= cam_vsync_2d;
    ila_trig0(2) <= cam_href_2d;
    ila_trig0(3) <= master_sync;
    ila_data(18 downto 0) <= a_sig0;
    ila_data(37 downto 19) <= h_sig0;
    ila_data(56 downto 38) <= v_sig0;
    ila_data(75 downto 57) <= d_sig0;
    ila_data(76) <= cam_vsync_2d_rpulse;
    ila_data(77) <= cam_vsync_2d;
    ila_data(78) <= cam_href_2d;
    ila_data(79) <= r_w;
    ila_data(80) <= master_sync;
    ila_data(81) <= mem_uwe;
    ila_data(82) <= mem_lwe;
    ila_data(98 downto 83) <= mem_data_out;


これはトップモジュールだが、その下のモジュールで、select_sig (vio_aのSYNC_OUT), a_sig0, 1, 2, 3 をどう使っているかという例を示す。

    process(clk) begin
        if clk'event and clk='1' then
            if reset='1' then
                a_sig_node0 <= (others => '0');
                a_sig_node1 <= (others => '0');
                a_sig_node2 <= (others => '0');
                a_sig_node3 <= (others => '0');
            else
                if cam_vsync_2d_fpulse='1' then -- cam_vsync_2d の立ち下がりなので、クリア
                    a_sig_node0 <= (others => '0');
                    a_sig_node1 <= (others => '0');
                    a_sig_node2 <= (others => '0');
                    a_sig_node3 <= (others => '0');
                elsif vd_read_line_write_2d='1' and current_line_is_even='0' and sub_count(1 downto 0)="11" then -- 奇数ライン
                    if (select_sig(5 downto 0) & "00")=a_data_th then 
                        a_sig_node0 <= a_sig_node0 + 1;
                    end if;
                    if (select_sig(5 downto 0) & "01")=a_data_th then
                        a_sig_node1 <= a_sig_node1 + 1;
                    end if;
                    if (select_sig(5 downto 0) & "10")=a_data_th then 
                        a_sig_node2 <= a_sig_node2 + 1;
                    end if;
                    if (select_sig(5 downto 0) & "11")=a_data_th then
                        a_sig_node3 <= a_sig_node3 + 1;
                    end if;
                end if;
            end if;
        end if;
    end process;


上の例で、a_sig_node0がa_sig0に接続されている(1フレーム間、値が変動しないように順序回路が入っている)。a_sig1, 2, 3も同様だ。select_sig (vio_aのSYNC_OUT)の値によって、その値のあるデータの1フレームあたりの数をカウントしている。select_sigをVIOコンソールから入力することによって、色々な値の積算値をVIOコンソールの出力で見ることができる。
実際に、ChipScope Analyzerを立ち上げて、VIOコンソールを表示したのが、下の図だ。現在のJTAG Scan Rateは1secにしてある。これは、サンプル間隔で250ms~5secとマニュアルサンプルがある。
cs_vio_14_100629.png

これで、VIOコンソールから、値を入れて、その値に対応するデータをVIOコンソールで見ることができた。
スイッチや表示器が何も無い基板でも、お手軽にデータを収集できるので、とても良いと思う。
  1. 2010年07月02日 05:09 |
  2. Chipscope
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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