我正在制造一个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的新手,并想学习它的工作原理。谢谢
答案 0 :(得分:2)
在VHDL &
中是 concatenation 运算符。它用于通过连接将较小的数组和单个数组元素制成较大的数组,即将它们连接在一起。所以,
s <= (din & s(3 downto 1));
取单个位din
并将其连接到s
(s(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
的最低位由此丢失。
我建议您逐步进行此操作,直到您了解发生了什么。