FC2カウンター FPGAの部屋 2007年09月07日
FC2ブログ

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

FPGAの部屋

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

ブロック文

VHDLの本を読んでいたら、便利に使えそうなブロック文を見つけた。
いままで、1つのVHDLファイルに2つ以上のステートマシンを記述する際には、ステート名を変えていた。例えば下のように。

type STATE is (idle, active, holdoff);
type STATE2 is (idle2, active2);


block文を使うと、block文の中はカプセル化されて、type宣言もローカルになるので、同じVHDLファイルの違うステートマシンのステートに同じ名前のステートや、同じ名前のsignalを宣言できるはずだ。
ちょっとやってみることにした。1つのVHDLファイルの中に、block文を使って、2つのステートマシンを記述してみた。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity block_check is
    Port ( reset : in  STD_LOGIC;
           clk : in  STD_LOGIC;
           in_sig1 : in  STD_LOGIC;
           in_sig2 : in  STD_LOGIC;
           pulse : out  STD_LOGIC;
           active_sig : out  STD_LOGIC);
end block_check;

architecture RTL of block_check is
begin
    STATE_MACHINE1 : block
        type STATE is (idle, active, holdoff);
        signal c_state, n_state : STATE;
    begin
        process(reset, clk) begin
            if reset='1' then
                c_state <= idle;
            elsif clk'event and clk='1' then
                c_state <= n_state;
            end if;
        end process;
        process(c_state, in_sig1) begin
            case c_state is
                when idle =>
                    pulse <= '0';
                    if in_sig1='1' then
                        n_state <= active;
                    else
                        n_state <= idle;
                    end if;
                when active =>
                    pulse <= '1';
                    n_state <= holdoff;
                when holdoff =>
                    pulse <= '0';
                    if in_sig1='0' then
                        n_state <= idle;
                    else 
                        n_state <= holdoff;
                    end if;
            end case;
        end process;
    end block STATE_MACHINE1;
    
    STATE_MACHINE2 : block
        type STATE is (idle, active);
        signal c_state, n_state : STATE;
    begin
        process(reset, clk) begin
            if reset='1' then
                c_state <= idle;
            elsif clk'event and clk='1' then
                c_state <= n_state;
            end if;
        end process;
        process(c_state, in_sig2) begin
            case c_state is
                when idle =>
                    active_sig <= '0';
                    if in_sig2='1' then
                        n_state <= active;
                    else
                        n_state <= idle;
                    end if;
                when active =>
                    active_sig <= '1';
                    if in_sig2='1' then
                        n_state <= idle;
                    else
                        n_state <= active;
                    end if;
            end case;
        end process;
    end block STATE_MACHINE2;

end RTL;


最初のブロックはin_sig1が1になったときにpulseを1クロックだけ1にするためのステートマシン。次はin_sig2が1の時にactive_sigが1,0を繰り返すためのステートマシン。
2つともblock文の中で、同じidle, activeステートを使っているが、論理合成してもエラーが出ていない。今度から、こういう方式でも書けそうだ。
block_check_070907.png


block文でカプセル化するのも良いのだが、signalごとにスコープされたtypeが使えると一番良いのだが。。。
  1. 2007年09月07日 05:22 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:8