在之前的文章中使用了verilog来编写了状态机,本篇文章将使用SpinalHDL来编写一个相同的状态机。在此之前我们先要知道spinal中的状态机是怎么工作的。
1. SpinaHDL怎么编写状态机
下面我们来看SpinalHDL中对状态机的描述
名称 | 描述 |
---|---|
onEntry{语句} | 在进入当前状态之前执行语句 |
onExit{语句} | 在进入下一个状态之前执行语句 |
whenIsActive{语句} | 当前状态所需要执行的语句 |
whenIsNext{语句} | 在nextstate等于当前的这个状态的时候执行 |
goto(next state) | 跳转到下一个状态 |
exit() | 设置一个起始状态(暂时不确定它的作用) |
2. 编写之前写过的计数状态机
verilog中编写的状态机的关键步骤
case(state)
stateA: begin
state <= #1 stateB;
cnt <= #1 'h2;
end
stateB: begin
cnt <= #1 cnt + 1'b1;
if(cnt == 'h6) begin
state <= #1 stateC;
end else begin
state <= #1 stateB;
end
end
stateC: state <= #1 stateA;
default: begin
state <= #1 stateA;
cnt <= #1 'h0;
end
endcase
我们来对着上面verilog的代码使用SpinaHDL写一个相同的状态机
stateA
.whenIsActive(goto(stateB)) //stateA当前状态所要执行的语句就是跳转到stateB
stateB
.onEntry(cnt := 2) //由前面的表格知道这条语句会在上一个状态进入这个状态之前执行
.whenIsActive{
cnt := cnt + 1
when(cnt === 6){
goto(stateC)
}
}
.onExit(io.result := True) //在stateB跳转到stateC之间执行
stateC
.whenIsActive(goto(stateA))