不同的触发器 - 一个复位输入的不同输出

Different flipflops - different outputs for one reset input

我有 9 个触发器和一个复位输入。当重置为 0 时,我需要将 8 个触发器的输出设置为 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,并且我无法更改主程序中第一个触发器的输出

重置为“0”的 8 个触发器您可以使用您提供的代码。对于另一个触发器,您可以创建另一个实体 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;

这种方式与您希望拥有一个单独的触发器实体的方式一致。

另一种方法是使用泛型。这允许您对所有 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”的 FF 和 1 个重置为“1”的 FF 时:

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;

为什么要有一个 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;