Блок не подключен и будет обрезан Verilog

В следующем коде BCDtoSevenDecode принимает 4-битный ввод и декодирует его для семисегментного дисплея. Декодированный результат сохраняется в переменной resultx. Затем все переменные resultx передаются в мультиплексор 4x1. Я использую xilinx для компиляции этого кода Verilog. Код компилируется с предупреждением:

WARNING:Xst:647 - Input <clk> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.

WARNING:Xst:647 - Input <reset> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.

WARNING:Xst:1306 - Output <select> is never assigned.

Я не могу понять проблему, поэтому я консультируюсь со специалистами здесь.

Вот код:

 module Counter(input clk, input reset, output[3:0]SsdEnable, output [6:0]DecodedOut, output reg [3:0]temp1, output reg [3:0]temp2 , output reg [3:0]temp3, output reg [3:0]temp4);


wire [6:0] Result1,Result2,Result3,Result4;
reg [3:0] count1,count2,count3,count4;

wire [25:0]loop;
wire [11:0]counter;

reg [1:0]Sel;

SevenDecoder u1(count1,Result1);
SevenDecoder u2(count2,Result2);
 SevenDecoder u3(count3,Result3);
SevenDecoder u4(count4,Result4);

Mux u5(Result1,Result2,Result3,Result4,Sel,DecodedOut );
Decoder_2x4 u6(Sel,SsdEnable);


always @(posedge clk or negedge reset)
begin
 if(!reset)
  begin
count1<=0;
count2<=0;
count3<=0;
count4<=0;

//counter=0;
 end
 else
  begin
if(loop==49999999)
begin
    count1<=count1+1;
    if(count1==10)
    begin
        count1<=0;
        count2<=count2+1;
    end

    if(count2==10)
    begin
        count2<=0;
        count3<=count3+1;
    end

    if(count3==10)
    begin
        count3<=0;
        count4<=count4+1;
    end

    if(count4==10)
    begin
        count1<=0;
        count2<=0;
        count3<=0;
        count4<=0;
    end

    temp1<=count1;
    temp2<=count2;
    temp3<=count3;
    temp4<=count4;
end
  loop=loop+1;
 end

end



always @(posedge clk or negedge reset)
begin

if(!reset)
Sel=0;
else
    begin
    if(counter==1000)
    begin
    Sel=0;
    end

end
 counter=counter+1;
end


endmodule


module SevenDecoder(input [3:0]i , output[6:0] out);

assign out[0]= (i == 0 || i == 2 || i == 3 || i == 5 || i == 6 || i == 7 || i == 8 || i == 9) ? 0 : 1;
assign out[1] = (i == 0 || i == 1 || i == 2 || i == 3 || i == 4 || i == 7 || i == 8 || i == 9) ? 0 : 1;
assign out[2] = (i == 0 || i == 1 || i == 3 || i == 4 || i == 5 || i == 6 || i == 7 || i == 8 || i == 9) ? 0 : 1;
assign out[3]= (i == 0 || i == 2 || i == 3 || i == 5 || i == 6 || i == 8 || i == 9) ? 0 : 1;
assign out[4]= (i == 0 || i == 2 || i == 6 || i == 8) ? 0 : 1;
assign out[5]= (i == 0 || i == 4 || i == 5 || i == 6 || i == 8 || i == 9) ? 0 : 1;
assign out[6]= (i == 2 || i == 3 || i == 4 || i == 5 || i == 6 || i == 8 || i == 9) ? 0 : 1;

endmodule

module Mux(input [6:0]in1,input [6:0]in2,input [6:0]in3,input [6:0]in4, input [1:0]sel, output [6:0]out);

assign out=(sel==0)?in1:
            (sel==1)?in2:
            (sel==2)?in3:
            (sel==3)?in4:0;
endmodule



module Decoder_2x4(input [1:0]sel, output [3:0]selSSD);

 assign selSSD=(sel==0)? 4'b1110 :
                (sel==1)? 4'b1101 :
                (sel==2)? 4'b1011 :
                (sel==3)? 4'b0111 :0;

endmodule

Что вызывает эту проблему?

РЕДАКТИРОВАТЬ:

Я разместил весь код здесь. Я пытался отладить его, но мне не удалось найти ошибку в этом коде.

Этот код не дает никакого вывода. Он должен отображать изменяющиеся значения на cnt1,cnt2,cnt3,cnt4 в качестве доказательства того, что значения увеличиваются, но это не так.


person Alfred    schedule 07.03.2013    source источник
comment
Здесь есть очень чистая версия, которая отлично работает и проста для понимания: stackoverflow.com/a/15264689/1906816   -  person N8TRO    schedule 08.03.2013


