一、状态机设计的关键是什么?
如何才能把一个电路系统抽象为一个或者多个相互配合嵌套的状态机和组合系统模块?是关键。
二、状态机设计指导原则
1、使用独热码
2、采用case语句,加default,变量值位‘bx,因为这样编译的电路删除了多余的东东
3、应该加上异步复位端
4、如果设计必须有不同的时钟触发,利用甲模块的时钟是乙模块时钟同步计数器的输出。
5、把异步触发的电路转换成同步时钟触发的电路并不困难,详见15章。异步状态即使没有确定时钟的状态机。
6、千万不要使用综合工具设计异步状态机。如果非要设计就用电路图输入的方法。因为他会简化你的意图。
7、必须明确赋值,使用parameter,define,你懂的,不多说
三、典型状态机实例
module statemachine(launch_shuttle,land_shuttle,start_countdown,start_trip_meter,clk,all_systems_go,
just_lauchched,is_landed,cnt,abort_mission);
::::::::::
parameter HOLD=5'b00001,SEQUENCE=5'B00010,LAUNCH=5'B00100;
parameter ON_MISSION=5'b01000,LAND=5'b10000;//这里表明了航天器的多种状态
reg[4:0] state;
always@(negedge clk or posedge abort_miossion)
begin
//检查异步rst的值,即abort_mission
if(abort_mission)
begin
{launch_shuttle,lan_shuttle,start_trip_meter,start_countdown}<=4'b0000;
state<=LAND;
end
else
begin
//主机状态
case(state)
HOLD:
if(all_system_go) begin state<=SEQUENCE; start_countdown<=1;end
else state<=HOLD;
SEQUENCE:
if(cnt==0) state<= LAUNCH;
else state<=SEQUENCE;
LAUNCH:
begin state<= ON_MISSION;launch_shuttle<=1;end
ON_MISSION:
if(just_launched) start_trip_meter<=1;
else state<=ON_MISSON;
LAND:
if(is_landed) state<=HOLD;
else begin land_shuttle<=1;state<=LAND;end
default: state<=5'bxxxxx;
endcase
end
end
endmodule
摘自:verilog数字系统设计教程(夏宇闻)