always @(posedge clock)
if (!Reset) begin
state <= Idle; F<=0; G<=0; //默认状态
end
else case (state)
Idle: begin //Idel状态
if (A) begin
state <= Start;
G<=0;
end
else state <= Idle;
end
Start: //Start状态
if (!A) state <= Stop;
else state <= Start;
Stop: begin //Stop状态
if (A) begin
state <= Clear;
F <= 1;
end
else state <= Stop;
end
Clear: begin //Clear状态
if (!A) begin
state <=Idle;
F<=0; G<=1;
end
else state <= Clear;
end
default: state <=Idle; //默认状态
endcase
endmodule
例4.2与例4.1的主要不同点是状态编码方式。例4.2采用了独热编码,而例4.1则采用Gray码,究竟采用哪一种编码好要看具体情况而定。
对于用FPGA实现的有限状态机建议采用独热码。因为虽然采用独热编码多用了两个触发器,但所用组合电路可省下许多,因而使电路的速度和可靠性有显著提高,而总的单元数并无显著增加。
采用了独热码后有了多余的状态,就有一些不可到达的状态,为此在CASE语句的最后需要增加default分支项,以确保多余状态能回到Idle状态。
另外还可以用另一种风格的Verilog HDL模型来表示同一个有限状态。在这个模型中,我们用always语句和连续赋值语句把状态机的触发器部分和组合逻辑部分分成两部分来描述,如下所示。
例4.3:有限状态机模型3
module fsm (CLOCk, Reset, A, F, G); //模块声明
input Clock, Reset, A;
output F,G;
reg [1:0] state ;
wire [1:0] Nextstate;
parameter //状态声明
Idle = 2’b00, Start = 2’b01,
Stop = 2’b10, Clear = 2’b11;
always @(posedge Clock)
if (!Reset) begin
state <= Idle; //复位状态
end
else
state <= Nextstate; //状态转换
assign Nextstate = //状态变换条件
(state == Idle ) ? (A ? Start : Idle):
(state==Start ) ? (!A ? Stop : Start ):
(state== Stop ) ? (A ? Clear : Stop ):
(state== Clear) ? (!A ? Idle : Clear) : Idle;
assign F = (( state == Stop) && A ); //状态输出
assign G = (( state == Clear) && (!A || !Reset)) //状态输出
endmodule
本文关键字:风格 电脑-单片机-自动控制,电子学习 - 基础知识 - 电脑-单片机-自动控制