输出Verilog中的数组连接

时间:2016-08-09 16:03:16

标签: arrays concatenation verilog

这里的总菜鸟,只是为了清楚。只有大约一个月的时间学习Verilog。

所以我有一些用户定义的参数,我想要在数组中输出所有项目的串联。例如,如果数组长度是静态的(在这种情况下,是一个包含10个12位项的数组),我当然可以这样做:

    reg [11:0] array [9:0];
    output <= {array[9],...,array[0]};

但是,如果数组长度是用户定义的,因此不是静态值怎么办?例如,如果我想要两个这样的输出,长度是一个参数:

    output1 <= array[0];
    output2 <= {array[length-1],...,array[1]};

我的头撞了一两分钟,在我的互联网搜索中找不到任何东西......希望我足够清楚......

2 个答案:

答案 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 +: