組み合わせ論理回路によるプログラマブルディレイライン

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;

f:id:ti-nspire:20210415103228j:plain:w500

  • 左が全段を筒抜けにした場合。右が全段にディレイをかけた場合。黄色が入力、緑が出力。
    f:id:ti-nspire:20210415102831p:plain:w450 f:id:ti-nspire:20210415102933p:plain:w450