我正在寻找公共汽车的逻辑或。
工作代码:
parameter Width = 8;
wire my_bus [Width-1:0];
wire bus_or = (my_bus[0] || my_bus[1] || ... || my_bus[Width-1])
工作正常,但完全不适合大型总线(即64位)
我见过:(来自here)
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;
表示法正常工作但不是当它的数组时:here。
答案 0 :(得分:5)
您没有定义N位总线,而是定义1位总线的集合。
你真的想要:
parameter Width = 8;
wire [Width-1:0] my_bus ;
这应该允许以下工作。
wire bus_or = |my_bus;
注意:将常量设为大写是一种好习惯。 WIDTH而不是Width。也可以为它添加一些语义,W_DATA或W_CONTROL等。
答案 1 :(得分:0)
Morgan已正确回复,您必须以压缩数组格式定义总线,以便在整个总线上执行操作。
data_type [width-1:0]总线。
在内存中,它将被存储为
| X | bus_width-1 | ..... | bus_1 | bus_0 |
解压缩数组用于执行按位操作
data_type总线[width-1:0]
在内存中将存储为
| X | X | bus_0 |
| X | X | bus_1 |
| X | X | bus_1 |
。
。
。
| X | X | bus_width-1 |