Я думаю, что вы хотите получить массив, в котором элемент может содержать два числа. Они, как вы представили, странно. То, что вы говорите с помощью кода примера, состоит в том, что у вас есть трехмерный массив, в котором некоторые элементы с определенными значениями для 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
.
Для инициализации этой таблицы, в синтезируемого образом, наиболее распространенный метод, чтобы добавить сигнал сброса модуля и использовать его для инициализации содержимого таблицы, например:
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
Затем вы можете отметить этот ответ как правильный: –
Хорошо, похоже, это сработало. Можете ли вы помочь мне с вышеуказанным кодом. Он компилируется, но он ничего не синтезирует. Я хочу сравнить вход с значениями x этого массива.Если значение больше определенного x, я хочу сохранить индекс этого x и выполнить добавление с y с тем же индексом. Результат выводится на выход. – ctzof
модуль memc (inp, outp); вход [2: 0] inp; выход [2: 0] outp; провод [2: 0] index2; рег [2: 0] индекс; reg [5: 0] mem [2: 0]; начальный старт mem [0] = 6'b000000; mem [1] = 6'b001001; mem [2] = 6'b010010; конец всегда @ (*) начать если (вх> MEM [0] [2: 0]) индекс = 0; else if (inp> mem [0] [2: 0]) index = 1; else if (inp> mem [0] [2: 0]) index = 2; else index = 0; end Назначить outp = mem [index] [2: 0] + mem [index] [5: 3]; endmodule – ctzof