这里的总菜鸟,只是为了清楚。只有大约一个月的时间学习Verilog。
所以我有一些用户定义的参数,我想要在数组中输出所有项目的串联。例如,如果数组长度是静态的(在这种情况下,是一个包含10个12位项的数组),我当然可以这样做:
reg [11:0] array [9:0];
output <= {array[9],...,array[0]};
但是,如果数组长度是用户定义的,因此不是静态值怎么办?例如,如果我想要两个这样的输出,长度是一个参数:
output1 <= array[0];
output2 <= {array[length-1],...,array[1]};
我的头撞了一两分钟,在我的互联网搜索中找不到任何东西......希望我足够清楚......
答案 0 :(得分:0)
假设您有以下内容:
parameter NUM_ITEMS = 10;
parameter LOWER = 1;
parameter UPPER = 9;
reg [11:0] array [NUM_ITEMS-1:0];
reg [12*(NUM_ITEMS-1)-1:0] output;
以下可行:
integer i;
always@(*) begin
for (i=0; i <= UPPER; i=i+1)
output[i*12+:12] = array[LOWER+i];
//alternatively output [12*i+11:12*i] = array[LOWER+i];
end
但是,您的数组元素需要是顺序的。
答案 1 :(得分:0)
您可以尝试将循环中的数组分配给变量output2。您将移动output2变量的位,并将数组的每个元素的值分配给output2。 WIDTH_ARRAY是数组的宽度,必须是常量。
parameter SZ = 10;
parameter WIDTH_ARRAY = 8;
reg [WIDTH_ARRAY-1:0] a[SZ] = {1,1,1,1,1,1,1,1,1,1} ;
reg [SZ*WIDTH_ARRAY:0] output2;
output1 <= array[0];
for ( int i = 0 ; i<SZ-1;i++)
begin
output2[(i*WIDTH_ARRAY)+:WIDTH_ARRAY] = array[i+1];
end
你不能直接将数组分配给output2,因为一个是解压缩的,而另一个是压缩结构。
+:称为位片运算符。 Indexing vectors and arrays with +: