可合成的 XY 值数组
Synthesizable array of XY values
我想在 Verilog 中创建一个数组,它将包含给定函数的值 x
、y
。所以数组的每个内容都将包含一个 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 中制作此数组并进行综合?如果是这样,我怎样才能访问这个数组上的每个点?
我想你想要得到的是一个数组,其中一个元素可以容纳两个数字。他们展示它的方式很奇怪。你用你的示例代码说的是你有一个三维数组,其中一些具有 i
、x
和 y
特定值的元素将有一个值,但是你不要指定什么值。
你在文中说的是你想要 table 个 i
个元素,其中每个元素将有两个值:一个用于 x
,一个用于 y
。这是我们可以解决的问题,但不能使用您提供的实现(三维数组)。
也就是说,您必须首先考虑要存储在 table 中的 x
、y
值的性质如何。 Verilog 最适合处理整数,所以我假设是这样。您还需要知道您的整数将使用多少位。假设他们将使用 8 位,因此有效的 x
、y
值在 [-128,+127]
范围内,考虑符号。
现在您必须知道要在 table 中存储多少对 x
、y
。假设它是 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
我想在 Verilog 中创建一个数组,它将包含给定函数的值 x
、y
。所以数组的每个内容都将包含一个 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 中制作此数组并进行综合?如果是这样,我怎样才能访问这个数组上的每个点?
我想你想要得到的是一个数组,其中一个元素可以容纳两个数字。他们展示它的方式很奇怪。你用你的示例代码说的是你有一个三维数组,其中一些具有 i
、x
和 y
特定值的元素将有一个值,但是你不要指定什么值。
你在文中说的是你想要 table 个 i
个元素,其中每个元素将有两个值:一个用于 x
,一个用于 y
。这是我们可以解决的问题,但不能使用您提供的实现(三维数组)。
也就是说,您必须首先考虑要存储在 table 中的 x
、y
值的性质如何。 Verilog 最适合处理整数,所以我假设是这样。您还需要知道您的整数将使用多少位。假设他们将使用 8 位,因此有效的 x
、y
值在 [-128,+127]
范围内,考虑符号。
现在您必须知道要在 table 中存储多少对 x
、y
。假设它是 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
块
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