【问题标题】:Array vs long vectors in VerilogVerilog中的数组与长向量
【发布时间】:2019-12-06 15:09:08
【问题描述】:

我正在编写一个 Verilog 代码,它需要在类似内存的结构中保存许多数据。

我已经使用一个向量数组和一个非常长的单个向量来实现它们。

虽然我认为内部没有任何区别,但如果有的话,哪种存储数据更好?

我实际上正在编写一个可以合成到电路板上的代码,因此任何具有丰富 FPGA 经验的人的实用建议都会有所帮助。

例如,我可以使用

存储 32x1024 的数据
reg[31:0] temp_storage [0:1023]

reg[32767:0] temp_storage

数组方式对程序员来说更容易管理,但是从硬件的角度来看有没有什么缺点?

如果我一一声明,真的会一样吗?

reg[31:0] temp_storage0001
reg[31:0] temp_stoarge0002
.
.
.
reg[31:0] temp_storage1024

谢谢。

【问题讨论】:

  • 在您的合成器文档中查找内存推理模板。使用独立的寄存器,您应该能够在同一个周期内访问它们,因此不会创建内存。有了数组,你可能会得到一个,也许

标签: arrays vector verilog fpga


【解决方案1】:

这两种格式有很大区别。

格式一:

reg[31:0] temp_storage [0:1023];

这可以在内存块上映射*,因此将使用更少的 FPGA 寄存器/资源。但是有一个惩罚:您一次最多可以读取或写入两个条目。 (如果你使用双端口内存,两个条目,如果你使用单端口内存,一个条目。现在 FPGA 中的所有嵌入式块 RAM 都是双端口的)

格式二:

reg[31:0] temp_storage0001
reg[31:0] temp_stoarge0002

在这种情况下,每个temp_storage... 都存储在一组单独的 32 个寄存器中。您可以同时读取和写入任意数量的数据(或者直到用完 FPGA 门为止)。因此灵活性要大得多,但这会更快地耗尽您的 FPGA 门/LUTS。

* 正如@B.Go 所说:检查你的 FPGA 文档,你是如何将它映射到内存上的,或者直接推断内存宏/IP。


最多两个条目是什么意思:temp_storage[0]

reg[31:0] temp_storage [0:1023];

上述定义适用于具有 1024 个条目的内存,每个条目 32 位宽。您可以选择 1024 的两个条目,您可以读取或写入每个条目。 (你的双端口内存通常有两个地址总线,两个读数据端口和两个写数据端口,通常每个端口还有两个时钟)。

您通常会使用以下方式访问此内存:

always @( posedge clk)
begin
   if (write_enable_0)
      temp_storage[address_0] <= write_data_0;
   else
      read_data_0 <= temp_storage[address_0];

   if (write_enable_1)
      temp_storage[address_1] <= write_data_1;
   else
      read_data_1 <= temp_storage[address_1];
end

找到您的 FPGA 系列的“内存”部分/应用说明,它将告诉您如何做到这一点以及陷阱(例如,从同一位置同时写入和读取)

【讨论】:

  • 最多两个条目是什么意思:temp_storage[0]
猜你喜欢
  • 1970-01-01
  • 2020-08-11
  • 2022-01-14
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多