在输出 Verilog 处串联数组
Concatenation of Array at Output Verilog
这里完全是菜鸟,只是为了清楚。学习 Verilog 仅一个月左右。
所以我有一些用户定义的参数,我想将所有项目串联成一个数组。例如,如果数组长度是静态的(在本例中,是一个包含 10 个 12 位项的数组),我当然可以这样做:
reg [11:0] array [9:0];
output <= {array[9],...,array[0]};
但是如果数组长度是用户定义的而不是静态值怎么办?例如,如果我想要这样的两个输出,长度是一个参数:
output1 <= array[0];
output2 <= {array[length-1],...,array[1]};
我已经为此苦苦思索了一两分钟,但在我的互联网搜索中没有找到任何东西……希望我说得足够清楚了……
假设您有以下条件:
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
不过,您的数组元素需要是连续的。
您可以尝试将循环中的数组分配给变量 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 +:
这里完全是菜鸟,只是为了清楚。学习 Verilog 仅一个月左右。
所以我有一些用户定义的参数,我想将所有项目串联成一个数组。例如,如果数组长度是静态的(在本例中,是一个包含 10 个 12 位项的数组),我当然可以这样做:
reg [11:0] array [9:0];
output <= {array[9],...,array[0]};
但是如果数组长度是用户定义的而不是静态值怎么办?例如,如果我想要这样的两个输出,长度是一个参数:
output1 <= array[0];
output2 <= {array[length-1],...,array[1]};
我已经为此苦苦思索了一两分钟,但在我的互联网搜索中没有找到任何东西……希望我说得足够清楚了……
假设您有以下条件:
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
不过,您的数组元素需要是连续的。
您可以尝试将循环中的数组分配给变量 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 +: