可合成的XY值数组

时间:2015-05-04 12:25:15

标签: arrays verilog

我想在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中制作这个数组并且可以合成?如果是这样,我如何访问此阵列上的每个点?

1 个答案:

答案 0 :(得分:2)

我认为你想要的是一个数组,其中一个元素可以容纳两个数字。你介绍它的方式很奇怪。你对你的示例代码说的是你有一个三维数组,其中某些具有ixy值的元素将具有一个值,但是你不要指定什么价值。

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

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

现在,您必须知道要在表格中存储多少xy对。让我们说出它的N值,其中N是模块的某种参数。

然后,该表将被实例化为:

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

因此,Table[i][7:0]可以保存一个8位值,例如y,而Table[i][15:8]可以保存另一个8位值,比如x

要以可综合的方式初始化此表,最常见的方法是向模块添加一个重置信号,并使用它来初始化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还是Block 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