Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: microblaze verilog, ошибка при компиляции
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
serg_k1
система с головной microblaze и подчиненный data_video_in_out . В microblaze добавлены

input [31:0] DIP_Switches_32Bits_GPIO_IO_I_pin;
input [4:0] Push_Buttons_5Bits_GPIO_IO_I_pin;
output clock_generator_0_CLKOUT4_pin;

RESET и clock_generator_0_CLKOUT4_pin входные для data_video_in_out ,
в нем data_v_out(DIP_Switches_32Bits_GPIO_IO_I_pin ) и strob_v_out(Push_Buttons_5Bits_GPIO_IO_I_pin )
выходы и входы для microblaze.
симуляция в Isim работает. правда для этого потребовалось убрать в сгенерированном Verilog Test Fixture

//reg [31:0] DIP_Switches_32Bits_GPIO_IO_I_pin;
//reg [4:0] Push_Buttons_5Bits_GPIO_IO_I_pin;

при компиляции выдает следующую ошибку

Multi-source in Unit <mb_top> on signal <Push_Buttons_5Bits_GPIO_IO_I_pin<4>>; this signal is connected to multiple drivers.
такая же выдается для всех Push_Buttons_5Bits_GPIO_IO_I_pin и DIP_Switches_32Bits_GPIO_IO_I_pin
но они же и должны быть для одного входы для другого выходы.
Сначала было

Код
assign  DIP_Switches_32Bits_GPIO_IO_I_pin = data_v_out;
...
.data_v_out(data_v_out ),
...
...
результат тот же.
где ошибка?

Код

// mb_top.v
//-----------------------------------------------------------------------------

module mb_top
  (
   ...
   RESET,
   ...
    DIP_Switches_4Bits_TRI_I,
    CLK_P,
    CLK_N,
    DIP_Switches_32Bits_GPIO_IO_I_pin,
    Push_Buttons_5Bits_GPIO_IO_I_pin,
    clock_generator_0_CLKOUT4_pin
  );
  
...
  input [3:0] DIP_Switches_4Bits_TRI_I;
  input CLK_P;
  input CLK_N;
  input [31:0] DIP_Switches_32Bits_GPIO_IO_I_pin;
  input [4:0] Push_Buttons_5Bits_GPIO_IO_I_pin;
  output clock_generator_0_CLKOUT4_pin;

  (* BOX_TYPE = "user_black_box" *)
  mb
    mb_i (
      
      ...
     ...
    
      .DIP_Switches_4Bits_TRI_I ( DIP_Switches_4Bits_TRI_I ),
      .CLK_P ( CLK_P ),
      .CLK_N ( CLK_N ),
      .DIP_Switches_32Bits_GPIO_IO_I_pin ( DIP_Switches_32Bits_GPIO_IO_I_pin ),
      .Push_Buttons_5Bits_GPIO_IO_I_pin ( Push_Buttons_5Bits_GPIO_IO_I_pin ),
      .clock_generator_0_CLKOUT4_pin ( clock_generator_0_CLKOUT4_pin )
    );

wire RESET, clock_generator_0_CLKOUT4_pin;
wire [31:0] DIP_Switches_32Bits_GPIO_IO_I_pin;
wire [4:0] Push_Buttons_5Bits_GPIO_IO_I_pin;



// Instantiate the module
data_video_in_out instance_name (
    ...

    .clock_mb(clock_generator_0_CLKOUT4_pin),
    .reset(RESET),
    .data_v_out(DIP_Switches_32Bits_GPIO_IO_I_pin ),

    ...

   .strob_v_out(Push_Buttons_5Bits_GPIO_IO_I_pin )
    );
    
endmodule


если задать разные имена , то ошибка будет
<DIP_Switches_32Bits_GPIO_IO_I_pin_1> is already implicitly declared earlier.
если же убрать декларацию wire , то ошибок нет . но тогда шины превращаются в одиночную. что не нужно.
Golikov A.
this signal is connected to multiple drivers
означает что у вас есть несколько источников которые пытаются изменить этот сигнал.

