動かないよ。実際に動かせるサンプルはもっと後ろの方。
-- マイナス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;