Exams/ece241 2013 q8——Mealy型和Moore型FSM的比较"/>
Exams/ece241 2013 q8——Mealy型和Moore型FSM的比较
1、实现一个Mealy类型的有限状态机,识别名为x的输入信号上的序列“101”。FSM应该有一个输出信号z,当检测到“101”序列时,该信号被断言为logic-1。您的FSM也应该有一个有效的低异步复位。您的状态机中可能只有3个状态。FSM应该识别重叠序列。
这一题我设置了四种状态,none,one,two,xxx;
首先,当areset异步置零时,state回到初始态xxx,等待接收x=1的信号。
state=xxx,当x=1时,state变为none,若x=0,则保持xxx;(初始信号)
state=none,当x=1时,保持none,若x=0,则state变为one; (检测x=1信号)
state=one,当x=1时,state变为two,若x=0,则回到xxx,重新等待1; (检测x=0信号)
state=two,当x=1时,state变为none,若x=0,则保持one(开始新一轮的101检测);
这一题易错在最后的输出z的判断,一开始我写的是state==two,即接收到101后,z为1.但报错,从波形图看出,z=1与“101”最后一个1的出现是同步的,所以这里改成了next_state==two时就输出z=1;
module top_module (input clk,input aresetn, // Asynchronous active-low resetinput x,output z ); parameter none=0,one=1,two=2,xxx=3;reg [1:0] state,next_state;always @(posedge clk,negedge aresetn)beginif(aresetn==0) state<=xxx;else state<=next_state;endalways @(*)begin case(state)none:next_state<=(x)? none:one; one:next_state<=(x)? two:xxx;xxx:next_state<=(x)? none:xxx; two:next_state<=(x)? none:one; endcaseend assign z = (next_state==two);endmodule
写完才发现,说是merely机我还是写成了moore机了。。。
merely应该和当前输入有关,而我这里的输出只有状态就能判定了,应该不对。
于是又重新尝试了merely机的写法
和上面类似,只是减少了一个状态,修改了z的判断方法,当state=one时意味着已经接受到了10,而此时若x=1,就可以直接判断并输出z=1;
这就和输入扯上关系了就。而且更符合题意,并且可以看到确实输出领先Moore机。
module top_module (input clk,input aresetn, // Asynchronous active-low resetinput x,output z ); parameter none=0,one=1,xxx=2;reg [1:0] state,next_state;always @(posedge clk,negedge aresetn)beginif(aresetn==0) state<=xxx;else state<=next_state;endalways @(*)begin case(state)none:next_state<=(x)? none:one; one:next_state<=(x)? none:xxx;xxx:next_state<=(x)? none:xxx; endcaseend assign z = ( state==one&&x==1);endmodule
看到别人的总结记个笔记
1、 Moore型的输出只与当前状态有关,而Mealy型的输出和输入、当前状态都相关。
2.、在实现相同功能的情况下,Mealy型状态机所需要的状态数比Moore型少,Moore需要待状态稳定才输出。
3、输出时序上,Moore状态机同步输出,Mealy状态机异步输出;
4、输出变化上,Mealy状态机比Moore状态机领先一个时钟周期;
更多推荐
Exams/ece241 2013 q8——Mealy型和Moore型FSM的比较
发布评论