vhdl 中的 8 位串行到并行移位器

8 bit serial to parallel shifter in vhdl

我在 vhdl 中编写了一个 8 位移位器:

entity 8b is 
  port(s, clk : in std_logic; p : out std_logic_vector (7 downto 0)); 
end entity; 

architecture arch of 8b is 
  Signal iq : std_logic_vector (7 downto 0); 
begin 
  process(clk) 
  begin 
    if rising_edge(clk) then 
      iq(7) <= s;
      iq(6 downto 0) <= iq(7 downto 1); 
    end if; 
  end process; 
  p <= iq; 
end architecture; 

我的想法是接受输入并将其提供给我的第一个 D-FF。 然后在接下来的 7 个周期中,其他触发器获得其他串行输入,这些输入将提供给并行输出 p。

但是,我不确定这个逻辑是否有缺陷,因为这是我们为这个练习得到的解决方案:

architecture behavior of 8b is
  signal p_intern : std_logic_vector(7 downto 0);
begin
  P <= p_intern;
  process(CLK)
  begin
    if rising_edge(CLK) then
      p_intern <= p_intern(6 downto 0) & S;
    end if;
  end process;
end architecture;

但我不明白 p_intern <= p_inter(6 downto 0) & S; 部分。

谁能解释一下这背后的逻辑,我的版本是否也有效?

两个实现之间的唯一区别似乎是线条

iq(7) <= s;
iq(6 downto 0) <= iq(7 downto 1); 

对比

p_intern <= p_intern(6 downto 0) & S;

并且 iq 被命名为 p_intern。为了便于比较,我们假设它们都被命名为 iq

让我们看看他们在做什么:

第一个实现(你的)分配给 iq 的位置:

7     6     5     ... 1     0
s     iq(7) iq(6) ... iq(2) iq(1)

第二种实现(方案)赋值

7     6     5     ... 1     0
iq(6) iq(5) iq(4) ... iq(0) s

其中 iq(6 downto 0) & s 表示“将 s 连接到 iq(6 downto 0) 的右侧”。

所以它们不等价。您的实施从左侧移动值,解决方案从右侧移动值。哪一个是正确的取决于规范(大概解决方案是正确的)。