0

我正在寻找对总线进行逻辑或运算。

工作代码:

parameter Width = 8;
wire my_bus [Width-1:0];
wire bus_or = (my_bus[0] || my_bus[1] || ... || my_bus[Width-1])

这工作正常,但完全不适合大型总线(即 64 位)

我见过:(从这里

wire bus_or = |my_bus;

然而,这只是抱怨错误:一元运算符'|'的非法操作数 和连续分配的非法右手边。

有趣的是语法:

wire bus_or = |{my_bus[0], my_bus[1], ..., my_bus[Width-1]} 

工作正常,尽管连接创建了一个总线,原始的未拆分对象是一个总线开始......

我们正在使用生成块来创建各种信号、线路、寄存器等,目的是实现可扩展的参数化代码。如果总线 OR 的语法如此容易出错,这似乎是一种耻辱。

我想要的是像wire bus_or = |my_bus; 这样简单的东西。

对不起。很简单的回答!!!

wire bus_or = |my_bus;当总线被声明为向量但不是数组时,该符号工作正常:请参见此处

4

2 回答 2

5

您不是在定义 N 位总线,而是定义 1 位总线的集合。

你真的想要:

parameter Width = 8;
wire [Width-1:0] my_bus ;

这应该允许以下工作。

wire bus_or = |my_bus;

注意:将常量设为大写是一种很好的做法。宽度而不是宽度。也可以为其添加一些语义,W_DATA 或 W_CONTROL 等。

于 2013-04-16T15:24:32.260 回答
0

摩根已正确回答,您必须以打包数组格式定义您的总线才能在整个总线上执行操作。

data_type [width-1:0] 总线。在内存中,它将被存储为
|x|bus_width-1|.....|bus_1|bus_0|

解压后的数组用于执行按位运算 data_type bus [width-1:0] 在内存中将被存储为
|x|x|bus_0|
|x|x|bus_1|
|x|x|bus_1|
.
.
.
|x|x|bus_width-1|

于 2016-10-07T16:07:30.917 回答