您想实现一个移位寄存器以串行输入数据。通常,您应该仅将 case 语句用于控制逻辑而不是数据流。将数据向量视为可寻址数组也是可能的,但它会合成到解码器,这将成为这种大小的时序问题,并且对于仅将位移动到位并不是绝对必要的。
signal data : std_logic_vector(127 downto 0);
...
sreg: process(clock, reset)
begin
if reset = '1' then
data <= (others => '0');
elsif rising_edge(clock) then
if shift_en = '1' then
data <= data(126 downto 0) & a; -- Shift left
-- data <= a & data(127 downto 1); -- Shift right
end if;
end if;
end process;
当移位寄存器被填满时,你将不得不决定如何控制你所做的事情。要么实现一个计数器来计算 128 个移位,要么使用另一个控制信号,在移位完成时开始下一个处理阶段。
在测试台方面,您可以更灵活地驱动信号,因为无需担心综合结果。您通常有两种选择:编写与 DUT 风格相似的同步进程,或使用等待语句来管理信号顺序,而不实现可综合代码中所需的同步机制。
constant CPERIOD : delay_length := 10 ns;
...
stim: process is
variable data : std_logic_vector(127 downto 0);
begin
-- Initialize signal drivers
a <= '0';
shift_en <= '0';
reset <= '1', '0' after CPERIOD * 2;
wait until falling_edge(clock);
wait for CPERIOD * 2;
data := X"CAFEBABECAFED00D8BADFOODDEADBEEF";
-- Shift data in from left to right
shift_en <= '1';
for i in data'range loop
a <= data(i);
wait for CPERIOD;
end loop;
shift_en <= '0';
wait for CPERIOD;
wait; -- Stop process from restarting
end process;
注意:在时钟的下降沿驱动激励是一种惰性技术,当您在与接收器相同的沿驱动时,它可以避免 delta 周期排序的任何问题。当您想要表示信号的准确时序但保证您不必以与预期不同的顺序处理事件时与模拟引擎搏斗时,这样做并不总是合适的。绝对不要在可综合的代码中这样做(除非你正在试验多米诺逻辑)。