Verilog HDL设计进阶:有限状态机的设计原理及其代

时间:2013-08-27来源:网络

4.4.2 FSM设计实例


例4.5:宇宙飞船控制器的状态机。

module statmch1( launch_shuttle, land_shuttle, start_countdown,
start_trip_meter, clk, all_systems_go,
just_launched, is_landed, cnt, abort_mission
);
// I/O说明
output launch_shuttle, land_shuttle, start_countdown,start_trip_meter;
input clk, just_launched, is_landed, abort_mission,all_systems_go;
input [3:0] cnt;
reg launch_shuttle, land_shuttle, start_countdown,start_trip_meter;
reg [4:0] present_state, next_state;
//设置独热码状态的参数
parameter HOLD=5'h1, SEQUENCE=5'h2, LAUNCH=5'h4;
parameter ON_MISSION=5'h8, LAND=5'h10;

always @(negedge clk or posedge abort_mission) begin
//把输出设置成某个缺省值,在下面的case语句中就不必再设置输出的缺省值
{launch_shuttle, land_shuttle, start_trip_meter, start_countdown} = 4'b0;
//检查异步reset的值,即abort_mission的值
if(abort_mission)
next_state = LAND;
else begin
//如果abort_mission为零,把next_state赋值为present_state
next_state = present_state;
//根据 present_state 和输入信号,设置 next_state和输出output
case ( present_state )
HOLD: //HOLD状态
if(all_systems_go) begin
next_state = SEQUENCE;
start_countdown = 1;
end
SEQUENCE: //SEQUENCE状态
if(cnt==0)
next_state = LAUNCH;
LAUNCH: begin //LAUNCH状态
next_state = ON_MISSION;
launch_shuttle = 1;
end
ON_MISSION: //ON_MISSION状态
if(just_launched)
start_trip_meter = 1; //取消使命前,一直留在使命状态
LAND: //LAND状态
if(is_landed)
next_state = HOLD;
else land_shuttle = 1;
default: next_state = 'bx;//把缺省状态设置为'bx(无关)或某种已
//知状态,使其在做仿真时,在复位前就
//与实际情况相一致
endcase
end // if-else语句结束
present_state = next_state; //把当前状态变量设置为下一状态,
//待下一有效时钟沿来到时,当前状
//态变量已设置了正确的状态值
end //always块结束
endmodule


4.4.3 设计可综合状态机的指导原则
(1)独热码。
因为大多数FPGA内部的触发器数目相当多,又加上独热码状态机(one hot state machine)的译码逻辑最为简单,所以在设计采用FPGA实现的状态机时,往往采用独热码状态机(即每个状态只有一个寄存器置位的状态机)。


(2)case语句。
建议采用case、casex或casez语句来建立状态机的模型。因为这些语句表达清晰明了,可以方便地从当前状态分支转向下一个状态并设置输出。


采用这些语句设计状态机时,不要忘记写上case语句的最后一个分支default,并将状态变量设为'bx。这就等于告知综合器:case语句已经指定了所有的状态。这样综合器就可以删除不需要的译码电路,使生成的电路简洁,并与设计要求一致。


如果将缺省状态设置为某一确定的状态(例如:设置default:state = state1),行不行呢?”这样做有一个问题需要注意:因为尽管综合器产生的逻辑和设置“default:state='bx”时相同,但是状态机的Verilog HDL模型综合前和综合后的仿真结果会不一致。


为什么会是这样呢?因为启动仿真器时,状态机所有的输入都不确定,因此立即进入default状态。如果通过设置将状态变量设为state1,但是实际硬件电路的状态机在通电之后,进入的状态是不确定的,很可能不是state1的状态,这样就会产生不必要的冲突。


因此,还是设置“default:state='bx”与实际硬件电路相一致。但在有多余状态的情况下还是应将缺省状态设置为某一确定的有效状态,因为这样做能使状态机若偶然进入多余状态后仍能在下一时钟跳变沿时返回正常工作状态,否则会引起死锁。


(3)复位。
状态机应该有一个异步或同步复位端,以便在通电时将硬件电路复位到有效状态,也可以在操作中将硬件电路复位(大多数FPGA结构都允许使用异步复位端)。


(4)惟一触发。
目前大多数综合器往往不支持在一个always块中由多个事件触发的状态机(即隐含状态机,implicit state machines)。因此为了能综合出有效的电路,用Verilog HDL描述的状态机应明确地由惟一时钟触发。


(5)异步状态机。
异步状态机是没有确定时钟的状态机,它的状态转移不是由惟一的时钟跳变沿所触发。目前大多数综合器不能综合采用Verilog HDL描述的异步状态机。


因此应尽量不要使用综合工具来设计异步状态机。因为目前大多数综合工具在对异步状态机进行逻辑优化时会胡乱地简化逻辑,使综合后的异步状态机不能正常工作。如果一定要设计异步状态机,建议采用电路图输入的方法,而不要用Verilog HDL输入的方法。


(6)状态赋值。
Verilog HDL中,状态必须明确赋值,通常使用参数parameters或宏定义define语句加上赋值语句来实现。


使用参数parameters语句赋状态值如下所示:

parameter state1 = 2 'h1, state2 = 2 'h2;
...
current_state = state2; //把current state设置成 2'h2
...

使用宏定义define语句赋状态值如下所示:

'define state1 2 'h1
'define state2 2 'h2
...
current_state = 'state2; //把current state设置成 2 'h2

1 2 3

关键词: Verilog HDL 进阶 代码

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版