我给了一个组合电路,我将为该电路设计一个verilog代码。这是关于状态机的。方程是:
A(t+1)=A(t)+B(t);
B(t+1)=A(t)'+B(t);
没有其他输出或输入。我尝试了很少的代码而且没有用。我对assignig A,B,A_next,B_next作为输入,输出和连线感到困惑。任何人都可以给我一点线索,以便我可以再试一次吗?
module statemac_posed(clk,a,b);
input clk;
output a,b;
reg a_next,b_next;
always@(posedge clk)
begin
a=a_next;
b=b_next;
a_next=a|b;
b_next=~a|b;
end
endmodule
答案 0 :(得分:2)
触发器的输出是你的下一个值,就像你可以写的同步逻辑一样:
对于FPGA intial
可用于设置ASIC的有效低复位的初始值
module statemac_posed(
input clk,
output reg a,
output reg b
);
initial begin
a = 'b0;
b = 'b0;
end
//On clock edge update a &b with new values based on previous a & b value
always@(posedge clk) begin
a <= a|b;
b <= ~a|b;
end
endmodule
这相当于:
module statemac_posed(
input clk,
output reg a,
output reg b
);
reg a_next;
reg b_next;
//Combinatorial take outputs from flip-flops and combinatorial define next value
always @* begin
a_next = a|b;
b_next = ~a|b;
end
initial begin
a = 'b0;
b = 'b0;
end
//on Clock edge take the next values
always @(posedge clk) begin
a <= a_next;
b <= b_next;
end
endmodule
分配到initial
或always
内的任何变量都必须属于reg
类型。如果使用SystemVerilog,logic
也有效。不这样做是你在评论中提到的错误的原因。
这应该可以让我们深入了解如何使用verilog
注意:使用阻塞(=
)和组合(@*
)。非阻塞(<=
)边缘触发(@(posedge clk)
)以正确描述硬件。