以特定方式对数据进行 VHDL 抽取(?)
VHDL decimation(?) of data in specific way
我的 VHDL 代码不符合我的预期。
我想要什么:我有 32 位输入数据流,并按特定顺序抽取 32 位数据输出。
假设每个 32 位数据拆分为两个 16 位数据。
- 第一种情况:输出中每秒出现 32 位数据的 16 位;
- 第二种情况:输出中出现 32 位数据的每第四个 16 位;
- 第三种情况第四种 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" 缓冲区。
我的 VHDL 代码不符合我的预期。
我想要什么:我有 32 位输入数据流,并按特定顺序抽取 32 位数据输出。
假设每个 32 位数据拆分为两个 16 位数据。
- 第一种情况:输出中每秒出现 32 位数据的 16 位;
- 第二种情况:输出中出现 32 位数据的每第四个 16 位;
- 第三种情况第四种 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" 缓冲区。