VHDL прореживание (?) Данных определенным образом - PullRequest
0 голосов
/ 01 февраля 2019

Мой VHDL-код работает не так, как я ожидал.

Что я хочу: у меня 32-битный поток входных данных и децимированный 32-битный вывод данных в определенном порядке.

Скажем, каждые 32-битные данные разделены на две 16-битные данные.

  • первый случай: каждая вторая 16-битная 32-битная информация присутствует на выходе;
  • второй случай: каждые четвертые 16-битные 32-битные данные присутствуют на выходе;
  • третий случай, четвертый 16-битный 32-битный данные присутствуют на выходе и т. Д.

Как на рисунке: pic1

Здесьэто первый случай реализации:

process (CLK_IN, RST_IN)
begin
    if (RST_IN = '1') then
        rx_data_half_a <= (others => '0');
    elsif rising_edge(CLK_IN) then
        rx_data_half_a <= DATA_IN(15 downto 0);
    end if;
end process;

process (CLK_IN, RST_IN)
begin
    if (RST_IN = '1') then
        rx_data_half_a0 <= (others => '0');
        rx_data_half_a1 <= (others => '0');
    elsif rising_edge(CLK_IN) then
        rx_data_half_a0 <= rx_data_half_a;
        rx_data_half_a1 <= rx_data_half_a0; 
        rx_data_half_a2 <= rx_data_half_a1; 
        DATA_OUT <= rx_data_half_a0 & rx_data_half_a;
    end if;
end process;

И тестовый стенд выглядит так: sim

Вместо 00002222 44446666 ...

Я получаю: 00002222 22224444 44446666 ...

Я уже делаю эту работу, используя память (просто считая определенные адреса), но я не хочу ее использовать.Я думаю, что есть гораздо более простой способ реализовать это.

Можно сделать с регистрами, не уменьшая частоту?Можете ли вы дать мне совет?

1 Ответ

0 голосов
/ 01 февраля 2019

Вам необходим минимальный конечный автомат (например, счетчик) для отслеживания ввода и обновления регистров данных в соответствующее время.Ваша логика работает каждый тактовый цикл и не подозревает, что ей нужно «пропустить» любые входящие выборки.

Поскольку вы выполняете децимацию, это невозможно сделать в регистрах или в памяти без «уменьшения»«Частота», то есть у вас будет вдвое меньше (или 1/4 или независимо от того, какой у вас установлен коэффициент прореживания) столько выходных элементов, сколько входных.Если вы используете память, вы можете какое-то время работать с полной скоростью, но вам все равно придется периодически останавливаться и «заново заполнять» буфер.

...