我想在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中制作这个数组并且可以合成?如果是这样,我如何访问此阵列上的每个点?
答案 0 :(得分:2)
我认为你想要的是一个数组,其中一个元素可以容纳两个数字。你介绍它的方式很奇怪。你对你的示例代码说的是你有一个三维数组,其中某些具有i
,x
和y
值的元素将具有一个值,但是你不要指定什么价值。
您在文中说的是,您需要一个i
个元素的表格,其中每个元素都有两个值:一个用于x
,另一个用于y
。这是我们可以解决的问题,但不是你提供的实现(三维数组)。
也就是说,您必须首先考虑要在表格中存储的x
,y
值的性质。 Verilog最适合整数,所以我会假设。您还需要知道整数将使用多少位。我们假设它们将使用8位,因此有效x
,y
值在[-128,+127]
范围内,并且会考虑符号。
现在,您必须知道要在表格中存储多少x
,y
对。让我们说出它的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