Block未连接,将被修剪Verilog

时间:2013-03-07 16:04:38

标签: verilog xilinx

在下面的代码BCDtoSevenDecode中获取4位输入并将其解码为七段显示。解码结果存储在resultx变量中。然后将所有resultx变量传递给4x1 Mux。我正在使用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上显示更改值,以证明值正在递增但不是。

2 个答案:

答案 0 :(得分:3)

根据当前有关代码的修订更新答案,某些更多信息可能不再适用于最新版本的问题。

问题包含这段代码:

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;无条件地覆盖了Mux az( .sel( ), .in1( result1), .in2( result2), .in3( result3), .in4( result4), .clk( clk ), .rst( reset ), .out( out ) );

顶级模块是CounterTOP,输出[7:0]输出,由MUX的[6:0]输出'输出'驱动。因此,out的MSB(最高有效位)将是z,即未驱动的。

以下一些建议改进:

我会避免混合变量的情况,你的Sel和模块称为Mux。我更喜欢将所有小写保持为小写,除了(本地)参数是大写的。分数下划分通常用于CamelCase。即我会将模块SevenDecoder写为seven_decoder。我认为这有助于提高可读性,并且一些模拟器不区分大小写,因此在使用混合大小写时,可能会有因形而异的变量开始相互干扰。混合变量的情况会使拼写错误更有可能。

使用正确对齐的代码可以更容易地看到错误,编辑也可以更快,因为您可以开始使用编辑器的列模式。

如果您使用命名端口,则查看代码会更容易,但很难发现连接错误。

always @(posedge clk)

虽然对当前错误不感兴趣,但我建议您修改=块中的作业。

您目前正在使用阻止<=分配,这可能导致模拟和硬件之间的差异。这变得非常难以调试。在时钟触发的块中,您应该使用非阻塞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 分配。

嵌套的if语句也可以用case语句替换:

{{1}}

答案 1 :(得分:1)

看起来您没有将任何select行连接到多路复用器。