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

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

FPGAの部屋

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

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

ある constant の値で、他の constant の値を切り替える3(VHDL編2、XPSプロジェクト)”の続き。

前回のやり方で、XPSプロジェクトにカスタムIPを入れるときのAdd IPのダイアログで、解像度を選ぶことが出来るのだが、pure function をビデオのパラメータ分、書くのが面倒で、長い。本文より長くなってしまうこともあるかもしれないので、package にすることを考えた。package にするならば、エレガントな”ある constant の値で、他の constant の値を切り替える1(VHDL編)”を使って、tRESOLUTION を宣言している type宣言部分をinteger としてみた。その、video_timing_pkg.vhd を下に示す。まだテスト用で、同期信号やフロントポーチ、バックポーチなどは設定していない。

package video_timing_pkg is
    subtype RESLUTION_TYPE is integer range 0 to 4;
    type VIDEO_RECORD is record
        H_ACTIVE_VIDEO : integer range 640 to 1920;
        V_ACTIVE_VIDEO: integer range 480 to 1080;
    end record VIDEO_RECORD;
    type VIDEO_RECORD_A is array (RESLUTION_TYPE) of VIDEO_RECORD;
    constant CONST_VIDEO_R : VIDEO_RECORD_A := (
        0 => (H_ACTIVE_VIDEO =>  640, V_ACTIVE_VIDEO =>  480), -- VGA
        1 => (H_ACTIVE_VIDEO =>  800, V_ACTIVE_VIDEO =>  600), -- SVGA
        2 => (H_ACTIVE_VIDEO => 1024, V_ACTIVE_VIDEO =>  768), -- XGA
        3 => (H_ACTIVE_VIDEO => 1280, V_ACTIVE_VIDEO => 1024), -- SXGA
        4 => (H_ACTIVE_VIDEO => 1920, V_ACTIVE_VIDEO => 1080)  -- HD
    );
end package video_timing_pkg;


次に、本体の constant_test3.vhd を下に示す。
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

use work.video_timing_pkg.all;

entity video_timing is
    generic (
        resolution : RESLUTION_TYPE := 1    -- SVGA
    );
    port (
        oH_ACTIVE_VIDEO : out std_logic_vector(10 downto 0);
        oV_ACTIVE_VIDEO : out std_logic_vector(10 downto 0)
    );
begin
end entity video_timing;

architecture RTL of video_timing is
    -- NOTE: Use elab-time constant via generic.
    constant cACTIVE_VIDEO : VIDEO_RECORD := CONST_VIDEO_R(resolution);
    constant H_ACTIVE_VIDEO : integer := cACTIVE_VIDEO.H_ACTIVE_VIDEO;
begin
    -- NOTE: Use run-time parameter via port.
    oH_ACTIVE_VIDEO <= std_logic_vector(TO_UNSIGNED(cACTIVE_VIDEO.H_ACTIVE_VIDEO, 11));
    oV_ACTIVE_VIDEO <= std_logic_vector(TO_UNSIGNED(cACTIVE_VIDEO.V_ACTIVE_VIDEO, 11));
end architecture RTL;


最後に、テストベンチの video_timing_tb.v を下に示す。

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;
 
use work.video_timing_pkg.all;

ENTITY video_timing_tb IS
END video_timing_tb;
 
ARCHITECTURE behavior OF video_timing_tb IS 
 
    -- Component Declaration for the Unit Under Test (UUT)
 
    COMPONENT video_timing
    generic (
      resolution : RESLUTION_TYPE := 1  -- SVGA
    );
 
    PORT(
         oH_ACTIVE_VIDEO : OUT  std_logic_vector(10 downto 0);
         oV_ACTIVE_VIDEO : OUT  std_logic_vector(10 downto 0)
        );
    END COMPONENT;
    

     --Outputs
   signal oH_ACTIVE_VIDEO : std_logic_vector(10 downto 0);
   signal oV_ACTIVE_VIDEO : std_logic_vector(10 downto 0);
   -- No clocks detected in port list. Replace <clock> below with 
   -- appropriate port name 
 
BEGIN
 
    -- Instantiate the Unit Under Test (UUT)
   uut: video_timing generic map (
          resolution => 2   -- 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;


ISE14.7でZynq-7010用にインプリメントしてみたが、問題なかった。
const2const_9_140312.png

シミュレーション波形もXGA解像度になっていて、問題ない。
const2const_10_140312.png
  1. 2014年03月12日 05:30 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0