在下面的代码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
上显示更改值,以证明值正在递增但不是。
答案 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
行连接到多路复用器。