FC2カウンター FPGAの部屋 2014年03月09日
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