2015-02-26 5 views
2

Каков правильный способ смещения 2D-массива n произвольных бит? Если это вообще возможно. Скажем, у меня естьСдвиг 2D-массива в Verilog

module foo(input  clk, 
      input [31:0] shift_amount); 
. 
. 
. 
reg [31:0] array[0:79]; 
. 
. 
. 
[email protected](posedge clk) begin 
    if(!reset) 
     // so something 
    else 
     // shift my array by the shift amount 
end 
endmodule 

Для 1D массив, я могу сделать что-то вроде массива < < shift_amount

, но у меня есть массив как этот

0: XXXXXXXX 
1: XXXXXXXX 
2: XXXXXXXX 
3: c0ffeeee 
4: c0dec0de 
. 
. 
79: 1234568A 

Я хочу, чтобы переместить все вверх по п (3 для этого примера), например

0: c0ffeeee 
1: c0dec0de 
2: 13e1441a 
3: 12441111 
4: fffff22a 
. 
. 
. 
77: 00000000 
78: 00000000 
79: 00000000 

Это можно сделать нэ? Если да, то как?

ответ

2

Использовать для петли. Не забудьте использовать защиту индекса и использовать неблокирующее назначение (<=).

//... 
integer i; 
[email protected](posedge clk) begin 
    if (!reset) begin 
     // so something 
    end 
    else begin 
     // shift my array by the shift amount 
     for (i=0; i<80; i=i+1) 
     if (i+shift_amount < 80) // index guard 
      array[i] <= array[i+shift_amount]; 
     else 
      array[i] <= 32'b0; 
    end 
end 
//... 
+0

Исправить. Если синтезатор умный, он может дать меньший мультиплексор для более крупных индексов. Например, индекс 79 имеет два возможных входа, индекс 77 имеет четыре возможных входа. Индекс 0 - худший случай, 81-к-1 mux (сам + 79 других записей + 32'b0). Может возникнуть проблема синхронизации с таким большим мультиплексором. Если это так, вам понадобится конвейер, который будет использовать дополнительные часы. – Greg

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