【发布时间】:2019-07-17 04:07:34
【问题描述】:
Verilog case 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;
leds 是相同的模式 1010
同样在执行此代码后,指示灯不亮
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
但如果我执行此操作,leds 会亮起,模式 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
不明白 case 语句在 verilog 中是如何工作的
【问题讨论】:
-
我可以看到你没有给
dataread任何值,所以它都是XXX-es。阅读 Verilog 规则以判断数据是否为 1 或 0。 -
@Oldfart 感谢您的回答,是的,您是对的,但为什么要在 LED 上使用第三个代码? if(dataread==32'b101010101010) ledss='b1010;这条规则是否也适用于 if 语句?如果是,为什么这条规则不适用于第二个代码?
-
1.你到底想达到什么目的?您的代码似乎比它可能更复杂。 2.你应该在always块中使用非阻塞赋值。 3. 请注意,您的比较(最后一段代码)导致1-bit uknown value。因此,大多数工具将consider it false。在我使用 LED 的工具中不会打开。
-
@Qiu 我想从 1 个端口 ram ip 读取。添加 if 语句后的结果相同。用于测试的 Ram 充满了 1s。还是不明白为什么会亮。代码pastebin.com/8snsegVx
-
我认为是硬件问题或编译器错误,无法解释为什么会发生这种情况。即使在执行此pastebin.com/VL1FuiZD 之后,leds 仍处于模式 1010