以特定方式对数据进行 VHDL 抽取(?)

VHDL decimation(?) of data in specific way

我的 VHDL 代码不符合我的预期。

我想要什么:我有 32 位输入数据流,并按特定顺序抽取 32 位数据输出。

假设每个 32 位数据拆分为两个 16 位数据。

如图: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 ...

我已经使用内存完成这项工作(只是计算特定地址),但我不想使用它。我认为有最简单的方法来实现它。

在不降低频率的情况下可以用寄存器来做吗? 你能给我一些建议吗?

您需要一个最小的状态机(例如:计数器)来跟踪输入并在适当的时间更新数据寄存器。您的逻辑是每个时钟周期 运行,并且不知道它需要 "skip" 任何传入样本。

因为你正在抽取,所以如果没有 "reducing the frequency" 就不可能在寄存器或内存中执行此操作,因为你将有一半(或 1/4 或任何你设置的抽取率)输出元素作为输入元素。如果您使用内存,您可以全速爆发一段时间,但您仍然需要定期暂停和 "re-fill" 缓冲区。