《同步有限状态机设计课件》由会员分享,可在线阅读,更多相关《同步有限状态机设计课件(34页珍藏版)》请在金锄头文库上搜索。
1、第5章 同步有限状态机设计,5.1 同步有限状态机引例 5.2 状态机的基本概念 5.3 状态机的编码方法 5.4 复杂状态机的编写方法 5.5 采用状态机来实现程序算法 5.6 小结,5.1 同步有限状态机引例,【例5-1】 设计一个串行数据检测器。电路的输入信号A是与时钟脉冲同步的串行数据,其时序关系如图所示。输出信号为Y;要求电路在信号输入A出现110序列时,输出信号Y为1,否则为0。,5.1 同步有限状态机引例,图5-2 时序逻辑电路设计过程,5.1 同步有限状态机引例,第一步:理解题意,由给定的逻辑功能建立原始状态图,如图5-3所示,图5-3 原始状态图 图中,S表示状态,A/Y中横
2、线上面的为输入,横线下面的为输出。,5.1 同步有限状态机引例,第二步:状态化简,合并等价状态,图5-4 化简后的状态图,5.1 同步有限状态机引例,第三步:状态编码,图5-5 编码后的状态图,5.1 同步有限状态机引例,第四步:选择触发器的个数和类型,触发器个数可根据状态数确定,要求满足2n-1M2n,式中M为状态数,n为触发器的个数。对于本例,已知M为3,所以可求出触发器的个数为2个。 触发器可以选择D触发器、JK触发器等等,本例选用D触发器。,5.1 同步有限状态机引例,第五步:求出电路的激励方程和输出方程,5.1 同步有限状态机引例,第六步:画出逻辑图并检查自启动能力,5.1 同步有限
3、状态机引例,【例5-2】 对应于步骤六的层次建模方法 module fsm_1(clk,A,Y); input clk,A; output Y; wire q0,q1; assign Y= q1 endmodule,5.1 同步有限状态机引例,【例5-3】 对例5-2的改进消除毛刺 module fsm_1(clk,A,Y); input clk,A; output reg Y; wire q0,q1; mydff_2 dff0(.D(A),.Q(q0),.clk(clk), dff1(.D(A endmodule,5.1 同步有限状态机引例,【例5-4】 对应于步骤五的Verilog建模 m
4、odule fsm_2(clk,A,Y); input clk,A; output reg Y; reg q0,q1; always (posedge clk) begin q0 = A; q1 = q0 end endmodule,5.1 同步有限状态机引例,【例5-5】 对应于步骤四的Verilog建模 /产生JK激励信号:D触发器的激励d-JK触发器的激励J和K module D_JK(d,q,j,k); input d,q; output reg j,k; always (d,q) case(d,q) 2b00,2b11: begin j=0; k=0; end 2b01,2b10:
5、begin j=1; k=1; end endcase endmodule,5.1 同步有限状态机引例,/顶层模块,实现例5-2的功能 module fsm_3(clk,A,Y); input clk,A; output reg Y; wire q0,q1,j0,k0,j1,k1,temp; assign temp=q0 endmodule,/JK触发器实现-JK全1翻转,全0不变,其它为J module JK(clk,j,k,q); input clk,j,k; output reg q; always (posedge clk) case(j,k) 2b11: q=q; 2b10: q=1
6、; 2b01: q=0; 2b00: q=q; default: ; endcase endmodule,5.1 同步有限状态机引例,【例5-6】 对应于步骤一、步骤二和步骤三的同步状态机 module fsm_3(clk,A,Y); input clk,A; output reg Y; reg1:0 state; parameter s0=2b00, /状态编码为顺序编码方式 s1=2b01, s2=2b11; always (posedge clk) case(state) s0: begin if(A) state=s1; else state=s0; Y=0; end,s1: begi
7、n if(A) state=s2; else state=s0; Y=0; end s2: begin if(A) begin state=s2; Y=0; end else begin state=s0; Y=1; end end default: state=s0; endcase endmodule,5.2 状态机的基本概念,1 状态机的基本描述方式 2 状态机的基本要素及分类 3 同步状态机和异步状态机 4 单进程、双进程和多进程状态机,状态机的基本描述方式,状态机的基本描述方式有3种: 状态转移图 状态转移列表 HDL语言描述,状态机的基本要素及分类,状态机的基本要素有3 个: 状态
8、 输出 输入,同步状态机和异步状态机,异步状态机是没有确定时钟的状态机,它的状态转移不是由唯一的时钟跳变沿所触发。目前多数综合器不能综合采用Verilog HDL描述的异步状态机。因此,应尽量不要使用综合工具来设计异步状态机。 如果一定要设计异步状态机,我们建议采用原理图输入或实例引用的方法,而不要用Verilog HDL输入的方法。 为了能综合出有效的电路,用Verilog HDL描述的状态机应明确地由唯一时钟触发,这种状态机我们称为同步状态机。同步有限状态机是设计复杂时序逻辑电路最有效最常用的方法之一。,单进程、双进程和多进程状态机,一个有限状态机总是可以被分成次态译码、状态寄存器、输出译
9、码三个模块,可以有五种不同的方式将这些模块分配到进程语句,以实现对状态机的描述。 三个模块用一个进程实现,也就是说3个模块均在1个always块内,这种状态机描述称为单进程有限状态机。 每一个模块分别用一个进程实现,也就是说3个模块对应着3个always块,这种状态机描述称为三进程有限状态机。 其他3种为双进程状态机: 次态译码、输出译码分配在一个进程中,状态寄存器用另一个进程描述; 次态译码、状态寄存器分配在一个进程中,输出译码用另一个进程描述; 次态译码用一个进程描述,状态寄存器、输出译码分配在另一个进程中。,5.3 状态机的编码方法,独热编码,【例5-9】状态机设计独热码表示状态 mod
10、ule fsm_2(clk,A,Y); input clk,A; output reg Y; reg2:0 state; parameter s0=3b001, s1=3b010, s2=3b100; always (posedge clk) case(state) s0: begin if(A) state=s1; else state=s0; Y=0; end,s1: begin if(A) state=s2; else state=s0; Y=0; end s2: begin if(A) begin state=s2; Y=0; end else begin state=s0; Y=1;
11、 end end default: state=s0; endcase endmodule,直接输出型编码,【例5-10】状态机设计状态编码包含输出信息 module fsm_1(clk,A,Y); input clk,A; output Y; reg3:0 state; parameter s0=4b0001, s1=4b0010, s2=4b0100, s3=4b1100; assign Y=state3;,always (posedge clk) case(state) s0: if(A) state=s1; else state=s0; s1: if(A) state=s2; else
12、 state=s0; s2: if(A) state=s2; else state=s3; s3: if(A) state=s1; else state=s0; default: state=s0; endcase endmodule,非法状态的处理,处理的方法有两种: (1)在语句中对每一个非法状态都作出明确的状态转换指示,如在原来的case语句中增加诸如以下语句: case(state) N1: state=s0; N2: state=s0; (2)如例5-6、例5-9和例5-10中那样,利用default语句对未提到的状态作统一处理。 case(state) s0: if(A) stat
13、e=s1; else state=s0; default: state=s0; endcase 由于剩余状态的次态不一定都指向状态s0,所以可以使用方法一来分别处理每一个剩余状态的转向。,5.4 复杂状态机的编写方法,【例5-11】状态机设计状态和输出使用单独进程 module fsm_0(clk,A,Y); input clk,A; output reg Y; reg2:0 current_state,next_state; parameter s0=3b001, s1=3b010, s2=3b100; always (posedge clk) /状态寄存器 current_state=ne
14、xt_state; always (current_state,A) /产生下一个状态状态的组合逻辑,case(current_state) s0: if(A) next_state=s1; else next_state=s0; s1: if(A) next_state=s2; else next_state=s0; s2: if(A) next_state=s2; else next_state=s0; default: next_state=s0; endcase always (posedge clk) /产生输出的时序逻辑 case(current_state) s0: Y=0; s
15、1: Y=0; s2: if(A) Y=0; else Y=1; default: Y=0; endcase endmodule,5.5 采用状态机来实现程序算法,1 求两数最大公约数的算法 2 求两数最大公约数的实现,求两数最大公约数的算法,【例5-12】求最大公约数的算法 0: int x, y, r; 1: while (1) 2: while (!go_i); 3: if (x_i = y_i) 4: x=x_i; 5: y=y_i; else 6: x=y_i; 7: y=x_i; 8: while (y != 0) 9: r = x % y; 10: x = y; 11: y =
16、r; 12: d_o = x; ,求两数最大公约数的实现,图5-18 状态图转换模板,求两数最大公约数的实现,图5-19 求最大公约数的状态图(左)及化简后的状态图(右),求两数最大公约数的实现,【例5-13】求最大公约数的Verilog代码 module gcd(clk,x_i,y_i,go_i,d_o); parameter N=6; /用于定义输入数的范围,最大为2*N-1 inputN-1:0 x_i,y_i; input clk,go_i; output regN-1:0 d_o; parameter s0=3b111,s1=3b001,s2=3b010, s3=3b011,s4=3b100,s5=3b101,s6=3b110;