2013-04-16 3 views
0

Я ищу логический ИЛИ шины.Verilog: Большой автобус ИЛИ синтез

Рабочий код:

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]} 

работает отлично, несмотря на конкатенацию создания шины, с оригинальным не-разделенным объектом автобус, чтобы начать с ...

Мы используем генерировать блоки для создания различных сигналов, проводов, регистров и т. д. с целью расширения расширяемого параметризованного кода. Кажется, позор, если синтаксис для шины ИЛИ настолько подвержен ошибкам.

То, что я бы хотел, было так просто, как wire bus_or = | my_bus;

Извините. Очень простой ответ !!!

Обозначение wire bus_or = |my_bus; прекрасно работает, когда автобус объявлен как вектор, НО НЕ когда его массив: см. here.

ответ

5

Вы не определяете битовую шину N, а коллекцию 1 битных шин.

Вы действительно хотите:

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

Это должно позволить следующее работать.

wire bus_or = |my_bus; 

NB: Хорошая практика заключается в том, чтобы сделать постоянный верхний регистр. WIDTH вместо Width. Могут быть добавлены некоторые семантики к нему, W_DATA или W_CONTROL и т. Д.

0

Morgan ответил правильно, вы должны определить свою шину в формате упакованного массива для выполнения операции на всей шине.

данные_тип [ширина-1: 0] автобус. В памяти он будет сохранен как
| x | bus_width-1 | ..... | bus_1 | bus_0 |

Распакованного массив используется для выполнения Побитового операцию DATA_TYPE автобуса [ширина-1: 0] в памяти будет сохранен как
| х | х | bus_0 |
| x | x | bus_1 |
| x | x | bus_1 |
.
.
.
| x | x | bus_width-1 |

Смежные вопросы