可合成的 XY 值数组

Synthesizable array of XY values

我想在 Verilog 中创建一个数组,它将包含给定函数的值 xy。所以数组的每个内容都将包含一个 x 的值和一个 y 的值。所以假设我有以下 (x,y)

的值
(3,2)
(5,10)
(1,5)

最终数组将如下所示:

Table[i][x][y]

Table[0][3][2]
Table[1][5][10]
Table[2][1][5]

是否可以在 Verilog 中制作此数组并进行综合?如果是这样,我怎样才能访问这个数组上的每个点?

我想你想要得到的是一个数组,其中一个元素可以容纳两个数字。他们展示它的方式很奇怪。你用你的示例代码说的是你有一个三维数组,其中一些具有 ixy 特定值的元素将有一个值,但是你不要指定什么值。

你在文中说的是你想要 table 个 i 个元素,其中每个元素将有两个值:一个用于 x,一个用于 y。这是我们可以解决的问题,但不能使用您提供的实现(三维数组)。

也就是说,您必须首先考虑要存储在 table 中的 xy 值的性质如何。 Verilog 最适合处理整数,所以我假设是这样。您还需要知道您的整数将使用多少位。假设他们将使用 8 位,因此有效的 xy 值在 [-128,+127] 范围内,考虑符号。

现在您必须知道要在 table 中存储多少对 xy。假设它是 N 值,其中 N 是您模块的某种参数。

然后,table 将像这样实例化:

reg [15:0] Table[0..N-1];

所以,Table[i][7:0]可以容纳一个8位的值,例如y,而Table[i][15:8]可以容纳另一个8位的值,比如x

要以可综合的方式初始化这个Table,最常见的方法是向您的模块添加一个复位信号并使用它来初始化Table内容,如下所示:

reg [15:0] Table[0..N-1];
integer i;
always @(posedge clk) begin
  if (reset == 1'b1) begin
    Table[0] <= {8'd3, 8'd2};
    Table[1] <= {8'd5, 8'd10};
    Table[2] <= {8'd1, 8'd5};
    for (i=3;i<N;i=i+1)   // initialize the rest of Table to 0,0
      Table[i] <= {8'd0, 8'd0};
  end
  else ......
end

要访问位于 i 的点,您只需使用:

Table[i][15:8] for X value
Table[i][7:0] for Y value

如果以 Xilinx 设备为目标,您还可以使用 initial

初始化寄存器的内容,无论是在分布式 RAM 还是块 RAM 中
reg [15:0] Table[0..N-1];
integer i;
initial begin
  Table[0] = {8'd3, 8'd2};
  Table[1] = {8'd5, 8'd10};
  Table[2] = {8'd1, 8'd5};
  for (i=3;i<N;i=i+1)   // initialize the rest of Table to 0,0
    Table[i] = {8'd0, 8'd0};
end