как среде различить

input [31:0] DIP_Switches_32Bits_GPIO_IO_I_pin;
input [4:0] Push_Buttons_5Bits_GPIO_IO_I_pin;
output clock_generator_0_CLKOUT4_pin;

и

wire RESET, clock_generator_0_CLKOUT4_pin;
wire [31:0] DIP_Switches_32Bits_GPIO_IO_I_pin;
wire [4:0] Push_Buttons_5Bits_GPIO_IO_I_pin;

wire я так понимаю нужен чтобы связать 2 блока, у одного эти выключатели выходные, у другого входные,

и есть еще общий выход из этого блока? Тогда наверное имеет смысл порты выхода назвать не так как wire
и добавить процедуру assign, только надо учитывать
если у вас есть
вход выключатель А
есть выход другого блока выключатель В
и вход 3 блока выключатель С

то нельзя все эти 3 блока связать, потому что на вход выключатель С пойдут выключатель В и А, и как понять кто из них главный? что собственно у вас и произошло.

input [31:0] DIP_Switches_32Bits_GPIO_IO_I_pin; - входной сигнал управляется снаружи
data_v_out(DIP_Switches_32Bits_GPIO_IO_I_pin ) - я так понимаю выходной модуля, то есть внутри модуля он меняется
и все это
DIP_Switches_32Bits_GPIO_IO_I_pin ( DIP_Switches_32Bits_GPIO_IO_I_pin )
на вход 3 модулю...
serg_k1
Цитата(Golikov A. @ May 28 2013, 14:58) *
wire я так понимаю нужен чтобы связать 2 блока, у одного эти выключатели выходные, у другого входные,

и есть еще общий выход из этого блока? Тогда наверное имеет смысл порты выхода назвать не так как wire
и добавить процедуру assign, только надо учитывать
если у вас есть
вход выключатель А
есть выход другого блока выключатель В
и вход 3 блока выключатель С

то нельзя все эти 3 блока связать, потому что на вход выключатель С пойдут выключатель В и А, и как понять кто из них главный? что собственно у вас и произошло.

я все это понимаю. как избавиться?
два блока, связаны четырмя сигналами. у одного reset и CLKOUT4 выходы. У другого это входы. с ними все нормально.
у второго есть выходы Push_Buttons_5Bits_GPIO_IO_I_pin -шина 5 сигналов и DIP_Switches_32Bits_GPIO_IO_I_pin -32 сигнала. это входы для первого.
wire используется для соединения.
это то что нужно и что по моему сделано. и здесь нет неопределенности, т.е. я не виже где два сигнала подаются.
пробовал другое.

Код
mb_i (
      .DIP_Switches_32Bits_GPIO_IO_I_pin ( DIP_Switches_32Bits_GPIO_IO_I_pin ),
      .Push_Buttons_5Bits_GPIO_IO_I_pin ( Push_Buttons_5Bits_GPIO_IO_I_pin  ),
      .clock_generator_0_CLKOUT4_pin ( clock_generator_0_CLKOUT4_pin )
    );
data_video_in_out instance_name (
    
    .clock_mb(clock_generator_0_CLKOUT4_pin),
    .reset(RESET),
    .data_v_out(DIP_Switches_32Bits_GPIO_IO_I_pin_wire ),
    
    .strob_v_out(Push_Buttons_5Bits_GPIO_IO_I_pin_wire )
    );



// для выхода из второго
wire [31:0] DIP_Switches_32Bits_GPIO_IO_I_pin_wire;  
wire [4:0] Push_Buttons_5Bits_GPIO_IO_I_pin_wire;  
  
// для ввода в первый
wire [31:0] DIP_Switches_32Bits_GPIO_IO_I_pin;  
wire [4:0] Push_Buttons_5Bits_GPIO_IO_I_pin;
assign  Push_Buttons_5Bits_GPIO_IO_I_pin = Push_Buttons_5Bits_GPIO_IO_I_pin_wire;
assign  DIP_Switches_32Bits_GPIO_IO_I_pin = DIP_Switches_32Bits_GPIO_IO_I_pin_wire;


