该SIPO如何运作?

时间:2019-08-13 07:42:12

标签: vhdl modelsim

我正在制造一个UART收发器,在“接收器”部分,我需要一个SIPO将串行数据转换为并行数据,一个Web搜索抛出了一个代码,该代码可以执行所需的功能,我无法理解这个特定的代码有效,谷歌搜索没有帮助。非常感谢有人指出它的工作原理

library ieee;
use ieee.std_logic_1164.all;

entity RXN_CNTRL is 
  port(
    reset : in std_logic;
    clk : in std_logic;
    din : in std_logic;
    dout : out std_logic_vector(3 downto 0)
  );
end entity;

architecture behave of RXN_CNTRL is 
  signal s : std_logic_vector(3 downto 0) := "0000" ;
begin
  sipo : process (clk, reset)
  begin
    if (reset='1') then
      s <= "0000";
    elsif (rising_edge (clk)) then       
      s <= (din & s(3 downto 1));    
    end if;
  end process;

  dout <= s;

end architecture;

我无法理解s <= (din & s(3 downto 1));行 作品。请在此说明我,我是vhdl的新手,并想学习它的工作原理。谢谢

2 个答案:

答案 0 :(得分:2)

在VHDL &中是 concatenation 运算符。它用于通过连接将较小的数组和单个数组元素制成较大的数组,即将它们连接在一起。所以,

 s <= (din & s(3 downto 1));

取单个位din并将其连接到ss(3 downto 1))的最左边3位,以给出新值s

din  s(3)  s(2)  s(1)

因此,您可以看到s已向右移动了一个位置,并且空白区域已填充din-正是您想要的SIPO行为。

在VHDL中,我建议始终使用 concatenation slicing 的组合(作为数组的一部分,如s(3 downto 1))来实现移位寄存器和以此类推。内置运算符(sla等)的行为很奇怪。

答案 1 :(得分:2)

&是VHDL中的串联运算符。

所以这是将新接收到的位(din)从左侧移到s中(放置s的最低位)。

假设s最初是“ 0000”。如果din ='1',则s <= din & s(3 downto 1)din('1'),将s(3 downto 1)(“ 000”)连接到它,并将结果分配给{{1 }}。 s的最低位由此丢失。

我建议您逐步进行此操作,直到您了解发生了什么。