Как записать входные значения на разных тактах в тестовом стенде программирования v/hdl?

Я пишу код vhdl для алгоритма шифрования AES, мне нужно взять 128-битные данные для шифрования, поэтому используется 1-битный входной контакт. для 128-битных данных я использовал 128 тактов с оператором case. Мне нужно написать тестовый стенд, чтобы проверить правильность работы кода. как записать 128 бит данных в разных тактах на тестовом стенде.

if(clk'event and clk = '1') then
    count <= count + 1;
    end if;
    end process;        
    process(count,a)
begin
 case count is
 when 0 =>
    it(127)<=a;
    when 1 =>
    it(126)<=a;
    when 2 =>
    it(125)<=a;
    when 3 =>
    it(124)<=a;
    when 4 =>
    it(123)<=a;
    when 5 =>
    it(122)<=a;
    when 6 =>
    it(121)<=a;
    when 7 =>
    it(120)<=a;    .... n go for 0th bit
  1. бит
  2. это (128-битный сигнал)

person erdarshp    schedule 18.04.2014    source источник
comment
Если вы сможете найти математическое соотношение между числом и битом для записи, вы сможете полностью исключить этот очень длинный оператор case.   -  person user_1818839    schedule 18.04.2014
comment
на 0-м счете 127-й бит (как я использую вниз) или 0-й бит (если используется) и увеличьте счет на 1 n уменьшите бит на 1, так что до счета 127-го. а моя забота как прописать разные ip за 128 тактов?   -  person erdarshp    schedule 18.04.2014
comment
Брайан намекает, что существует более простой способ индексации it(), поскольку у вас уже есть целочисленный счетчик с простым математическим отношением к порядку битов, который вы хотите.   -  person fru1tbat    schedule 18.04.2014


Ответы (2)


Вы хотите реализовать сдвиговый регистр для последовательной подачи данных. Как правило, вы должны использовать операторы 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

В вашем коде гораздо больше проблем, чем просто оператор case.

Я надеюсь, что это поможет вам:

--very important this signal should be an integer
signal count : integer range 0 to 127;
signal it    : std_logic_vector (127 downto 0);

begin
process count (clk,reset)
begin
  if (reset = '1') then
    count <= 0;
    it <= (others=>(others=>'0'));
  elsif (rising_edge(clk)) then
    count <= count + 1;
    it(count) <= a; 
  end if;
end process;

Еще лучше написать count и это в другом процессе. У меня нет возможности проверить мой код здесь, надеюсь, все мысли верны.

person Filly    schedule 18.04.2014
comment
Почему вы сказали, что лучше писать Count и It в разных процессах? Подсказка: я не согласен, но не каждый. - person user_1818839; 18.04.2014
comment
Потому что гораздо лучше отлаживать, чтобы было легче читать. Написание коротких процессов — хорошая практика проектирования. - person Filly; 11.07.2014