1

我是 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,我是否可能需要处理特定的输入大小?这意味着我应该尝试编写和合成不适用于我的所有文件的代码,但只适用于某些指定大小的输入。

非常感谢您抽出宝贵时间。

4

0 回答 0