声明:内容来自明德扬FPGA培训视频部分内容,本文为部分讲师讲解内容和作者的理解摘记。
state_c 是当前状态(现态);state_n是下一个状态(次态);IDLE表示初始状态(当然,不需要专门为复位信号设计idle作为初始状态,初始化就是s1,然后几个状态之间转换);s1、s2、s3表示第一、二、三种状态;s12s2中第一个2是“to”的音译化用,短句表示从第一个状态to(到)第二个状态;
一、状态机第一段
同步时序的always模块,格式化描述次态迁移到现态寄存器
//状态机第一段verilog代码:
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
state_c <= IDLE;
end
else begin
state_c <= state_n;
end
end
二、状态机第二段
组合逻辑的always模块,描述状态转移条件判断,但是!具体判断条件不在第二段描述。重要一点,组合逻辑一定要写补全条件,else begin。
always@(*)begin
case(state_c)
IDLE:begin
//现在的状态是IDLE
if(idle2s1_start)begin
//状态转移条件满足,idle状态转到s1状态
state_n = S1;
//次态为s1
end
else begin
state_n = state_c;
//条件不满足时,次态为现态
end
end
S1:begin
if(s12s2_start)begin
state_n = S2;
end
else begin
state_n = state_c;
end
end
S2:begin
if(s22s3_start)begin
state_n = S3;
end
else begin
state_n = state_c;
end
end
default:begin
state_n = IDLE;
end
endcase
end
三、状态机第三段
定义具体状态转移条件。
//示例:
assign idl2s1_start = state_c==IDLE && cnt==7-1;
//idle状态到s1状态触发条件(idl2s1_start)连接现态且满足cnt==7-1时,触发状态转移(idle到s1)。
assign s12s2_start = state_c==S1 && ;
assign s22s3_start = state_c==S2 && ;
四、状态机第四段
同步时序always模块,一个always一个输出信号,描述寄存器输出。
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
out1 <=1'b0 //初始化
end
else if(state_c==S1)begin
out1 <= 1'b1;
end
else begin
out1 <= 1'b0;
end
end
四段式状态机设计完成。另外,在gvim明德扬版本中输入Ztj 弹出模板。
状态机划分的依据,是为了最终方便的产生输出信号(或其他信号)!
——————————————————————————————————————————
问:在波形设计中,状态机对齐的对象,状态机的状态(state_c)是对齐din 还是 dout?
答:din是输入信号,状态机状态根据din来变换状态,最终输出dout,所以状态是对齐din信号
PS:FPGA没有过程的概念,只有分情况的概念。