我的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 ...
我已经使用内存(仅计算特定地址)来完成这项工作,但是我不想使用它。我认为有最简单的方法可以实现这一点。
可以在不降低频率的情况下使用寄存器吗? 你能给我一些建议吗?
答案 0 :(得分:0)
您需要一个最小状态机(例如:计数器)来跟踪输入并在适当的时间更新数据寄存器。您的逻辑每个时钟周期都在运行,并且不知道需要“跳过”任何传入的采样。
由于要进行抽取,因此如果不“降低频率”就无法在寄存器或存储器中执行此操作,因为您将拥有一半(或1/4或其他抽取率设置为)的输出元素作为输入元素。如果您使用内存,则可能会以全速爆发一段时间,但是您仍然必须定期暂停并“重新填充”缓冲区。