FC2カウンター FPGAの部屋 ある constant の値で、他の constant の値を切り替える2(VHDL編)
FC2ブログ

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

FPGAの部屋

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

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

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

引き続き、VHDLの達人 hiyuh さんに教えていただいた ある constant値で、他の constant の値を切り替えるの第2段。こちらのほうがエレガントではないそうだ。私もそう思うが、ある理由でこっちを使いたいと思っている。ある constant値が string の場合だ。

constant_test2.vhd を下に示す。達人のVHDLコードを堪能して欲しい。ちなみに、私が加筆させて頂いているが、基本的な流れはそのままだ。

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

entity constant_test2 is
    generic (
        RESOLUTION : string := "VGA"
    );
    port (
        oH_ACTIVE_VIDEO : out std_logic_vector(10 downto 0);
        oV_ACTIVE_VIDEO : out std_logic_vector(10 downto 0)
    );
begin
end entity constant_test2;

architecture RTL of constant_test2 is
    pure function fH_ACTIVE_VIDEO (
        iDUMMY : boolean
    ) return integer is
    begin
           if (RESOLUTION =  "VGA") then return  640;
        elsif (RESOLUTION = "SVGA") then return  800;
        elsif (RESOLUTION =  "XGA") then return 1024;
        elsif (RESOLUTION = "SXGA") then return 1280;
        elsif (RESOLUTION =   "HD") then return 1920;
        else                             return 1920;
        end if;
    end function fH_ACTIVE_VIDEO;
    constant H_ACTIVE_VIDEO : integer := fH_ACTIVE_VIDEO(true);

    pure function fV_ACTIVE_VIDEO (
        iDUMMY : boolean
    ) return integer is
    begin
           if (RESOLUTION =  "VGA") then return  480;
        elsif (RESOLUTION = "SVGA") then return  600;
        elsif (RESOLUTION =  "XGA") then return 768;
        elsif (RESOLUTION = "SXGA") then return 1024;
        elsif (RESOLUTION =   "HD") then return 1080;
        else                             return 1080;
        end if;
    end function fV_ACTIVE_VIDEO;
    constant V_ACTIVE_VIDEO : integer := fV_ACTIVE_VIDEO(true);

begin
    oH_ACTIVE_VIDEO <= std_logic_vector(TO_UNSIGNED(H_ACTIVE_VIDEO, 11));
    oV_ACTIVE_VIDEO <= std_logic_vector(TO_UNSIGNED(V_ACTIVE_VIDEO, 11));
end architecture RTL;


ISE14.7によるインプリメントが成功した。問題無さそう。
const2const_3_140309.png

テストベンチを作ってシミュレーションをしてみた。RESOLUTION は SVGA に設定した。
const2const_4_140309.png

下にテストベンチ constant_test2_tb.vhd を示す。

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_test2_tb IS
END constant_test2_tb;
 
ARCHITECTURE behavior OF constant_test2_tb IS 
 
    -- Component Declaration for the Unit Under Test (UUT)
 
    COMPONENT constant_test2 GENERIC(
        RESOLUTION : string := "VGA"
     );
    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: constant_test2 GENERIC MAP(
      RESOLUTION => "SVGA"
   ) 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;

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

コメント

コメントの投稿


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

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