Ответы (2)


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

Вопрос содержит этот блок кода:

always @(posedge clk or negedge reset)
begin

if(!reset)
Sel=0;
else
    begin
    if(counter==1000)
    begin
    Sel=0;
    end

end
 counter=counter+1;
end

Я бы обновил его до следующего:
counter не сбрасывается, поэтому будет x, x+1 до x.

always @(posedge clk or negedge reset) begin
  if(!reset) begin
    Sel     <= 0;
    counter <= 0;
  end
  else begin
    counter <= counter+1;
    if(counter==1000) begin
      Sel <= 0;
    end
  end
end
endmodule

Я заметил это в части кода, вы не получите желаемого поведения:

  if(iterator==20) begin
    if(out[3:0]==9) begin
      out[3:0] <= 0;
      out[7:4] <= out[7:4]+1;
    end
    ...
    out[3:0]<=out[3:0]+1;

Неблокирующие назначения означают, что он не блокирует выполнение симулятора до конца временного шага, когда он копирует значение. Поэтому я не вижу, как out[3:0]<=0 когда-либо выполняется, поскольку он безоговорочно переопределяется out[3:0]<=out[3:0]+1;

Модуль верхнего уровня — CounterTOP, с выходом [7:0], он управляется выходом [6:0] «выхода» MUX. Следовательно, MSB (старший бит) out будет равен z, то есть неуправляемому.

Некоторые рекомендуемые улучшения ниже:

Я бы не стал смешивать случай переменных, вы Sel и модули, называемые Mux. Я предпочитаю писать все в нижнем регистре, кроме (локальных) параметров, которые в верхнем регистре. Подчеркивание с разделителем часто используется вместо CamelCase. т.е. я бы написал модуль SevenDecoder как seven_decoder. Я думаю, что это способствует удобочитаемости, а некоторые симуляторы не чувствительны к регистру, поэтому при использовании смешанного регистра можно иметь переменные, различающиеся по регистру, которые начинают мешать друг другу. Смешивание регистра переменных повышает вероятность опечаток.

Ошибки легче увидеть с правильно выровненным кодом, редактирование также может быть быстрее, поскольку вы можете начать использовать режим столбца вашего редактора.

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

Mux az(
  .sel(        ), 
  .in1( result1),
  .in2( result2),
  .in3( result3),
  .in4( result4),
  .clk( clk    ),
  .rst( reset  ),
  .out( out    )
);

Хотя это и не связано с текущей ошибкой, которую вы видите, я предлагаю вам исправить ваши назначения в блоках always @(posedge clk).

В настоящее время вы используете блокирующие = назначения, которые могут привести к различиям между симуляцией и оборудованием. который становится очень трудно отлаживать. в блоке, запускаемом часами, вы должны использовать неблокирующие назначения <=.

Вложенные операторы if также можно заменить оператором case:

always @(posedge clk or negedge reset) begin
  if(~reset) begin
    iterator <=0;
    i        <=0;
  end 
  else begin
    case(iterator)
    10, 20, 30 : begin
      i <= i+1;   
      iterator <= iterator + 1;
    end
    40 : begin
      i        <= i+1;
      iterator <= 0;
    end
    default : iterator <= iterator+1;
  endcase
end
person Morgan    schedule 07.03.2013
comment
В порядке. но, пожалуйста, когда вернетесь домой, сообщите мне об ошибках в моем коде, чтобы я мог избежать их в будущем. - person Alfred; 07.03.2013

Похоже, вы не подключили ни одной линии select к мультиплексору.

person Marty    schedule 07.03.2013
comment
Если я сделаю это внутри Mux, я получу ошибку неправильного присваивания, поэтому я делаю это внутри CounterTOP. я обновил код - person Alfred; 07.03.2013
comment
Но select по-прежнему нет в списке портов Mux az(result1,result2,result3,result4,clk,reset,out); ! - person Marty; 07.03.2013
comment
Я публикую обновленный код, теперь он выдает обрезки select и говорит, что никогда не используется - person Alfred; 07.03.2013
comment
ваши iterator и select должны быть в модуле, который создает мультиплексор, т.е. CounterTop, иначе вы не сможете их соединить! Они находятся в BCDtoSevenDecode в вашем последнем коде. Вам также нужно объявить iterator и select как reg. И - как у вас это select станет защелкой, потому что вы не указали значение для него во всех ветвях оператора if! - person Marty; 07.03.2013
comment
Выкладываю весь код. Я пытался отладить его, но я все испортил. - person Alfred; 07.03.2013