我刚刚开始学习 verilog,我试图创建一个找到序列 1010 的机器,所以我写了这个:
module Find1010(input clk, input in, output reg out);
reg [1:0]st = 0;
wire a = {st[0], in} == 2'b10;
wire b = {st , in} == 3'b101;
always @(posedge clk)
begin
out = a & st[1];
st = {a | b, in};
end
endmodule
它起作用了,但后来我改变了行 wire a = {st[0], in} == 2'b10;
至 wire a = st[0] & ~in;
然后输出始终为 0。为什么会发生这种情况以及 {st[0], in} == 2'b10
之间有什么区别和st[0] & ~in
?
这是我写的测试平台:
module Test;
reg in = 0, clk = 1;
wire result;
initial begin
#4 in = 1;
#4 in = 0;
#2 in = 1;
#2 in = 0;
#2 in = 1;
#2 in = 0;
#2 in = 1;
#4 in = 0;
#2 in = 1;
#2 in = 0;
#3 $finish;
end
initial forever #1 clk = ~clk;
always @(negedge clk)
$display("Input: %b Output: %b", in , result);
Find1010 Mealy_Machine(
.clk(clk),
.in(in),
.out(result)
);
endmodule
最佳答案
没有区别(除非涉及 X)
问题是您的测试台中存在竞争条件。您需要对 in
使用非阻塞赋值。或者更改时钟周期,以便对 in
的更改不会落在时钟边沿。
关于verilog - verilog 中 {a,b} == 2'b10 和 a & ~b 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47914476/