FC2カウンター FPGAの部屋 2012年04月27日
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

Altium Designer でC to Hardware のサンプルを試してみる2

Altium Designer でC to Hardware のサンプルを試してみる1”の続き。

まずは、C-to-Hardware Compiler User Manual があった。よく書いてあるようだ。

次に、Altium Designer でC to Hardware のサンプルを試してみる1のシミュレーション波形だが、1つの累算が終わってから、次の累算のstart を入れていたが、done しないうちにstart を入れたらどうだろう?と思ってテストベンチを変更してやってみた。
Altium_Designer_C2H_11_120427.png

パイプラインにはなっていないようだ。必ずdone が上がってからstart 信号を入れる必要があるようだ。ちなみに下の波形が前回のシミュレーション波形だ。
Altium_Designer_C2H_10_120426.png

表示メニューからデバイスビューを表示して、FPGAのCompile を開き、Generate HDL for ... のりポートファイルを開く。
Altium_Designer_C2H_12_120427.png

下にリポートファイルを開いた様子を示す。
Altium_Designer_C2H_13_120427.png

リポートファイルに下のような記述があった。引用する。

* Accumulate
============
+------------------------------------------------------------------------------------------------+
| calling convention | parallel multi cycle, entry point, register outputs, start on rising edge |
| states | 4 |
| registers | 64 bits |
| clock cycles | 3 |
| ALU | 32 |
+------------------------------------------------------------------------------------------------+


やはりクロックサイクルは3だそうだ。

・次に、トップの回路図でCモジュール、U_Accumulate をダブルクリックする。
Altium_Designer_C2H_17_120427.png

・C コード シンボル・ダイアログが開く。
Altium_Designer_C2H_14_120427.png

・エントリ・タブをクリックする。インターフェースタイプは現在は、Parallel Multi-cycle になっているが、Parallel Combinatorial なども選択することが出来る。Wishbone のインターフェースでやり取りできるモードもあった。
Altium_Designer_C2H_15_120427.png

・インターフェースタイプをParallel Combinatorialにした。
Altium_Designer_C2H_16_120427.png

・以前の図と比べると、CLOCK、RESET、DONE、RESET_DONE が無くなったことがわかる。
Altium_Designer_C2H_18_120427.png

・コンパイルしたところ、Generate HDL for ...でエラーが出てしまった。
Altium_Designer_C2H_19_120427.png

・上で表示されているエラーをダブルクリックするとCソースに飛んでいった。
Altium_Designer_C2H_20_120427.png

あ、そうか。もしかして?累算しているから順序回路にするしか方法が無いのか。。。組み合わせ回路にするのは諦めることにする。レイテンシを変える方法がまだ見つからない。レイテンシを変えてみたいのだが。。。
もしかして、制約ファイルの動作周波数を変えるとレイテンシが変わるのか?
  1. 2012年04月27日 05:51 |
  2. Altium Designer
  3. | トラックバック:0
  4. | コメント:0