FC2カウンター FPGAの部屋 ポートを配列で宣言して下位階層に配線を接続する
FC2ブログ

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

FPGAの部屋

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

ポートを配列で宣言して下位階層に配線を接続する

VHDLでポートを配列で宣言して下位階層に配線を接続する方法を備忘録として書いておく。この場合は、packege を宣言してパッケージに配列の宣言を書いておく。なお、使用ツールはISE13.4だ。

最初の array_test_pack.vhd を示す。

library IEEE;
use IEEE.STD_LOGIC_1164.all;

package array_test_pack is
type define_nn_array is array (16 downto 1) of std_logic_vector(7 downto 0);
type define_sig_out_array is array (3 downto 0) of std_logic_vector(7 downto 0);

end package array_test_pack;


トップファイル、array_test_top.vhd を下に示す。
このパッケージをuse するとdefine_nn_array、define_sig_out_array 宣言を使うことができる。

-- array_test_top.vhd

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

library work;
use work.array_test_pack.all;

entity array_test_top is
    port(
        clk : in std_logic;
        reset : in std_logic;
        sig_out0 : out std_logic_vector(7 downto 0);
        sig_out1 : out std_logic_vector(7 downto 0);
        sig_out2 : out std_logic_vector(7 downto 0);
        sig_out3 : out std_logic_vector(7 downto 0)
    );
end array_test_top;

architecture Behavioral of array_test_top is
signal nn_array : define_nn_array;
signal sig_node : define_sig_out_array;
component array_test
    port (
        nn_array : in define_nn_array;
        sig_out : out define_sig_out_array
    );
end component;
begin
    process(clk) begin
        if clk'event and clk='1' then
            if reset='1' then
                for i in 1 to 16 loop
                    nn_array(i) <= CONV_STD_LOGIC_VECTOR(i,8);
                end loop;
            else
                for i in 1 to 16 loop
                    nn_array(i) <= nn_array(i) + 1;
                end loop;
            end if;
        end if;
    end process;
    
    array_test_inst : array_test port map(
        nn_array => nn_array,
        sig_out => sig_node
    );
    
    sig_out0 <= sig_node(0);
    sig_out1 <= sig_node(1);
    sig_out2 <= sig_node(2);
    sig_out3 <= sig_node(3);
end Behavioral;


下位階層のarray_test.vhd を下に示す。
port に書く信号はパッケージで宣言しておかないとエラーになってしまう。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

library work;
use work.array_test_pack.all;

entity array_test is
    port (
        nn_array : in define_nn_array;
        sig_out : out define_sig_out_array
    );
end array_test;

architecture Behavioral of array_test is

begin
    sig_out(0) <= nn_array(1) + nn_array(2) + nn_array(3) + nn_array(4);
    sig_out(1) <= nn_array(5) + nn_array(6) + nn_array(7) + nn_array(8);
    sig_out(2) <= nn_array(9) + nn_array(10) + nn_array(11) + nn_array(12);
    sig_out(3) <= nn_array(13) + nn_array(14) + nn_array(15) + nn_array(16);

end Behavioral;


最後にトップファイル、array_test_top.vhd のテストベンチ、array_test_top_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 array_test_top_tb IS
END array_test_top_tb;
 
ARCHITECTURE behavior OF array_test_top_tb IS 
 
    -- Component Declaration for the Unit Under Test (UUT)
 
    COMPONENT array_test_top
    PORT(
         clk : IN  std_logic;
         reset : IN  std_logic;
         sig_out0 : OUT  std_logic_vector(7 downto 0);
         sig_out1 : OUT  std_logic_vector(7 downto 0);
         sig_out2 : OUT  std_logic_vector(7 downto 0);
         sig_out3 : OUT  std_logic_vector(7 downto 0)
        );
    END COMPONENT;
    

   --Inputs
   signal clk : std_logic := '0';
   signal reset : std_logic := '0';

     --Outputs
   signal sig_out0 : std_logic_vector(7 downto 0);
   signal sig_out1 : std_logic_vector(7 downto 0);
   signal sig_out2 : std_logic_vector(7 downto 0);
   signal sig_out3 : std_logic_vector(7 downto 0);

   -- Clock period definitions
   constant clk_period : time := 10 ns;
 
BEGIN
 
    -- Instantiate the Unit Under Test (UUT)
   uut: array_test_top PORT MAP (
          clk => clk,
          reset => reset,
          sig_out0 => sig_out0,
          sig_out1 => sig_out1,
          sig_out2 => sig_out2,
          sig_out3 => sig_out3
        );

   -- Clock process definitions
   clk_process :process
   begin
        clk <= '0';
        wait for clk_period/2;
        clk <= '1';
        wait for clk_period/2;
   end process;
 

   -- Stimulus process
   stim_proc: process
   begin        
      -- hold reset state for 100 ns.
        reset <= '1';
      wait for 100 ns;    

      wait for clk_period*10;

      -- insert stimulus here 
        reset <= '0';
      wait;
   end process;

END;


これらのシミュレーション結果を下に示す。
VHDL_array_1_120427.png

なお、バス信号は十進数で表示してある。
  1. 2012年04月27日 17:00 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:2

コメント

VHDLのなにが嫌かというと、このport宣言をあちらこちらに書くことである(^_^;) 都合、三箇所書く(モジュール、モジュールを呼んで接続するため、実際の接続のため)
できることなら書きたくない
自動的に推定して欲しいorz
  1. 2012/05/01(火) 14:48:52 |
  2. URL |
  3. アプロ #-
  4. [ 編集 ]

コピペすれば良いので別に気になりません。それより、下位モジュールのポート幅の情報が編集しているファイルに書いてあるので、私には便利です。Verilogもcomponent宣言文をできることならば、書きたいなと思っています。ファイルは長くなってしまいますが。。。
  1. 2012/05/01(火) 15:22:26 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

コメントの投稿


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

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