2014-03-18 2 views
0

Я создал два разных модуля Verilog (shiftByImm и immShifter). То, что я хочу сделать, - это выбрать только выход одного из двух в качестве вывода этого небольшого модуля мультиплексора, который я создаю.Verilog: выберите один из двух экземпляров в качестве вывода

module superShifter(input [0:31] in, input select, input [0:4] shift_value, input[0:1] shift, output reg [0:31] out); 

shiftByImm shift0(in, shift_value, shift, out); 
immShifter shift1(in, shift_value, out); 

assign {out} = select == 1'b0 ? shift0 : shift1; 

endmodule 

Однако, это дает мне две совершенно понятные ошибки:

Illegal ссылку на интерфейс "shift0" and Illegal ссылку на интерфейс "SHIFT1"

Я знаю, что есть что-то здесь отсутствует. Как выбрать выход модуля SuperShifter для того же выхода одного из готовых модулей?

ответ

3

Вы имеете дело с вашими соглашениями об именах. У вас есть 2 модуля (я предполагаю) с двумя разными выходами, но вы даете им одно и то же имя. В этом примере вы используете метод заказа порта. Имена в круглых скобках связаны неявно по порядку и не должны совпадать с тем, что они находятся внутри экземпляра. Другой способ - подключить порты по имени. В этом примере показаны оба метода. С этого момента вам придется использовать прокси, объявленные для выбора вывода с помощью вашего «маленького мультиплексора».

module superShifter(input [0:31] in, input select, input [0:4] shift_value, input[0:1] shift, output reg [0:31] out); 

wire [0:31] temp_out_0; 
wire [0:31] temp_out_1; 

shiftByImm shift0(in, shift_value, shift, temp_out_0); 
immShifter shift1(.in(in), .shift_value(shift_value), .out(temp_out_1)); 

assign {out} = select == 1'b0 ? temp_out_0 : temp_out_1; 

endmodule 
1

Исходя из @ N8TROs ответа, похоже, вы пытаетесь «назвать» модули и они генерируют выходной сигнал.

Модули не эквивалентны задачам, которые вызываются при необходимости, они представляют собой физические блоки оборудования. Мультиплексор должен выбрать вывод , который вы не хотите, чтобы модуль был активным.

Поскольку у вас есть оба модуля, управляющих одним и тем же выходом, вы, вероятно, увидите x. Когда один модуль подключается к 1, а другой 0, провод или сеть в конечном итоге конфликтуют.

Я действительно согласен с рекомендацией N8TROs использовать порты с именем ANSI, это действительно отладка и поддержка кода.

но для краткости и видеть минимальные изменения в коде, чтобы заставить его работать:

shiftByImm shift0(in, shift_value, shift, out0); //<-- Unique output 
immShifter shift1(in, shift_value, out1);  //<-- Unique output 

assign {out} = select == 1'b0 ? out0: out1; //<-- select output 
Смежные вопросы