首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用组件和过程一起vhdl

使用组件和过程一起vhdl
EN

Stack Overflow用户
提问于 2022-01-18 16:56:51
回答 1查看 273关注 0票数 2

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

代码语言:javascript
复制
-- 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-Flip触发器作为移位寄存器的一个组件。因此,我的问题是:既然我有新的输入(data_load、shift_left和shift_right)和输出(序列移位-右、串行移位-左),那么如何将它们与d组件一起添加到代码中呢?可以一起使用组件和进程吗?这是我的具有异步and low重置和异步设置的d-ff代码:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-21 05:56:09

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

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

代码语言:javascript
复制
--###############################################################################
-- 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70759439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档