Verilog案例statmenet表达式始终为真
module test(input clk,
input reset,
output reg[3:0] ledss
);
reg[31:0] dataread;
always @(posedge clk)
begin
case(dataread)
32'b1010101010101010101:ledss='b1010;
endcase
end
endmodule
不明白为什么执行此行
32'b1010101010101010101:ledss='b1010;
LED的图案相同1010
同样在执行此代码后,LED仍未亮起
module test(input clk,
input reset,
output reg[3:0] ledss
);
reg[31:0] dataread;
always @(posedge clk)
begin
if(dataread==32'b1010101010101010101) ledss='b1010;
end
endmodule
但是如果我执行此操作,LED将亮起,模式1010
module test(input clk,
input reset,
output reg[3:0] ledss
);
reg[31:0] dataread;
always @(posedge clk)
begin
case(dataread)
32'b101010101010:
begin
if(dataread==32'b101010101010) ledss='b1010;
end
endcase
end
endmodule
不了解案例陈述在verilog中如何工作
答案 0 :(得分:0)
我相信您会跳过Verilog仿真,并将代码直接加载到FPGA。
在模拟中。 ledss
将是X,直到满足模式匹配为止(case
或if
)。在提供的代码中,dataread
从未分配,因此它将是X,因此在仿真中,ledss
将始终是X。在pastebin链接中,dataread
由ROM输出驱动,因此将具有可能符合检查条件的已知输出。
FPGA合成您的RTL,并且通常会进行一些优化。 ledss
未显式初始化,并且只有一个可能的值(如果已分配)。因此,优化器可能会认为初始值无关紧要,然后通过选择初始值与可以分配给它的唯一可能值相同来简化逻辑。或者可以假定初始值为0并保留逻辑。通常,对于这种情况,case
倾向于遵循前者,而if
倾向于遵循后者。尽管您的代码在功能上是等效的,但只包含一个条件的案例陈述并不常见。
我建议您改善编码风格,以便合成器和任何阅读您的代码的人都能更清楚地理解您的预期行为。波纹管是一些建议。请记住为dataread
分配一个已知值。 (注意:为了便于阅读,将32'b1010101010101010101
替换为等效的32'h0005_5555
)
always @(posedge clk)
begin
case(dataread)
32'h0005_5555 : ledss <= 4'b1010;
default : ledss <= 4'b1111;
endcase
end
或等效名称:
always @(posedge clk)
begin
if (dataread == 32'h0005_5555)
ledss <= 4'b1010;
else
ledss <= 4'b1111;
end
如果您希望ledss
在分配后保持1010模式,则可以执行以下操作:
always @(posedge clk)
begin
if (reset) begin
ledss <= 4'b1111;
end
case(dataread)
32'h0005_5555 : ledss <= 4'b1010;
endcase
end
或等效名称:
always @(posedge clk)
begin
if (reset) begin
ledss <= 4'b1111;
end
else if (dataread == 32'h0005_5555) begin
ledss <= 4'b1010;
end
end