组件和进程一起使用vhdl

Use component and process together vhdl

我在大学被要求制作一个 4 位双向移位寄存器。我先是这样做的:

-- bidirektionale shift register mit data-load und serielle(R/L) output

library ieee;
use ieee.std_logic_1164.all;

entity bi_shift_reg is
    port( din: in std_logic_vector(3 downto 0);
            set, n_reset: in std_logic;
            sR, sL: in std_logic; -- Shift-Right/Shift-Left
            data_load: in std_logic;
            clk: in std_logic;
            dout: inout std_logic_vector(3 downto 0);
            s_dout_R: out std_logic; -- Serial Shift-Right output
            s_dout_L: out std_logic -- Serial Shift-Left output
            );
end bi_shift_reg;

architecture arch of bi_shift_reg is
begin
    
    process(clk,set,n_reset)
        begin
                -- reset (low aktiv)
                if n_reset = '0' then dout <= "0000";
                -- set
                elsif set = '1' then dout <= "1111";
                -- data-load
                elsif(rising_edge(clk) and data_load = '1') then 
                    s_dout_R <= din(0);
                    s_dout_L <= din(3);
                    dout <= din;
                -- shift right
                elsif(rising_edge(clk) and sR = '1') then
                    s_dout_R <= din(0);
                    dout(2 downto 0) <= dout(3 downto 1);
                -- shift left
                elsif(rising_edge(clk) and sL = '1') then
                    s_dout_L <= din(3);
                    dout(3 downto 1) <= dout(2 downto 0);
                end if;
        end process;

end arch;

但后来我听说我需要使用我以前编码的 D-Flipflop 作为移位寄存器的组件。所以我的问题是:由于我有新的输入(data_load、shift_left 和 shift_right)和输出(Serial Shift-Right、Serial Shift-Left),我如何将它们添加到我的代码中连同 d-ff 组件?是否可以一起使用组件和流程? 这是我的带有异步激活低复位和异步设置的 d-ff 代码:

library ieee;
use ieee.std_logic_1164.all;

entity d_flipflop is
    port( d, clk, set, n_reset: in std_logic;
            q, qn: out std_logic
            );
end d_flipflop;

architecture arch of d_flipflop is
begin
    process(clk,set,n_reset)
    variable temp: std_logic; -- zwischenergebniss
    begin
         if n_reset = '0' then
            temp := '0';
         elsif set = '1' then
            temp := '1';
         elsif rising_edge(clk) then
            temp := d; 
         end if;
    q <= temp;
    qn <= not temp;
    end process;
end arch;

如何使用我的触发器获得与移位寄存器代码相同的结果?

预先感谢您的回答:D

在OP的评论轨道中提出了几个很好的问题之后,post一些可以作为解决方案示例的设计是合理的。

请注意,没有对预期操作的任何精确说明,例如不同输入之间的优先级是什么,以及输出的时序应该如何,因此提供下面的代码是为了展示一些 VHDL 结构,这些结构可以作为 OP 进一步更新的模板。

--###############################################################################
-- d_flipflop

library ieee;
use ieee.std_logic_1164.all;

entity d_flipflop is
  port(d, clk, set, n_reset : in  std_logic;
       q, qn                : out std_logic
       );
end d_flipflop;

architecture arch of d_flipflop is
begin
  process(clk, set, n_reset)
    variable temp : std_logic;          -- zwischenergebniss
  begin
    if n_reset = '0' then
      temp := '0';
    elsif set = '1' then
      temp := '1';
    elsif rising_edge(clk) then
      temp := d;
    end if;
    q  <= temp;
    qn <= not temp;
  end process;
end arch;


--###############################################################################
-- bi_shiftReg_ff

library ieee;
use ieee.std_logic_1164.all;

entity bi_shiftReg_ff is
  port(din          : in  std_logic_vector(3 downto 0);
       set, n_reset : in  std_logic;
       sR, sL       : in  std_logic;    -- Shift-Right/Shift-Left
       data_load    : in  std_logic;
       clk          : in  std_logic;
       dout         : out std_logic_vector(3 downto 0);
       s_dout_R     : out std_logic;    -- Shift-Right output
       s_dout_L     : out std_logic     -- Shift-Left output
       );
end bi_shiftReg_ff;

architecture arch of bi_shiftReg_ff is

  -- FF component
  component d_flipflop is
    port(d, clk, set, n_reset : in  std_logic;
         q, qn                : out std_logic
         );
  end component;

  -- FF data input
  signal d : std_logic_vector(3 downto 0);

  -- FF data output
  signal q  : std_logic_vector(3 downto 0);
  signal qn : std_logic_vector(3 downto 0);  -- Unused, but included for completness

begin

  -- Combinatorial process, thus making gates only
  process (all)
  begin
    -- data-load
    if (data_load = '1') then
      d <= din;
    -- shift right; priority over shift left
    elsif (sR = '1') then
      d <= '0' & q(q'left downto 1);  -- Discard right-most bit in the right shift
    -- shift left
    elsif (sL = '1') then
      d <= q(q'left - 1 downto 0) & '0';  -- Discard left-most bit in the left shift
    end if;
  end process;

  -- State held in FFs
  GEN_REG : for i in 0 to 3 generate
    REGX : d_flipflop port map
      (d(i), clk, set, n_reset, q(i), qn(i));
  end generate;

  -- Outputs drive
  dout <= q;
  s_dout_R <= q(q'right);  -- Bit 0, but shown with VHDL attributes
  s_dout_L <= q(q'left);   -- Bit 3, --||--

end arch;


--###############################################################################
-- EOF