怎样建立个人的网站,wordpress首页源码,南京外贸网站建设公司排名,物联网设计状态机设计#xff1a;3 段式#xff08;推荐#xff09;
状态机设计如下#xff1a; (0) 首先#xff0c;根据状态机的个数确定状态机编码。利用编码给状态寄存器赋值#xff0c;代码可读性更好。 (1) 状态机第一段#xff0c;时序逻辑#xff0c;非阻塞赋值#xf…状态机设计3 段式推荐
状态机设计如下 (0) 首先根据状态机的个数确定状态机编码。利用编码给状态寄存器赋值代码可读性更好。 (1) 状态机第一段时序逻辑非阻塞赋值传递寄存器的状态。 (2) 状态机第二段组合逻辑阻塞赋值根据当前状态和当前输入确定下一个状态机的状态。 (3) 状态机第三代时序逻辑非阻塞赋值因为是 Mealy 型状态机根据当前状态和当前输入确定输出信号。
// vending-machine
// 2 yuan for a bottle of drink
// only 2 coins supported: 5 jiao and 1 yuan
// finish the function of selling and changingmodule vending_machine_p3 (input clk ,input rstn ,input [1:0] coin , //01 for 0.5 jiao, 10 for 1 yuanoutput [1:0] change ,output sell //output the drink);//machine state decodeparameter IDLE 3d0 ;parameter GET05 3d1 ;parameter GET10 3d2 ;parameter GET15 3d3 ;//machine variablereg [2:0] st_next ;reg [2:0] st_cur ;//(1) state transferalways (posedge clk or negedge rstn) beginif (!rstn) beginst_cur b0 ;endelse beginst_cur st_next ;endend//(2) state switch, using block assignment for combination-logic//all case items need to be displayed completely always (*) begin //st_next st_cur ;//如果条件选项考虑不全可以赋初值消除latchcase(st_cur)IDLE:case (coin)2b01: st_next GET05 ;2b10: st_next GET10 ;default: st_next IDLE ;endcaseGET05:case (coin)2b01: st_next GET10 ;2b10: st_next GET15 ;default: st_next GET05 ;endcaseGET10:case (coin)2b01: st_next GET15 ;2b10: st_next IDLE ;default: st_next GET10 ;endcaseGET15:case (coin)2b01,2b10:st_next IDLE ;default: st_next GET15 ;endcasedefault: st_next IDLE ;endcaseend//(3) output logic, using non-block assignmentreg [1:0] change_r ;reg sell_r ;always (posedge clk or negedge rstn) beginif (!rstn) beginchange_r 2b0 ;sell_r 1b0 ;endelse if ((st_cur GET15 coin 2h1)|| (st_cur GET10 coin 2d2)) beginchange_r 2b0 ;sell_r 1b1 ;endelse if (st_cur GET15 coin 2h2) beginchange_r 2b1 ;sell_r 1b1 ;endelse beginchange_r 2b0 ;sell_r 1b0 ;endendassign sell sell_r ;assign change change_r ;endmodule状态机修改2 段式
将 3 段式状态机 2、3 段描述合并其他部分保持不变状态机就变成了 2 段式描述。 修改部分如下
//(2) state switch, and output logic
//all using block assignment for combination-logic
reg [1:0] change_r ;
reg sell_r ;
always (*) begin //all case items need to be displayed completelycase(st_cur)IDLE: beginchange_r 2b0 ;sell_r 1b0 ;case (coin)2b01: st_next GET05 ;2b10: st_next GET10 ;default: st_next IDLE ;endcase // case (coin)endGET05: beginchange_r 2b0 ;sell_r 1b0 ;case (coin)2b01: st_next GET10 ;2b10: st_next GET15 ;default: st_next GET05 ;endcase // case (coin)endGET10:case (coin)2b01: beginst_next GET15 ;change_r 2b0 ;sell_r 1b0 ;end2b10: beginst_next IDLE ;change_r 2b0 ;sell_r 1b1 ;enddefault: beginst_next GET10 ;change_r 2b0 ;sell_r 1b0 ;endendcase // case (coin)GET15:case (coin)2b01: beginst_next IDLE ;change_r 2b0 ;sell_r 1b1 ;end2b10: beginst_next IDLE ;change_r 2b1 ;sell_r 1b1 ;enddefault: beginst_next GET15 ;change_r 2b0 ;sell_r 1b0 ;endendcasedefault: beginst_next IDLE ;change_r 2b0 ;sell_r 1b0 ;endendcase
end状态机修改1 段式慎用
将 3 段式状态机 1、 2、3 段描述合并状态机就变成了 1 段式描述。 修改部分如下
//(1) using one state-variable do describereg [1:0] change_r ;reg sell_r ;always (posedge clk or negedge rstn) beginif (!rstn) beginst_cur b0 ;change_r 2b0 ;sell_r 1b0 ;endelse begincase(st_cur)IDLE: beginchange_r 2b0 ;sell_r 1b0 ;case (coin)2b01: st_cur GET05 ;2b10: st_cur GET10 ;endcaseendGET05: begincase (coin)2b01: st_cur GET10 ;2b10: st_cur GET15 ;endcaseendGET10:case (coin)2b01: st_cur GET15 ;2b10: beginst_cur IDLE ;sell_r 1b1 ;endendcaseGET15:case (coin)2b01: beginst_cur IDLE ;sell_r 1b1 ;end2b10: beginst_cur IDLE ;change_r 2b1 ;sell_r 1b1 ;endendcasedefault: beginst_cur IDLE ;endendcase // case (st_cur)end // else: !if(!rstn)end