Verilog定义向量的数组后如何选择某个向量?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Verilog定义向量的数组后如何选择某个向量?相关的知识,希望对你有一定的参考价值。
在Verilog中定义了向量的数组后,如何选择其中某个变量?
比如如下定义 reg [15:0] register [15:0]; 如果我想选择第一个向量应该怎么选,是register[0]吗?那如果我要选择第一个向量的第一位呢?是register[0][0]吗?
摘抄一段verilog2001的介绍:
The Verilog-1995 standard does not permit directly accessing a bit or part select of an array word. A full array word has to copied to a temporary variable, and the bit or part selected from the temporary variable. Verilog-2001 removes this restriction, and allows bit selects and part
selects of array words to be directly accessed. For example:
//select the high-order byte of one word in a
//2-dimensional array of 32-bit reg variables
reg [31:0] array2 [0:255][0:15];//多维数组也被允许了
wire [7:0] out2 = array2[100][7][31:24] ; 参考技术A 不行必须如下写
wire[15:0] wreg = reg[0];
wire bit0 = wreg[0]; 参考技术B 呵呵,我觉得也可以这样做
如何将向量转换为 typedef 类型的数组
【中文标题】如何将向量转换为 typedef 类型的数组【英文标题】:How to convert a vector to an array of a typdef type 【发布时间】:2016-04-12 15:25:22 【问题描述】:我在头文件中定义了一个 typedef:
typedef unsigned char BYTE;
我有以下代码:
BYTE rgbPlaintext[] = 0x00;
rgbPlaintext* = &vec[0];
vec
是一个由文件填充的unsigned char
数组(没有问题)。我的问题是,上面的代码没有成功构建,它说的是syntax error : '='
rgbPlaintext* = &vec[0];
行
如何成功地将数组指向向量中属于 typedef 基础类型的数组?
谢谢。
【问题讨论】:
停止使用数组。BYTE *rgbPlaintext = &vec[0];
rgbPlaintext
是一个数组,你不能让它指向另一个数组。你想要什么?
我需要一个 BYTE 数组,以便我可以将它传递给接受 BYTE[] 输入的方法
@ITWorker 可以直接传递&vec[0]
。或者将vec
的内容复制到rgbPlaintext
,然后传递rgbPlaintext
。
@songyuanyao 在这种情况下,如何从向量复制到数组,即使底层类型相同(无符号字符),类型也不同?
【参考方案1】:
我的问题是,上面的代码没有成功构建,它只是在
rgbPlaintext* = &vec[0];
这一行写了syntax error : '='
您收到错误是因为编译器需要乘法运算符的右手参数,但发现=
不是乘法运算符的有效操作数。我觉得乘法不是你的本意。
如何将向量转换为 typdef 类型的数组
向量不能转换为数组。
也许您的意思是将向量的内容复制到一个数组中。很简单:
std::copy(vec.begin(), vec.end(), rgbPlaintext);
但是,您需要小心。如果数组小于向量,那么它会溢出并且你得到未定义的行为。
如何才能成功地将数组指向...的数组
数组不指向任何东西,你不能让它们指向任何东西。数组包含个对象。
在这种情况下,数组rgbPlaintext
包含一个值为0x00
的元素。您可以使用我展示的方法将向量的内容复制到rgbPlaintext
,但是如果向量包含多个元素,则副本会溢出。
如果数组所基于的向量由数据文件填充,如何知道所需数组的大小?
可以使用std::vector::size()
知道向量的大小。但是在编译时无法知道大小,因此如果您打算将内容复制到数组并且无法限制最大大小,那么您不能使用自动或静态分配的数组。您可以使用动态分配的数组,为此,我建议使用std::vector
。
将一个向量复制到另一个向量很简单:
std::vector<BYTE> rgbPlaintext = vec;
只要BYTE
与decltype(vec)::value_type
的类型相同,就可以了。一种类型是否是另一种类型的别名并不重要。
【讨论】:
如果数组所基于的向量由数据文件填充,如何知道所需数组的大小?【参考方案2】:代码:
rgbPlaintext* = &vec[0]; // vec 是一个无符号字符数组
如另一篇文章所述,语法不正确 rgbPlaintext*。
执行以下操作:
我如何才能成功地将数组指向向量中属于 typedef 基础类型的数组?
我将假设您真正所说的 vec 是来自 std 的向量,其中包含无符号字符数组。如果是这种情况,那么我将执行以下操作:
BYTE* rgbPlaintext = NULL;
rgbPlaintext = vec[0]; // any subscript of the list of arrays
cout << rgbPlainText[0] << endl; // return the first value at sub of array attained from vec
这是一个小测试程序来澄清我的理解:
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char** argv )
typedef unsigned char NBYTE;
typedef vector<NBYTE*> TEST_ARRAYBYTE;
NBYTE *rgbPlaintext = NULL;
NBYTE testarray[] = '2', '1';
NBYTE testarray1[] = '1', '2';
TEST_ARRAYBYTE vec;
vec.push_back(testarray);
vec.push_back(testarray1);
rgbPlaintext = vec[0];
cout << rgbPlaintext[0] << endl;
rgbPlaintext = vec[1];
cout << rgbPlaintext[0] << endl;
【讨论】:
以上是关于Verilog定义向量的数组后如何选择某个向量?的主要内容,如果未能解决你的问题,请参考以下文章