2016-06-28 2 views
0

У меня есть 9 триггеров и один сброс ввода. Мне нужно установить выходы 8 триггеров на 0, когда сброс 0. И выход одного триггера на 1. Этот триггер уникален и никогда не менялся. Как это сделать?Различные триггеры - разные выходы для одного входа сброса

код триггеров:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity d_ff is 
    port 
    (
     clk : in std_logic; 
     rst : in std_logic;  
     d : in std_logic; 
     q : out std_logic 
    ); 
end entity d_ff; 

architecture logicFunc of d_ff is 
begin 
    process (clk) is 
    begin 
     if (rst='0') then 
      q <= '0'; 
     elsif (clk'event and clk = '1') then 
      q <= d; 
     end if; 
    end process; 
end architecture logicFunc; 

Теперь этот код устанавливает все триггеры в 0 когда сброс 0 и я не могу изменить выход первого триггера в основной программе

ответ

1

В 8 Flipflops, которые сброс в '0', вы можете использовать представленный вами код. Для другого триггера вы можете создать другой сущности d_ff1:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity d_ff1 is 
    port 
    (
     clk : in std_logic; 
     rst : in std_logic;  
     d : in std_logic; 
     q : out std_logic 
    ); 
end entity d_ff1; 

architecture logicFunc of d_ff1 is 
begin 
    process (clk) is 
    begin 
     if (rst='0') then 
      q <= '1'; 
     elsif (clk'event and clk = '1') then 
      q <= d; 
     end if; 
    end process; 
end architecture logicFunc; 

Таким образом, в соответствии с тем, как вы хотели бы иметь отдельные объекты флип-флоп.

+0

Так простое решение. Как я этого не делал. Благодаря! – levshkatov

3

Альтернативой является использование дженериков. Это позволяет использовать тот же самый код для всех ваших экземпляров d_ff. Например:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity d_ff is 
    generic 
    (
     RESET_VALUE : std_logic 
    ); 
    port 
    (
     clk : in std_logic; 
     rst : in std_logic;  
     d : in std_logic; 
     q : out std_logic 
    ); 
end entity d_ff; 

architecture logicFunc of d_ff is 
begin 
    process (clk) is 
    begin 
     if (rst='0') then 
      q <= RESET_VALUE; 
     elsif (clk'event and clk = '1') then 
      q <= d; 
     end if; 
    end process; 
end architecture logicFunc; 

Затем, когда вы использовать его для создания 8 ФФ, что сброс в «0» и 1 FF, сбрасывающему к «1»:

library ieee; 
use ieee.std_logic_1164.all; 

entity foo is 
    port map 
    (
    clk : in std_logic; 
    rst : in std_logic; 
    d : in std_logic_vector(8 downto 0); 
    q : out std_logic_vector(8 downto 0) 
) 
end entity foo; 

architecture structural of foo is 
begin 
    ff_gen : for i in 0 to 7 generate 
    begin 
    ff : entity work.d_ff 
    generic map 
    (
     RESET_VALUE => '0' 
    ) 
    port map 
    (
     clk => clk, 
     rst => rst, 
     d => d(i), 
     q => q(i) 
    ); 
    end generate ff_gen; 

    ff0_gen : entity work.d_ff 
    generic map 
    (
    RESET_VALUE => '1' 
) 
    port map 
    (
    clk => clk, 
    rst => rst, 
    d => d(8), 
    q => q(8) 
); 
end architecture structural; 
2

Зачем нужен d_ff Сущность на всех? Почему существует отдельный уровень иерархии? Никакой профессиональный пользователь VHDL не сделал бы этого, если бы не было особых причин для этого. Вместо этого просто выполните свои 9 триггеров в качестве процесса:

process (clk) is 
    begin 
     if rst='0' then 
      q < = "000000001"; 
     elsif rising_edge(clk) then 
      q <= d; 
     end if; 
    end process;