VHSIC Hardware Description Language

VHSIC : Very High Speed Integrated Circuit
単なる備忘録その3。
  • 雑多なメモ
    動かないよ。実際に動かせるサンプルはもっと後ろの方。
    -- マイナス2つで始まる行はコメント
    
    LIBRARY ieee;                           -- 使用するライブラリのグループ
    use ieee.std_logic_1164.ALL;            -- 使用するライブラリ
    use ieee.std_logic_arith.all;
    use ieee.std_logic_unsigned.all;
    
    
    
    entity REG IS           -- 外部ピンの定義
        generic (           -- このソース全域に渡る定数の定義
            genBUSWIDTH : integer   := 8;   -- 1行の最後にはセミコロン
            genFOO      : integer   := 8    -- 最後の定義のみセミコロンを付けない
        );
        port(               -- 入出力ピンの定義
            CLK     : in    std_logic;      -- 入力の定義
            RSTn    : in    std_logic;
            SEL     : in    std_logic;
            SHIFT   : in    std_logic;
            INSEL   : in    std_logic;
            DATAIN1 : in    std_logic_vector(genBUSWIDTH-1 downto 0);       -- 入力バスの定義
            --                                             ↑ バスの定義
            DATAIN2 : in    std_logic_vector(genBUSWIDTH-1 downto 0);
            DATAOUT : out   std_logic_vector(genBUSWIDTH-1 downto 0);       -- 出力バスの定義
            INOUT   : inout std_logic       -- 入出力の定義
            -- 最後の定義のみセミコロンを付けない
        );
    end REG;
    
    
    
    architecture REG_behavior of REG is
        -- 内部ピンの定義
        constant    cnstOFbit       : integer := (genBUSWIDTH-1);           -- ローカル定数の定義
        variable    varFOO          : std_logic_vector(cnstOFbit downto 0); -- 信号定義(配線への名前付加)
        signal      REG             : std_logic_vector(cnstOFbit downto 0); -- 信号定義(標準でレジスタになる)
        
        -- ステートマシンのピン定義
        type        STATE is ( IDLE, START, CONT, TERM );
        signal      CURRENT_STATE, NEXT_STATE       : STATE;
        
        -- サブモジュール?の定義。
        -- C言語で言うならば、関数の定義か。
        component CHILDREG      -- 記述は entity と同じ
            generic (
                genBUSWIDTH : integer    := 8
            );
            port (
                CLK         : in    std_logic;
                SELn        : in    std_logic;
                RSTn        : in    std_logic;
                DATA        : in    std_logic_vector(genBUSWIDTH-1 downto 0);
                OUTDATA     : out   std_logic_vector(genBUSWIDTH-1 downto 0)
            );
        end component;
        
    begin           -- ここから回路の実体の記述
        
        -- サブモジュール?の使用の宣言。
        -- C++で言う所の、オブジェクトの生成。
        -- ブレッドボードに 74 をさくさく刺してゆく様な使い方も出来る。
    --  REG0 : CHILDREG     -- ラベル:コンポーネント名称
    --      generic map( genIBLDI_WIDTH )
    --          -- entity にて generic を使用し、architecture をそれに合わせて
    --          -- 書いておくと、この様な再利用の際に、自由に変更が効く。
    --      port map(   CLK => CLK, SELn => CS, RSTn => RSTn,
    --                  DATA => IBLDI, OUTDATA => intDATAinREG );
    --          -- ピンの割当(配線の設定)
        
        
        
        REG: process(CLK, RSTn, SEL)        -- 同期回路の記述
                    -- ↑トリガとなる信号の記述
            -- process begin 〜 end process 内のみ有効の内部ピンの定義
            -- architecture での定義と同様の記述が出来る。
            variable varDATAIN     : std_logic_vector(cnstOFbit downto 0);
        begin
        -- この中身は基本的に、上から順に、処理する回路が生成される。
            
            varDATAIN := (others=>'0');     -- variable への代入は :=
            
            -- いわゆる switch 文
            case SEL is
                when '0'    =>  varDATAIN := DATAIN1;
                when '1'    =>  varDATAIN := DATAIN2;
                when others =>  varDATAIN := DATAIN1;
            end case;
    --      C言語の break にあたる物は無い。
    --      
    --      case の内容がバスの場合は、こうなる
    --      case SEL is
    --          when "00"   =>  varDATAIN := DATAIN1;
    --          when "01"   =>  varDATAIN := DATAIN2;
    --          when "10"   =>  varDATAIN := DATAIN3;
    --          when "11"   =>  varDATAIN := DATAIN4;
    --          when others =>  varDATAIN := DATAIN;
    --      end case;
    --      
    --      ステートマシンはこう書く。
    --      case CURRENT_STATE is
    --      when IDLE => ほえほえ
    --      end case;
            
            -- いわゆる if 文
            if(RSTn = '0')then
                REG <= (others => '0');     -- signal や port への代入は <=
            else
                -- FlipFlop の記述
                if(CLK'event and CLK = '1')then
                -- 'event はエッジトリガの定義になる。
                -- この場合、立ち上がりエッジ。
                    if(SEL = '1')then
                        if(SHIFT = '0')then
                            REG <= varDATAIN;
                        else
                            -- for 文は、同じ回路が複数生成される。
                            -- 消費セル数が爆発する原因ともなる。
                            for I in 0 to (cnstOFbit-1) loop
                                REG(I) <= REG(I+1);
                                -- バスの個別の信号を扱う時はこうする。
                            end loop;
                        end if;
                    else null;
                    -- else の処理内容が無い時は、null を書く。
                    end if;
                else null;
                end if;
            end if;
        end process REG;
        
        -- 非同期回路の記述
        -- この内容は、基本的に、同時に処理する回路が生成される。
        DATAOUT <= REG;
        
    end REG_behavior;
    

  • BUS Register
    実際に動作させる事が可能。
    LIBRARY ieee;
    USE ieee.std_logic_1164.ALL;
    
    
    
    entity REG IS
        generic (
            genBUSWIDTH : integer   := 8    -- BUS Width
        );
        port(               -- pin define
            CLK     : in    std_logic;                                  -- clock
            RSTn    : in    std_logic;                                  -- reset(non-sync.)
            SEL     : in    std_logic;                                  -- chip select
            DATAIN  : in    std_logic_vector(genBUSWIDTH-1 downto 0);   -- input
            DATAOUT : out   std_logic_vector(genBUSWIDTH-1 downto 0)    -- output
        );
    end REG;
    
    
    
    architecture REG_behavior of REG is
        signal  REG :   std_logic_vector(genBUSWIDTH-1 downto 0);
    begin
        
        REG: process(CLK, RSTn, SEL)
        begin
            if(RSTn = '0')then
                REG <= (others => '0');
            else
                if(CLK'event and CLK = '1')then
                    if(SEL = '1')then
                        REG <= DATAIN;
                    else null;
                    end if;
                else null;
                end if;
            end if;
        end process REG;
        
        DATAOUT <= REG;
        
    end REG_behavior;
    

  • Shift register(right-dir)
    LIBRARY ieee;
    USE ieee.std_logic_1164.ALL;
    
    
    
    entity SHR IS
        generic (
            genBUSWIDTH : integer   := 8
        );
        port(
            CLK     : in    std_logic;
            DATA    : inout std_logic_vector(genBUSWIDTH-1 downto 0)
        );
    end SHR;
    
    
    
    architecture SHR_behavior of SHR is
    begin
        process(CLK)
        begin
            if(CLK'event and CLK = '1')then
                for I in 0 to (genBUSWIDTH-2) loop
                    DATA(I) <= DATA(I+1);
                end loop;
                DATA(genBUSWIDTH-1) <= '0';
            else null;
            end if;
        end process;
    end SHR_behavior;
    

  • Last modified on Mon,29 May,2000.
    FENIX HomePage
    G-HAL HomePage
    ハードヱアに関するウダウダ
    Mail to, メールはこちらへ
    Suggestion Box, 投書箱
    BBS, 掲示板 UserName:BBS、Password:BBS
    (C) 1998 G-HAL