1、可编程ASIC设计状态机设计学时分配:学时分配:2进度进度 1.绪论绪论。2.设计流程设计流程。3.模块化硬件与进程模型模块化硬件与进程模型。4.信号传输模型信号传输模型。5.核心语法与基础电路设计核心语法与基础电路设计。6.状态机设计状态机设计。7.可靠设计与高速设计可靠设计与高速设计。8.可编程逻辑器件。可编程逻辑器件。9.数字信号处理的数字信号处理的fpga实现实现。10.数字系统的数字系统的RTL设计设计。回忆计数器设计回忆计数器设计 设计一电路,包含基设计一电路,包含基4计数器,和译码输出模块。计数器,和译码输出模块。计数器的输出计数器的输出(Present_value)从从0到到3
2、循环;当计循环;当计数值为数值为2时,译码输出时,译码输出(DataOut)为为“1”,否则,否则输出输出“0”。Regs1ClkPresent_valueQ(n)Next_valueQ(n+1)译码DataOutZ(n)Regs1ClkPresent_valueQ(n)Next_valueQ(n+1)译码DataOutZ(n)00/001/010/111/0Regs/-1ClkPresent_valueQ(n)Next_valueQ(n+1)译码DataOutZ(n)00/001/010/111/0扩展一个输入端扩展一个输入端din,当当din=1时计时计数器递增计数;当数器递增计数;当di
3、n=0时计数器递时计数器递减计数。减计数。dinDin=1Din=1Din=1Din=1Din=0Din=0Din=0Din=0Regs/-1ClkPresent_valueQ(n)Next_valueQ(n+1)译码DataOutZ(n)再将计数器修改成再将计数器修改成一个状态转换器,一个状态转换器,状态为状态为S0,S1,S2,S3。每个状态的取每个状态的取值根据具体情况而值根据具体情况而定。比如定。比如S0=00,S1=11,S3=01,S4=10。dinDin=1Din=1Din=1Din=100/001/010/111/0Din=0Din=0Din=0Din=0Regs译码ClkPr
4、esent_valueQ(n)Next_valueQ(n+1)译码DataOutZ(n)再将计数器修改成再将计数器修改成一个状态转换器,一个状态转换器,状态为状态为S0,S1,S2,S3。每个状态的取每个状态的取值根据具体情况而值根据具体情况而定。比如定。比如S0=00,S1=11,S3=01,S4=10。dinDin=1Din=1Din=1Din=1S0/0S1/0S2/1S3/0Din=0Din=0Din=0Din=0Regs译码ClkPresent_stateQ(n)Next_stateQ(n+1)译码DataOutZ(n)dinDin=1Din=1Din=1Din=1S0/0S1/0S
5、2/1S3/0Din=0Din=0Din=0Din=0现在我们得到了一个现在我们得到了一个比较通用的时序电路,比较通用的时序电路,这种电路统称为状态这种电路统称为状态机机(State Machine)。Regs译码ClkPresent_stateQ(n)Next_stateQ(n+1)译码DataOutZ(n)din状态机分类状态机分类Moore机:输出机:输出仅是状态的译码仅是状态的译码Regs译码ClkPresent_stateQ(n)Next_stateQ(n+1)译码DataOutZ(n)din状态机分类状态机分类Moore机:输出机:输出仅是状态的函数仅是状态的函数Mealy机:输出
6、机:输出是状态和输入的是状态和输入的函数函数状态机的表示方法1方法一:状态转换表方法一:状态转换表输入输入当前状态当前状态下一状态下一状态输出输出0000001010000000状态机的表示方法2方法二:算法流程图方法二:算法流程图 方法与软件程序的流程图类似状态转换表和算法流程图都不适合复杂系统的设计状态机的表示方法3方法三:状态转换图方法三:状态转换图这是最流这是最流行的表示行的表示方法方法状态1状态4状态2状态3入入/出出入入入入入入/出出/出出/出出Moore条件控制转移直接控制转移状态机的表示方法3方法三:状态转换图方法三:状态转换图这是最流这是最流行的表示行的表示方法方法状态1状态
7、4状态2状态3入入/出出入入入入入入/出出/出出/出出/出出Mealy条件控制转移直接控制转移状态机的应用设计状态机的应用设计例子:设计一个二进制序列检测器,当检测例子:设计一个二进制序列检测器,当检测到到10110序列时,就输出序列时,就输出1(一个时钟周期的脉一个时钟周期的脉冲冲)。其他情况下输出。其他情况下输出0。规定检测到一次之后,检测器复位到最初规定检测到一次之后,检测器复位到最初始的状态,重新从头检测。如下所示:始的状态,重新从头检测。如下所示:输入:01101101101100输出:00000001000001状态转换图设计(状态转换图设计(Moore)10110S0/0S1/0
8、S2/0S3/0S4/0S5/1Reset1100110100101011 0s1 s2s3s4 s5s0问题问题1:如何保证:如何保证状态机在初始时状状态机在初始时状态为态为s0?问题问题2:在状态:在状态机跑飞,即脱离机跑飞,即脱离有效状态有效状态(s0s5)时,如何使状时,如何使状态机能恢复工作态机能恢复工作Sx/0波形波形 波形如下图所示波形如下图所示问题:如果需要问题:如果需要将输出脉冲往前将输出脉冲往前推一个时钟周期,推一个时钟周期,该如何修改设计?该如何修改设计?101101011 0s1 s2s3s4 s5s0输入输入时钟时钟输出输出当前状态当前状态 发现当前状态发现当前状态为
9、为s4,并且输入并且输入为为0时时,输出为,输出为1。状态转换图设计状态转换图设计(Mealy)S0S1S2S3S4S5Reset100110100101sX/0/0/0/0/0/0/0/0/0/1/0/0101101011 0s1 s2s3s4 s5s0/00/1s0状态机的代码实现状态机的代码实现 状态定义状态定义Architecture rtl of Syn is-其他信号定义。其他信号定义。Type SynFsmState is(s0,s1,s2,s3,s4,s5);Signal SynCst,SynNst:SynFsmState;Begin -结构体。结构体。End rtl;状态机的
10、代码实现状态机的代码实现 状态寄存器进程描述状态寄存器进程描述状态寄存器输出译码下一状态译码当前状当前状态态输出输出下一状下一状态态输输入入时钟clk 状态寄存器进程描述状态寄存器进程描述Process(clk,Reset)Begin if(Reset=1)then SynCst=S0;-初始状态。初始状态。elsif(clkevent and clk=1)then SynCst when s1=when s5=End case;End process;if(din=1)then SynNst=s1;else SynNst SynNst when s1=when s5=when others=
11、End case;End process;MooreMealyDout=0;Dout=0;Dout=0if(din=1)then else end if;,din)问题:当不发生任何状态转换时,问题:当不发生任何状态转换时,能否不对能否不对SynNst赋值?状态转换赋值?状态转换后,输出没有改变时,能否不对后,输出没有改变时,能否不对输出赋值?输出赋值?思考思考1思考思考2 Mealy机的输入进入输出译码模块,从而机的输入进入输出译码模块,从而输出可以比输出可以比Moore机早一个时钟周期;机早一个时钟周期;但是这同时会造成但是这同时会造成Mealy机的什么弱点?机的什么弱点?如果如果Meal
12、y机的输入有毛刺等干扰,这些机的输入有毛刺等干扰,这些干扰信号会直接传播到输出端。干扰信号会直接传播到输出端。问题:问题:Mealy机中,机中,能否用能否用“次态次态”信号信号替代替代“输入输入”信号,信号,与与“现态现态”信号进行信号进行译码输出?译码输出?思考思考3Regs译码ClkPresent_stateQ(n)Next_stateQ(n+1)译码DataOutZ(n)din问题:问题:Mealy机中,机中,能否用能否用“次态次态”信号信号替代替代“输入输入”信号,信号,与与“现态现态”信号进行信号进行译码输出?译码输出?思考思考3DataOutZ(n)Regs译码ClkPresent
13、_stateQ(n)Next_stateQ(n+1)译码din问题:问题:Mealy机中,机中,能否用能否用“次态次态”信号信号替代替代“输入输入”信号,信号,与与“现态现态”信号进行信号进行译码输出?译码输出?思考思考3或者,保留或者,保留s5态,态,然后直接用然后直接用“次态次态”信号进行译码输出?信号进行译码输出?Regs译码ClkPresent_stateQ(n)Next_stateQ(n+1)译码DataOutZ(n)din状态机设计小结状态机设计小结 Moore机的输出机的输出z仅是当前状态仅是当前状态q的函数;的函数;而而Mealy机的输出机的输出z是是q和输入和输入a的函数;的
14、函数;Mealy机的输出机的输出z可以比可以比Moore机早一个机早一个时钟周期;时钟周期;Mealy机中,输入端的干扰容易被传播到机中,输入端的干扰容易被传播到输出端,而输出端,而Moore机则不会。这是机则不会。这是Moore机比机比Mealy机稳定的地方。机稳定的地方。状态机设计小结状态机设计小结 记得使用记得使用others来包含所有的来包含所有的“无效态无效态”,以保证状态机的安全运作。以保证状态机的安全运作。任何状态,任何条件下,都应该对任何状态,任何条件下,都应该对“次态次态”和所有的输出和所有的输出z赋值,以避免生成赋值,以避免生成锁存锁存(后后面内容会详细讲述面内容会详细讲述
15、)。再次思考再次思考 状态机设计中,如果状态数很多,则状状态机设计中,如果状态数很多,则状态态Q的位数就比较多,从而容易导致输的位数就比较多,从而容易导致输出出Z产生明显的产生明显的毛刺毛刺。如何解决这个问题?。如何解决这个问题?Regs译码ClkPresent_stateQ(n)Next_stateQ(n+1)译码DataOutZ(n)din再次思考再次思考状态机设计中,状态编码采用状态机设计中,状态编码采用Binary编码编码和和One-hot编码对系统会造成什么样的性编码对系统会造成什么样的性能影响?这两种编码对能影响?这两种编码对FPGA/CPLD的适的适用情况如何?用情况如何?BinaryOne-hotS0000001S1010010S2100100S3111000