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

时间:2019-02-01 13:02:27

标签: embedded vhdl fpga hardware-programming

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

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

假设每个32位数据都分成两个16位数据。

    第一种情况:输出中每隔16位就有32位数据; 第二种情况:输出中每32位数据中的第四个16位出现; 输出中存在
  • 第三种情况的第四位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 :(得分:0)

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

由于要进行抽取,因此如果不“降低频率”就无法在寄存器或存储器中执行此操作,因为您将拥有一半(或1/4或其他抽取率设置为)的输出元素作为输入元素。如果您使用内存,则可能会以全速爆发一段时间,但是您仍然必须定期暂停并“重新填充”缓冲区。