1

在以下代码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以证明值正在增加,但事实并非如此。

4

2 回答 2

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;

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

以下是一些推荐的改进:

我会避免混合变量的情况,你 Sel 和称为 Mux 的模块。除了大写的(本地)参数外,我更喜欢将所有内容都保留为小写。Under score delimited 通常用于 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
于 2013-03-07T17:10:22.060 回答
1

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

于 2013-03-07T16:26:09.867 回答