FC2カウンター FPGAの部屋 2014年03月08日
FC2ブログ

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

FPGAの部屋

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

映画『ホビット 竜に奪われた王国』を見てきました

今日、高校受験が終わった下の娘と奥さんと私で、映画『ホビット 竜に奪われた王国』を見てきました。凄い迫力ですね。見応えがありましたが、残酷なシーンがあるので、娘と奥さんはあまり好きじゃないそうです。またまた、いいところで終わったので、次が楽しみですが、映画なのにドラマのような終わり方ですね。。。
  1. 2014年03月08日 21:58 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ある constant の値で、他の constant の値を切り替える1(VHDL編)

関連するブログ。”ある parameter の値で、他の parameter の値を切り替える(Verilog編)

Verilog HDLは、前回やり方が分かったが、VHDLのやり方が分からなかった。ツィッターでつぶやいたら、VHDLの達人の hiyuh さんが教えてくれた。いつもありがとうございます~。その内のエレガント方のやり方から紹介させて頂こうと思います。

VHDLコードの説明は無いですが、コードを読んでもらえばわかると思います。constant_test.vhd を下に示します。

package ee_pkg is
    type tRESOLUTION is (
         VGA,
        SVGA,
         XGA,
        SXGA,
          HD
    );
    subtype tH_ACTIVE_VIDEO is integer range 640 to 1920;
    type tH_ACTIVE_VIDEO_R is array (tRESOLUTION) of tH_ACTIVE_VIDEO;
    constant cH_ACTIVE_VIDEO_R : tH_ACTIVE_VIDEO_R := (
         VGA =>  640,
        SVGA =>  800,
         XGA => 1024,
        SXGA => 1280,
          HD => 1920
    );
    subtype tV_ACTIVE_VIDEO is integer range 480 to 1080;
    type tV_ACTIVE_VIDEO_R is array (tRESOLUTION) of tV_ACTIVE_VIDEO;
    constant cV_ACTIVE_VIDEO_R : tV_ACTIVE_VIDEO_R := (
         VGA =>  480,
        SVGA =>  600,
         XGA => 768,
        SXGA => 1024,
          HD => 1080        
    );
end package ee_pkg;

use work.ee_pkg.all;

entity ee is
    generic (
        RESOLUTION : tRESOLUTION := XGA
    );
    port (
        oH_ACTIVE_VIDEO : out integer;
        oV_ACTIVE_VIDEO : out integer
    );
begin
end entity ee;

architecture a of ee is
    -- NOTE: Use elab-time constant via generic.
    constant cH_ACTIVE_VIDEO : integer := cH_ACTIVE_VIDEO_R(RESOLUTION);
    constant cV_ACTIVE_VIDEO : integer := cV_ACTIVE_VIDEO_R(RESOLUTION);
begin
    -- NOTE: Use run-time parameter via port.
    oH_ACTIVE_VIDEO <= cH_ACTIVE_VIDEO;
    oV_ACTIVE_VIDEO <= cV_ACTIVE_VIDEO;
end architecture a;


ISE14.7を使用して、Zynq-7010でインプリメント出来るかどうか、確かめてみたところ問題なくインプリメント出来ました。
const2const_1_140308.png

シミュレーションもしてみました。シミュレーション波形を下に示しめす。
const2const_2_140308.png

XGA解像度の1行は1024ピクセル、つまり、2進数で表すと、”10000000000”で、XGA解像度の行数は768行で、2進数で表すと”1100000000”になります。正常に設定できているようです。

テストベンチも下に示します。

package ee_pkg is
    type tRESOLUTION is (
         VGA,
        SVGA,
         XGA,
        SXGA,
          HD
    );
    subtype tH_ACTIVE_VIDEO is integer range 640 to 1920;
    type tH_ACTIVE_VIDEO_R is array (tRESOLUTION) of tH_ACTIVE_VIDEO;
    constant cH_ACTIVE_VIDEO_R : tH_ACTIVE_VIDEO_R := (
         VGA =>  640,
        SVGA =>  800,
         XGA => 1024,
        SXGA => 1280,
          HD => 1920
    );
    subtype tV_ACTIVE_VIDEO is integer range 480 to 1080;
    type tV_ACTIVE_VIDEO_R is array (tRESOLUTION) of tV_ACTIVE_VIDEO;
    constant cV_ACTIVE_VIDEO_R : tV_ACTIVE_VIDEO_R := (
         VGA =>  480,
        SVGA =>  600,
         XGA => 768,
        SXGA => 1024,
          HD => 1080        
    );
end package ee_pkg;

use work.ee_pkg.all;

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
 
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;
 
ENTITY constant_test_tb IS
END constant_test_tb;
 
