状态机的verilog代码

时间:2014-12-25 10:09:03

标签: verilog

我给了一个组合电路,我将为该电路设计一个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

1 个答案:

答案 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

分配到initialalways内的任何变量都必须属于reg类型。如果使用SystemVerilog,logic也有效。不这样做是你在评论中提到的错误的原因。

这应该可以让我们深入了解如何使用verilog 注意:使用阻塞(=)和组合(@*)。非阻塞(<=)边缘触发(@(posedge clk))以正确描述硬件。