FC2カウンター FPGAの部屋 VHDLで32ビット以上のカウンタの生成
FC2ブログ

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

FPGAの部屋

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

VHDLで32ビット以上のカウンタの生成

巷でVHDLで32ビット以上のカウンタの動作がどうなるか?と話題になっている。私もライブラリを読んでみたところどうなるのか非常に興味があったので、ISE9.2.03i と ModelSim SE 6.1eでやってみた。
まずはコードを下に示す。

-- library ieee;
-- use ieee.std_logic_1164.all;
-- use ieee.std_logic_unsigned.all;
-- use ieee.std_logic_arith.all;

-- package my_package is
    -- type LONG is range -9223372036854775807 to 9223372036854775807;
    -- subtype NATURAL_LONG is LONG range 0 to LONG'HIGH;
    -- type UNSIGNED_LONG is array (NATURAL_LONG range <>) of STD_LOGIC;
    -- function "+"(L:STD_LOGIC_VECTOR; R: LONG) return STD_LOGIC_VECTOR;
-- end my_package;

-- package body my_package;
    -- function "+"(L: STD_LOGIC_VECTOR; R: LONG) return STD_LOGIC_VECTOR is
--        pragma label_applies_to plus
        -- variable result  : STD_LOGIC_VECTOR (L'range);
    -- begin
        -- result  := UNSIGNED_LONG(L) + R;-- pragma label plus
        -- return   std_logic_vector(result);
    -- end;
-- end my_package;

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
-- library work;
-- use work.my_package.all;

entity long_test is
    port(
        clk : in std_logic;
        reset : in std_logic;
        long_out : out std_logic_vector(63 downto 0)
    );
end long_test;

architecture RTL of long_test is
   signal a, b : std_logic_vector(63 downto 0);
begin
    -- a(63 downto 32) <= (others => '0');
    -- a(31 downto 0) <= (others => '1');
    -- b(63 downto 32) <= (others => '0');
    -- b(31 downto 0) <= (others => '1');
    
    process(clk, reset) begin
        if reset='1' then
            a <= "0000000000000000000000000000000011111111111111111111111111111110";
        elsif clk'event and clk='1' then
--            a <= a + "0000000000000000000000000000000000000000000000000000000000000001";
            a <= a + 1;
        end if;
        long_out <= a;
    end process;
end RTL;


上の方のコメントはinteger ではなく longを宣言してみようとした残骸だ。
ModelSimでコンパイルしたら最初にLONGの値の範囲がinteger'high に入っていないと言われてエラーになってしまい、諦めた。
a を reset のときに0x00000000FFFFFFFE を入れて、そのカウントアップ、32ビット目にカウントアップするかどうかをチェックした。足し算の方法としては、STD_LOGIC_VECTOR <= STD_LOGIC_VECTOR + STD_LOGIC_VECTOR と STD_LOGIC_VECTOR <= STD_LOGIC_VECTOR + INTEGER でやってみた。結論から言うとModelSimではどちらも32ビット目に桁上げされた。
VHDL_64bit_counter_1_080605.png

次にa の記述をSTD_LOGIC_VECTOR <= STD_LOGIC_VECTOR + STD_LOGIC_VECTOR に変更してインプリメントしてみた。XSTのスケマではよくわからなかったので、PARしてFPGA Editorで見てみたら、31ビット目から32ビット目のカウンタにキャリーチェーンが来ていて、カウンタとして動作しそうだった。
VHDL_64bit_counter_2_080605.png

そこで、Post-Place & Route のシミュレーションをやってみた。その結果が下。
VHDL_64bit_counter_3_080605.png

多少不定の時間はあるようだが問題ないようだ。
次に33ビット目に桁上げするかどうかも確かめてみたが、これも Behavioral と Post-Route シミュレーションで確かめてみたが問題ないようだ。

よって、64ビットカウンタは動作するのではないか?と思う。(実際に実物ではやっていないが。。。)
ちなみに、タイミング制約は、なしでやってみている。
  1. 2008年06月05日 12:40 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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