我知道下面的模型绝不是描述8位寄存器的最有效方法,但我这样做是为了了解数组的使用。模拟模型时,会出现第9个锁存器,在将MSB传递到输出s_out之前存储MSB。让我演示一下。
模型
ENTITY Q1 IS
PORT (clk,s_enable,s_right,s_in : IN std_logic := '0';
s_out : OUT std_logic := '0');
END ENTITY Q1;
ARCHITECTURE behavioural OF Q1 IS
TYPE reg1 IS ARRAY (7 DOWNTO 0) OF std_logic; -- array decleration
SIGNAL mem : reg1 := "00000000"; -- assignment of arry values
SIGNAL sel : std_logic_vector(1 DOWNTO 0) := "00";
BEGIN
sel <= (s_enable & s_right); -- concatination of s_enable and s_right
-->Additional multiplexer <--
--s_out <= mem(0) when sel = "11" ELSE
-- mem(7) when sell = "10" ELSE
-- s_out;
REG : PROCESS (clk) -- shift process
BEGIN
IF clk'EVENT AND clk = '1' THEN
IF sel = "11" THEN
s_out <= mem(0);--< remove with new mix
mem <= s_in & mem (7 DOWNTO 1);-- shifting of mem by concatination of s_in as the LSB to mem
ELSIF sel = "10" THEN
s_out <= mem(7);--< remove with new mux
mem <= mem(6 DOWNTO 0) & s_in;
END IF;
END IF;
END PROCESS REG;
END ARCHITECTURE behavioural;
模拟
您可以看到添加了一个额外的锁存器,其中最后一位取决于它是向左还是向右移位仅在另一个时钟脉冲之后出现在输出s_out上。它也可以在RTL查看器中看到:
虽然不改变寄存器阵列的使用是否可以删除这个额外的锁存器?我尝试将信号更改为进程内的变量但仍然具有相同的结果。 非常感谢。