результат тот же.
если убрать декларацию в для ввода в первый , то ошибок нет. но нарушается разрядность сигналов.
Golikov A.
module mb_top
input [31:0] DIP_Switches_32Bits_GPIO_IO_I_pin;
это 32 пина входных, то есть снаружи блока их могут менять

mb_i
.DIP_Switches_32Bits_GPIO_IO_I_pin ( DIP_Switches_32Bits_GPIO_IO_I_pin ),
это еще 32 пина которые идут в модуль МБ_И,
у них тоже имя, и среда их направила со входа главного модуля в этот

а дальше

data_video_in_out instance_name (
.data_v_out(DIP_Switches_32Bits_GPIO_IO_I_pin_wire ),
еще 32 пина которые идут из модуля видео_ин_аут, и поскольку
дальше
assign DIP_Switches_32Bits_GPIO_IO_I_pin = DIP_Switches_32Bits_GPIO_IO_I_pin_wire
фактически они тоже имя (DIP_Switches_32Bits_GPIO_IO_I_pin) и среда их воткнул на вход блока мб и подключила к ним вход верхнего блока

входной сигнал главного модуля и выходной ин оута конфликтуют.

допустим у вас есть MB с сигналом SIGNAL_IN
есть VIDEO_OUT с сигналом SIGNAL_OUT
делаете

wire [31:0] signal_wire

и даете им обоим на вход (поставьте в скобочки при подключении блока), это свяжет ваши 2 блока между собой.

MB(
....
.SIGNAL_IN(signal_wire)
...

VIDEO_OUT(
...
.SIGNAL_OUT(signal_wire)
...

в вашем последнем коде все верно, можно только использовать 1 wire, и надо убедиться что в объявлении верхнего модуля в котором вставлены эти 2 блока нет входов с тем же именем, а именно DIP_Switches_32Bits_GPIO_IO_I_pin,



как это нарушается разрядность? по каким критериям это видно? Внутри блоков правильная разрядность?
serg_k1
Цитата(Golikov A. @ May 28 2013, 17:17) *
входной сигнал главного модуля и выходной ин оута конфликтуют
допустим у вас есть MB с сигналом SIGNAL_IN
есть VIDEO_OUT с сигналом SIGNAL_OUT
делаете

wire [31:0] signal_wire

и даете им обоим на вход (поставьте в скобочки при подключении блока), это свяжет ваши 2 блока между собой.

MB(
....
.SIGNAL_IN(signal_wire)
...

VIDEO_OUT(
...
.SIGNAL_OUT(signal_wire)
...

в вашем последнем коде все верно, можно только использовать 1 wire, и надо убедиться что в объявлении верхнего модуля в котором вставлены эти 2 блока нет входов с тем же именем, а именно DIP_Switches_32Bits_GPIO_IO_I_pin,



как это нарушается разрядность? по каким критериям это видно? Внутри блоков правильная разрядность?

насколько я понимаю я так и делал с самого начала.

Код
module mb_top
  (
    
    DIP_Switches_32Bits_GPIO_IO_I_pin,
    Push_Buttons_5Bits_GPIO_IO_I_pin,
    clock_generator_0_CLKOUT4_pin
  );

  input [31:0] DIP_Switches_32Bits_GPIO_IO_I_pin;
  input [4:0] Push_Buttons_5Bits_GPIO_IO_I_pin;
  output clock_generator_0_CLKOUT4_pin;

  (* BOX_TYPE = "user_black_box" *)
  mb
    mb_i (
      
      .DIP_Switches_32Bits_GPIO_IO_I_pin ( DIP_Switches_32Bits_GPIO_IO_I_pin ),
      .Push_Buttons_5Bits_GPIO_IO_I_pin ( Push_Buttons_5Bits_GPIO_IO_I_pin  ),
      .clock_generator_0_CLKOUT4_pin ( clock_generator_0_CLKOUT4_pin )
    );
data_video_in_out instance_name (
  
    .clock_mb(clock_generator_0_CLKOUT4_pin),
    .reset(RESET),
    .data_v_out(DIP_Switches_32Bits_GPIO_IO_I_pin ),    
     .strob_v_out(Push_Buttons_5Bits_GPIO_IO_I_pin )
    );    
endmodule


Push_Buttons_5Bits_GPIO_IO_I_pin встречается только здесь в вышеприведенном и в module mb и это делала среда ISE. и это вход. и он должен просто завести данные в mb.и дальше работает программа.
Код
module mb
  (
DIP_Switches_32Bits_GPIO_IO_I_pin,
    Push_Buttons_5Bits_GPIO_IO_I_pin,
);

input [31:0] DIP_Switches_32Bits_GPIO_IO_I_pin;
  input [4:0] Push_Buttons_5Bits_GPIO_IO_I_pin;

assign DIP_Switches_32Bits_GPIO_IO_I = DIP_Switches_32Bits_GPIO_IO_I_pin;
  assign Push_Buttons_5Bits_GPIO_IO_I = Push_Buttons_5Bits_GPIO_IO_I_pin;
  assign clock_generator_0_CLKOUT4_pin = clock_generator_0_CLKOUT4;


Isim все показывает нормально. strob_v_out, Push_Buttons_5Bits_GPIO_IO_I_pin, Push_Buttons_5Bits_GPIO_IO_I совпадают.
где конфликт???
Golikov A.
data_v_out
это входной или выходной порт?

по названию выходной.
Получается что входные сигнал МБ_ТОП вы заводите на вход БМ - это нормально, но потом их же заводите на дата_в_оут, и если это выходной порт, то вы фактически вход на выход пихаете...
serg_k1
Цитата(Golikov A. @ May 29 2013, 13:08) *
data_v_out
это входной или выходной порт?

по названию выходной.
Получается что входные сигнал МБ_ТОП вы заводите на вход БМ - это нормально, но потом их же заводите на дата_в_оут, и если это выходной порт, то вы фактически вход на выход пихаете...

data_v_out - выходной.
.data_v_out(DIP_Switches_32Bits_GPIO_IO_I_pin ), это значит что контакт data_v_out (это выход) подключен к DIP_Switches_32Bits_GPIO_IO_I_pin (который вход)
Golikov A.
замечательно, а куда подключены
input [31:0] DIP_Switches_32Bits_GPIO_IO_I_pin;

модуля mb_top? внутри которого ваши модули соединены?

на тот же вход. Вы не видите в этом проблемы?
serg_k1
Цитата(Golikov A. @ May 29 2013, 15:34) *
замечательно, а куда подключены
input [31:0] DIP_Switches_32Bits_GPIO_IO_I_pin;

модуля mb_top? внутри которого ваши модули соединены?

на тот же вход. Вы не видите в этом проблемы?

да, теперь вижу. получается связь через топ пин. и там нужно, чтобы эту связь сделать , два пина вход и выход.
я пытался связать их напрямую.т.е. не через пины верхнего уровня, но в нем.
wire[31:0] data; wire [5:0]Push; и их в связи. и все нормально в симуляторе , но при компиляции выдает ошибку что data и Push уже задекларированы. а когда я убираю декларацию, вот тут и возникает ошибка потери разрядности. т.е. они превращаются в одноразрязрядные.
Golikov A.
регистры и провода надо декларировать до добавления модулей, иначе такую фигню пишут.

то есть

wire [31: 0] Signal


mb (

.signal_in(Signal)
...

video (
.signal_out(Signal)
...

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

serg_k1
Цитата(Golikov A. @ May 29 2013, 17:49) *
регистры и провода надо декларировать до добавления модулей

да, так и есть. все прошло.
огромное спасибо за помощь.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.