我是 vhdl 的新手,我有一个找不到答案的问题。
我正在尝试实现一些在 1024 位长的向量上运行的算法。所以我必须从文件中读取数据并将它们插入到这个 temp_vector(1023 downto 0) 中。
该文件包含许多输入,并且对于每个输入,算法都对前一个的输出进行操作。问题是这个输入数据的长度不是恒定的,而是每个输入长度在0到16000之间变化。
在每个周期中,我只能从我的测试台读取 64 位并插入它们。在特定时刻,我还必须将可变长度的位序列附加到已插入的数据中。我使用整数 bit_position 来跟踪我插入数据的 temp_vector 的最后位置,并使用整数 data_in_length 来告诉我在每个周期中读取的数据的实际长度。
在 temp_vector 已满或我完成插入所有输入后,我停止读取并且算法在 temp_vector 上运行,然后从文件中继续读取。
我在模拟中得到了正确的结果。我遇到的问题是 FPGA 和 ASIC 综合。它与输入数据的不同长度有关。我想出了两种方法来读取文件并将数据插入 temp_vector。第一的
temp_vector_proc : process(clk, rst_n)
begin
if rst_n = '0' then
state <= RESET;
elsif clk'event and clk = '1' then
case state is
when RESET =>
state <= TAKING_DATA;
enable_calculations <= '0';
bit_position <= 0;
temp_vector <= (others => '0');
when TAKING_DATA =>
if take_data = '1' then
for i in 0 to 63 loop
temp_vector(i+bit_position) <= data_in_keyak(i);
end loop;
bit_position <= bit_position +data_in_length;
end if;
when ...
.....
end case;
end if; -- end rst_n = '0'
end process temp_vector_proc;
第二个
when TAKING_DATA =>
if take_data = '1' then
temp_vector(63+ bit_position downto bit_position) <= data_in(63 downto 0);
bit_position <= bit_position +data_in_length;
end if;
when ...
.....
end case;
第二种方法是在 FPGA 中工作,但它会花费大量时间并消耗太多逻辑元素,并且对于设计编译器,它会返回一个错误,即范围必须是恒定的。
第一个也在 FPGA 中工作并且在 ASIC(设计编译器)中没有返回错误,但是对于 ASIC,它永远运行(我让它在一夜之间运行)。它卡在包含第一个代码的实体的第 1 遍映射的开头。
我希望我对我的问题进行了充分的解释,并且非常感谢有关如何以更有效的方式实现它的一些想法。
我认为我不能使用泛型,因为文件是一次性读取和操作的,所以在模拟过程中长度会发生变化。我也考虑过移位,但由于移位值每次都会改变,我想它仍然会消耗大量时间/面积。
最后我的整个方法可能是错误的吗?我的意思是,对于 FPGA,尤其是对于 ASIC,我是否可能需要处理特定的输入大小?这意味着我应该尝试编写和合成不适用于我的所有文件的代码,但只适用于某些指定大小的输入。
非常感谢您抽出宝贵时间。