2015-05-04 2 views
0

Я хочу создать массив в Verilog, который будет содержать значения x, y данной функции. Поэтому каждое содержимое массива будет содержать значение x и значение y. Так позволяет сказать, что у меня есть следующие значения для (x,y)Синтезируемый массив значений XY

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

Окончательный массив будет выглядеть примерно так:

Table[i][x][y] 

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

Можно ли сделать этот массив в Verilog и быть синтезируемого? Если да, то как я могу получить доступ к каждой точке этого массива?

ответ

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.

Для инициализации этой таблицы, в синтезируемого образом, наиболее распространенный метод, чтобы добавить сигнал сброса модуля и использовать его для инициализации содержимого таблицы, например:

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 
+0

Затем вы можете отметить этот ответ как правильный: –

+0

Хорошо, похоже, это сработало. Можете ли вы помочь мне с вышеуказанным кодом. Он компилируется, но он ничего не синтезирует. Я хочу сравнить вход с значениями x этого массива.Если значение больше определенного x, я хочу сохранить индекс этого x и выполнить добавление с y с тем же индексом. Результат выводится на выход. – ctzof

+0

модуль 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

Смежные вопросы