1、状态机的作用?是什么?
状态机,顾名思义就是用来描述状态的。完善一点就是在同一的时钟下。更准确说是一种verilogHDL编程思想。
例如我们每一个系统都可以分为好几种状态,如:开始,初始化,运行,状态1,状态2,状态3,状态4,结束。
2、状态机结构
1)输出 <= 输入有关+当前状态
2)输出 <= 当前状态
3)流水线寄存器 <= 输出 <= 输出+当前状态
3、状态机verilog程序
一个系统或者一个物体的行为或者一个器件的状态,我们都可以分成好几种状态,那么就可以画出如下图的状态图,当然不可能所有的状态都是这样,但是大穹小异。这里的输出是用k1,k2来表示的,也就是代表当这种状态的时候,我们系统会实行什么行为。
1)一般形式的状态机程序(使用Gray编码)
module fsm(clk,rst,a,k1,k2,state);
input clk,rst,a;
output k1,k2;
output[1:0] state;
reg k1,k2;
reg[1:0] state;
parameter idle=2'b00,//空闲的
start=2'b01,
stop=2'b10,
clear=2'b11;
always@(posedge clk)
if(!rst)
begin
state<=idle;
k2<=0;
k1<=0;
end
case(state)
idle:
if(a) begin state<=start;k1<=0;end
else begin state<=idle;k2=0;k1=0;end
start:
if(!a) state<=stop;
else state<=stop;
stop:
if(a) begin state<=clear; k2<=1;end
else begin stste<=stop;k2<=0;k1<=0;end
clear:
if(!a) begin state<=idle;k2<=0;k1<=1;end
else begin state<=clear;k2<=0;k1<=1;end
default:
state<=2'bxx;
endcase
endmodule
2)用独热码表示的状态机
parameter idle=4'b0000,
start=4'b0100,
stop=4'b0010,
clear=4'b0001;
这叫独热码,你懂的。
3)输出<= 状态值 (把状态值直接作为输出) 适用于高速状态机,因为节省时间,节省器件,延迟时间小
state<=start; ……………… state<=stoptoclear; …………………… state=idle;
4)适用于大型复杂设计的多输入状态机,使用always
//每一个时钟产生一个状态的改变
always@(posedge clk)
if(!rst)
state<=idle;
else
state<=nextstate;
//产生下一状态的组合逻辑
always@(state or a)
case(state)
idle:
if(a) nextstate=start;
else nextstate=idle;
start:
if(!a) nextstate=stop;
else nextstate=start;
stop:
if(a) nextstate=clear;
else nextstate=stop;
clear:
if(!a) nextstate=idle;
else nextstate=clear;
default:
nextstate=2'bxx;
endcase
//产生输出k1的组合逻辑
always@(state or rest or a)
if(!rst)
k1=0;
else
if(state==clear&&!a)
k1=1;
else
k1=0;
//产生k2的组合逻辑
always@(state or rst or a)
if(!srt)
k2=0;
else
if(state==stop&&a)
k2=1;
else
k2=0;
4、总结
不同类型的状态机有不同的优势。