ARCHITECTURE behavior OF constant_test_tb IS 
 
    -- Component Declaration for the Unit Under Test (UUT)
 
    COMPONENT ee
        generic (
            RESOLUTION : tRESOLUTION
        );
        port (
            oH_ACTIVE_VIDEO : out integer;
            oV_ACTIVE_VIDEO : out integer
        );
    END COMPONENT;
    

     --Outputs
   signal oH_ACTIVE_VIDEO : integer;
   signal oV_ACTIVE_VIDEO : integer;
   -- No clocks detected in port list. Replace <clock> below with 
   -- appropriate port name 
 
BEGIN
 
    -- Instantiate the Unit Under Test (UUT)
   uut: ee generic map(
        RESOLUTION => XGA
    ) PORT MAP (
          oH_ACTIVE_VIDEO => oH_ACTIVE_VIDEO,
          oV_ACTIVE_VIDEO => oV_ACTIVE_VIDEO
   );

   -- Stimulus process
   stim_proc: process
   begin        
      -- hold reset state for 100 ns.
      wait for 100 ns;    

      -- insert stimulus here 

      wait;
   end process;

END;


これで、VHDLでもVGAと入れれば適切な画像パラメータを設定することが出来るはずだ。

(2014/03/09:追加)
hiyuh さんが record(忘れてました。。。)を使ったVHDLコードを教えてくれたので、貼っておきます。

package ee_pkg is
    type tRESOLUTION is (
         VGA,
        SVGA,
         XGA,
        SXGA,
          HD
    );
    type tACTIVE_VIDEO is record
        H : integer range 640 to 1920;
        V : integer range 480 to 1080;
    end record tACTIVE_VIDEO;
    type tACTIVE_VIDEO_R is array (tRESOLUTION) of tACTIVE_VIDEO;
    constant cACTIVE_VIDEO_R : tACTIVE_VIDEO_R := (
         VGA => (H =>  640, V =>  480),
        SVGA => (H =>  800, V =>  600),
         XGA => (H => 1024, V =>  768),
        SXGA => (H => 1280, V => 1024),
          HD => (H => 1920, V => 1080)
    );
end package ee_pkg;

use work.ee_pkg.all;

entity ee is
    generic (
        RESOLUTION : tRESOLUTION := XGA
    );
    port (
        iRESOLUTION   : in  tRESOLUTION;
        oACTIVE_VIDEO : out tACTIVE_VIDEO
    );
begin
end entity ee;

architecture a of ee is
    -- NOTE: Use elab-time constant via generic.
    constant cACTIVE_VIDEO : tACTIVE_VIDEO := cACTIVE_VIDEO_R(RESOLUTION);
begin
    -- NOTE: Use run-time parameter via port.
    oACTIVE_VIDEO <= cACTIVE_VIDEO_R(iRESOLUTION);
end architecture a;

  1. 2014年03月08日 21:31 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0

ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IP3(SVGA以外の解像度)

”ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IP2(完成)”の続き。

前回はSVGAでHDMIポート、VGAポートとも表示に成功した。今回は、VGAとXGA、SXGA解像度で表示できるかどうかを確かめてみた。
結果として、VGA解像度では、HDMIポート、VGAポート両方共表示することが出来たが、XGA、SXGA解像度では、VGAポートは問題なく表示することが出来たが、HDMIポートは表示はできているのだが、動作が不安定だった。表示はされているが、ぱっと消える時がある。これは周期的に消える。
いろいろとできることをやってみたが、うまく行かなかった。

最初にVGA解像度の画面を示す。
ZYBO_CDC_AXI_slave_15_140308.jpg

XGA解像度の画面を示す。
ZYBO_CDC_AXI_slave_14_140308.jpg

SXGA解像度の画面を示す。
ZYBO_CDC_AXI_slave_16_140308.jpg

XGA解像度のHDMIの出力周波数は650MHz, SXGA解像度のHDMIの出力周波数は1080MHzなので、使用しているグローバル・クロックバッファの最大周波数の 625MHz (-1C) を両方共超えているので、仕方が無いかな?とは思う。
下に、”Zynq-7000 All Programmable SoC (Z-7030、 Z-7045、 Z-7100) : DC 特性および AC スイッチ特性 DS191 (v1.7) 2013 年 11 月 26 日”の57ページの表68を引用する。
ZYBO_CDC_AXI_slave_17_140308.png

(2014/04/28:追記)
OSERDESE2 をDDRモードで動作させているので、HDMIクロックはピクセルクロックの10倍でなく5倍になるはず。SXGAでは、1080MHzではなく 540MHz だった。BUFGではなく、BUFIOとBUFR(5分周)が良いようだ。”ZYBO Base System Design”参照。
  1. 2014年03月08日 07:32 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0