关于状态机
下面是三段状态机的典型描述方式//第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器
always @ (posedge clk or negedge rst_n) //异步复位
if(!rst_n)
current_state <= IDLE;
else
current_state <= next_state;//注意,使用的是非阻塞赋值
//第二个进程,组合逻辑always模块,描述状态转移条件判断或者状态转移规律
always @ (current_state) //电平触发
begin
next_state = x; //要初始化,使得系统复位后能进入正确的状态
case(current_state)
S1: if(...)
next_state = S2; //阻塞赋值
...
endcase
end
//第三个进程,同步时序always模块,格式化描述次态寄存器输出
always @ (posedge clk or negedge rst_n)
...//初始化
case(next_state)
S1:
out1 <= 1'b1; //注意是非阻塞逻辑
S2:
out2 <= 1'b1;
default:... //default的作用是免除综合工具综合出锁存器。
endcase
end
问题:
在电路板上电后一端时间内,复位信号rst_n和clk信号都有效。三个always语句都是并行执行的。
在系统clk的第一个周期内:
a、rst_n是有效,会导致第一个和第三个always语句进入各自的初始化语句中。
b、对于第二个always语句:
current_state 这个变量,在系统clk 第一个周期内,是一个什么样的值。该always语句如何执行? current_state 难道不等于 idle的参数值吗? 支持楼上,此时的状态应该是IDLE.
此处的语句可以省去第三个always @ (posedge clk or negedge rst_n)
寄存器赋值语句可以直接写到第二个always @ 里面,此时关键词可以改为
always @*
请各位指正
页:
[1]