pp.268-270
notゲート2個で1段ぶんのディレイを生成する。精密に時間が制御できるわけではない。
まずテキストどおりにサブ回路にしておく。
library ieee; use ieee.std_logic_1164.all; entity delay_block is generic( BLOCK_LENGTH: natural -- not+notのペア数 ); port( din : in std_logic; sel : in std_logic; dout: out std_logic ); end entity; architecture rtl of delay_block is -- 個々のnotゲート前後の信号名 signal node_vector: std_logic_vector(0 to 2*BLOCK_LENGTH); -- attribute 属性名: 属性タイプ; で属性を宣言して、 -- attribute 属性名 of エンティティ名: エンティティクラス is 式; で属性を割り当てる。 attribute keep: boolean; attribute keep of node_vector: signal is true; begin node_vector(0) <= din; -- not+notペアをBLOCK_LENGTHペアだけ直列につなぐ。 gen: for i in 1 to 2*BLOCK_LENGTH generate node_vector(i) <= not node_vector(i-1); end generate; -- 最後のnode_vector信号を出力するか筒抜けにするかする。 dout <= node_vector(2*BLOCK_LENGTH) when sel else din; end architecture;
トップvhd
library ieee; use ieee.std_logic_1164.all; entity delay_line_2 is generic( NUM_BLOCKS: natural := 8 ); port( din : in std_logic; sel : in std_logic_vector(NUM_BLOCKS-1 downto 0); dout: out std_logic ); end entity; architecture rtl of delay_line_2 is signal node_vector: std_logic_vector(0 to NUM_BLOCKS); attribute keep: boolean; attribute keep of node_vector: signal is true; begin node_vector(0) <= din; gen: for i in 1 to NUM_BLOCKS generate -- ラベル: entity work.エンティティ名 generic map(ジェネリック関連づけリスト) port map (ポート関連づけリスト) block_i: entity work.delay_block generic map(2**(i-1)) port map(node_vector(i-1), sel(i-1), node_vector(i)); end generate; dout <= node_vector(NUM_BLOCKS); end architecture;
- 左が全段を筒抜けにした場合。右が全段にディレイをかけた場合。黄色が入力、緑が出力。