Вы хотите реализовать сдвиговый регистр для последовательной подачи данных. Как правило, вы должны использовать операторы 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;
Примечание. Управление стимулом по заднему фронту тактового сигнала — это ленивый метод, который позволяет избежать любых проблем с порядком дельта-цикла, когда вы управляете тем же фронтом, что и приемник. Это не всегда уместно делать, когда вы хотите представить точную синхронизацию сигналов, но гарантирует, что вам не придется бороться с событиями, обрабатывающими механизм моделирования в другом порядке, чем вы предполагали. Определенно не делайте этого в синтезируемом коде (если только вы не экспериментируете с логикой домино).
person
Kevin Thibedeau
schedule
18.04.2014
it()
, поскольку у вас уже есть целочисленный счетчик с простым математическим отношением к порядку битов, который вы хотите. - person fru1tbat   schedule 18.04.2014