2014-10-22 3 views
1

Я ищу правильный синтаксис для создания общего пакета задержки линии с использованием дженериков и циклов в процессе. Я понимаю, что для циклов, когда они используются с generate, используются для параллельных операторов, но, безусловно, должен быть способ его создания.Создание общего пакета задержки в VHDL

Например:

entity Delay_Line is 
    Generic (
     CLK_DELAYS : integer := 10); 
    Port ( 
     CLK : in STD_LOGIC; 
     i_Din : in STD_LOGIC; 
     o_Q : out STD_LOGIC; 
     o_Qnot : out STD_LOGIC); 
    end Delay_Line; 

architecture Delay_Line_arch of Delay_Line is 

    signal din_dly : std_logic_vector(CLK_DELAYS-1 downto 0); 
begin 
    din_dly(0) <= i_Din; 

    process(CLK) 
    begin 
     if rising_edge(CLK) then 
      for index in 0 to CLK_DELAYS-1 generate 
      begin 
       din_dly(index+1) <= din_dly(index); 
      end; 
     end if; 
    end process; 
    o_Q  <= din_dly(CLK_DELAYS); 
    o_Qnot  <= NOT (din_dly(CLK_DELAYS)); 

end Delay_Line_arch; 

Как правило, я бы просто добавить кучу:

din_delay(9) <= din_delay(8); 
din_delay(8) <= din_delay(7); 
... 

в коде, но, честно говоря, я хотел бы кое-что немного больше многоразовый как пакет.

+0

Это не ясно, что вы хотите, что отличается от того, что вы опубликовали. При этом ваш текущий код имеет 1 или 2 ошибки (о ком ваш компилятор расскажет) –

ответ

2

Нет необходимости использовать такие сложные методы для создания сдвиговых регистров. Вы можете реализовать их непосредственно в одной строке, используя конкатенацию массивов и нарезку.

constant DELAY_STAGES : positive := 10; -- Or use a generic parameter 

signal delay_line : std_logic_vector(1 to DELAY_STAGES); 
... 

process(clk) is 
begin 
    if rising_edge(clk) then 
    delay_line <= i_Din & delay_line(1 to DELAY_STAGES-1); -- Shift right 
    end if; 
end process; 

-- Retrieve the end of the delay without a hard-coded index 
o_Q <= delay_line(delay_line'high); 

Краткость этого подхода в значительной степени исключает удобство наличия компонента, который необходимо создать экземпляр с портом и общими картами. Кроме того, у вас есть гибкость в возможности использовать любые промежуточные сигналы, которые могут вам понадобиться.

+0

Конкатенация! Конечно, я должен был подумать об этом! Большое спасибо @ Кевин Тибедо – Peter

0

Немного поздно, но это мой generic_delay компонент:

LIBRARY ieee; 
USE ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 
use IEEE.STD_LOGIC_ARITH.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL; 

ENTITY generic_delay is 
    generic (
    bus_size : natural; 
    delay  : natural 
    ); 
    port (
    i_Clock : IN STD_LOGIC; 
    i_reset : IN STD_LOGIC; 
    i_bus1 : in std_logic_vector(bus_size - 1 downto 0); 
    i_bus2 : in std_logic_vector(bus_size - 1 downto 0); 
    o_bus1 : out std_logic_vector(bus_size - 1 downto 0); 
    o_bus2 : out std_logic_vector(bus_size - 1 downto 0) 
    ); 
end generic_delay; 


architecture a of generic_delay is 

---------------------------- 
-- SIGNALS DECLARATION 
---------------------------- 
    signal temp_bus1 : std_logic_vector(delay*bus_size - 1 downto 0); 
    signal temp_bus2 : std_logic_vector(delay*bus_size - 1 downto 0); 

BEGIN 

----------------------------------------- 
-- SYNCHRONOUS PROCESS 
----------------------------------------- 
    process(i_Clock, i_reset) 

    begin 

    if i_reset = '1' then 
     temp_bus1 <= (others => '0'); 
     temp_bus2 <= (others => '0'); 

    elsif falling_edge(i_Clock) then 
     if delay > 1 then 
     temp_bus1 <= i_bus1 & temp_bus1(delay*bus_size - 1 downto (delay-1)*bus_size); 
     temp_bus2 <= i_bus2 & temp_bus2(delay*bus_size - 1 downto (delay-1)*bus_size); 
     else 
     temp_bus1 <= i_bus1; 
     temp_bus2 <= i_bus2; 
     end if; 
    elsif (RISING_EDGE(i_Clock)) then 

     o_bus1 <= temp_bus1(bus_size - 1 downto 0); 
     o_bus2 <= temp_bus2(bus_size - 1 downto 0);  

    end if; -- reset + rising_edge(clk) 

    end process logic; 


------------------------------------------------------- 

end a; 
1

Ну у меня нет 50 респ еще, но, чтобы получить метод Пабло R для работы с большими шинами и задерживает bus_size := 16 и delay := 256. Я должен был изменить:

temp_bus2 <= i_bus2 & temp_bus2(delay*bus_size - 1 downto (delay-1)*bus_size); 

в

temp_bus2 <= i_bus2 & temp_bus2(delay*bus_size - 1 downto (bus_size); 
Смежные вопросы