Xilinx FPGA设计与实践教程 教学课件 ppt 作者 赵吉成 第6-10章 第6章

上传人:E**** 文档编号:89376302 上传时间:2019-05-24 格式:PPT 页数:124 大小:1.53MB
返回 下载 相关 举报
Xilinx FPGA设计与实践教程 教学课件 ppt 作者 赵吉成 第6-10章 第6章_第1页
第1页 / 共124页
Xilinx FPGA设计与实践教程 教学课件 ppt 作者 赵吉成 第6-10章 第6章_第2页
第2页 / 共124页
Xilinx FPGA设计与实践教程 教学课件 ppt 作者 赵吉成 第6-10章 第6章_第3页
第3页 / 共124页
Xilinx FPGA设计与实践教程 教学课件 ppt 作者 赵吉成 第6-10章 第6章_第4页
第4页 / 共124页
Xilinx FPGA设计与实践教程 教学课件 ppt 作者 赵吉成 第6-10章 第6章_第5页
第5页 / 共124页
点击查看更多>>
资源描述

《Xilinx FPGA设计与实践教程 教学课件 ppt 作者 赵吉成 第6-10章 第6章》由会员分享,可在线阅读,更多相关《Xilinx FPGA设计与实践教程 教学课件 ppt 作者 赵吉成 第6-10章 第6章(124页珍藏版)》请在金锄头文库上搜索。

1、第六章 时序状态机设计,6.1 有限状态机 6.2 状态机设计实例 6.3 带数据路径的状态机(FSMD) 6.4 FSMD的HDL代码开发 6.5 设计举例 本章小结,6.1 有 限 状 态 机 6.1.1 Moore和Mealy状态机 有限状态机的基本组成和规则时序电路是一样的,由状态寄存器、下一状态逻辑模块和输出逻辑模块组成,如图6-1所示。如果输出逻辑仅仅是状态寄存器的函数,也就是仅与状态寄存器有关,则为摩尔状态机;如果输出逻辑是当前状态和外部输入的函数,则为米利状态机。,图6-1 同步状态机框图,6.1.2 有限状态机的描述方式 常用的描述有限状态机的方法是状态转移图(State T

2、ransition Graph,STG)和算法状态机表(ASM chart)。这两种方法都是用来描述系统内部以及系统与周围接口信号的有效输入与状态转移关系的,其中状态转移图描述比较紧凑简洁,非常适合简单的应用,而算法状态图类似于软件流程图,适合描述复杂的状态转换和数据传输。,1状态转移图 状态转移图是一种有向图,由节点和弧线组成。节点与时序状态机的状态一一对应,弧线为有向线,表示起点状态在输入信号的作用下可能发生的状态转移的条件,当条件满足时,触发起点状态跳转到新的状态。如图6-2(a)所示为一个简单的状态转移图节点,标注在弧线上的外部输入信号的逻辑表达式为状态跳转的条件。 摩尔状态机的输出值

3、仅与当前状态有关,所以其值在节点圆中表示。而米利状态机的输出值与当前状态和外部输入都有关,为了简化状态图的分支,输出值随跳转条件一起在弧线上列举出来,如果没有列举,则输出值保持默认值。,图6-2 状态机符号描述,图6-3(a)所示为一个复杂的状态图,包含有三个状态、两个外部输入信号(a和b)、一个摩尔输出(y1)和一个米利输出(y0)。y1在状态机状态为s0和s1时逻辑输出;y0在状态为s0并且a和b信号为“11”时逻辑输出。,图6-3 状态机STG和ASM图描述,2算法状态机图 算法状态机(Algorithmic State Machine,ASM)图是时序状态机功能的抽象表达方式,类似于软

4、件流程图。该图在描述时序状态机的行为方面以及设计状态机来控制数据通道方面都是非常有用的。其描述主要由四部分组成:状态转移框、条件输出、寄存器操作框和判决框。状态转移框为状态机主体,对于摩尔状态机,其输出逻辑值在状态转移框中表示,并且仅有一条输出路径。对于米利状态机,条件判决框通过判断外部输入决定状态输出路径,它有两条输出路径,标记为T和F,分别对应外部输入条件为真和假两种情况下的输出路径。米利状态机的输出逻辑在条件判断框之后,表示在对应状态条件和外部条件同时满足的情况下,米利状态机才可输出。 状态转移图和ASM图之间可以灵活转换,如图6-2(a)和(b)及图6-3(a)和(b)所示,采用两种不

5、同的描述方式描述同一个状态机。,6.1.3 有限状态机的HDL开发 1状态机描述的编码方式 在状态机的描述中,为了更清楚地表示状态,一般采用带有意义的常数符号来定义状态参数。如图6-3所示的三个状态可以定义为 localparam1:0 s0 = 2b00, s1 = 2b01, s2 = 2b10;,需要注意的是,状态机的定义用localparam或者parameter,不推荐使用define宏定义的方式。这是因为采用define宏定义在编译时会自动替换整个设计中所有的宏,而parameter仅仅定义模块内部的参数,定义的参数不会与模块外的其他状态机混淆。 状态机的编码方式很多,包括顺序编码

6、、格雷玛(Gray Encoding)、一位热码(One-Hot Encoding)、BCD码等。虽然在综合过程中,综合工具可以辨别出状态机结构,并可以根据需求将这些状态机符号常数映射为各种二进制形式,但是在FPGA设计中,编码方式可影响状态机的执行效率和功能,所以建议读者在设计中根据不同的需求,选择不同的编码方式,具体请参考表6-1。,2状态机HDL描述 状态机HDL描述包含三部分:同步时序描述状态转移、下一状态逻辑跳转产生、摩尔和米利逻辑输出。 【程序6-1】 三段式状态机描述。 module three_seg_fsm ( input wire clk, reset, input wir

7、e a, b, output wire y0, y1 ); / 定义状态常数 localparam 1:0 s0 = 2b00, s1 = 2b01, s2 = 2b10; / 信号声明 reg 1:0 state_reg, state_next;,/ 状态机寄存器描述 always (posedge clk, posedge reset) if (reset) state_reg = s0; else state_reg = state_next; / 下一状态逻辑 always * case (state_reg) s0: if (a) if (b) state_next = s2; el

8、se state_next = s1; else state_next = s0;,s1: if (a) state_next = s0; else state_next = s1; s2: state_next = s0; default: state_next = s0; endcase / 摩尔输出逻辑 assign y1 = (state_reg=s0) | (state_reg=s1); /米利输出逻辑 assign y0 = (state_reg=s0) endmodule,产生下一状态逻辑为逻辑状态转换的关键,其中always的敏感列表为当前状态state_reg,下一状态逻辑由

9、当前状态(state_reg)和外部输入共同决定。为了避免不确定的状态的产生,case语句中如果还有未列举的状态,则需要采用others语句对未列举的状态进行赋值。 还有一种更为简洁的描述方式,将摩尔输出和米利输出融合在下一状态逻辑代码段当中,如程序6-2所示。,【程序6-2】 两段式状态机描述。 module fsm_two_seg ( input wire clk, reset, input wire a, b, output reg y0, y1 ); /状态常数声明 localparam 1:0 s0 = 2b00, s1 = 2b01, s2 = 2b10;,/信号声明 reg 1:

10、0 state_reg, state_next; /同步状态寄存器描述 always (posedge clk, posedge reset) if (reset) state_reg = s0; else state_reg = state_next; /下一逻辑状态和输出逻辑 always * begin state_next = state_reg; /默认下一状态逻辑不变 y1 = 1b0; /默认输出为0 y0 = 1b0; /默认输出为0 case (state_reg) s0: begin,y1 = 1b1; if (a) if (b) begin state_next = s2

11、; y0 = 1b1; end else state_next = s1; end s1: begin y1 = 1b1; if (a) state_next = s0;,end s2: state_next = s0; default: state_next = s0; endcase end endmodule,需要注意的是,输出默认值需要在always语句开始时赋值。 下一状态逻辑和输出逻辑严格按照ASM图产生。如果ASM图有细微的改变,则转换成HDL代码的过程并不难,读者可以将程序6-1和程序6-2作为这个转换过程的模板来套用。因而Xilinx ISE包含一个StateCAD的工具,可

12、以帮助用户方便设计状态转换图,并且自动产生HDL代码。建议大家可以采用它练习一些简单的状态机的例子。 在上述状态机描述中,输出都是用组合逻辑描述的,而组合逻辑容易产生毛刺等不稳定因素,并且在FPGA中,过多的组合逻辑会影响实现的速率。所以如果在上述状态机描述中在后级电路对组合逻辑输出用寄存器“打一拍”,则可以有效地消除毛刺。,6.2 状态机设计实例 6.2.1 上升沿检测电路 上升沿检测电路在实际电路中应用非常广泛。其主要功能是当被检测信号一旦有一个从0到1的跳变时,则电路输出一个脉宽为1个时钟周期的脉冲。上升沿检测电路经常用来检测缓慢变化的输入信号。 下面分别采用摩尔状态机和米利状态机设计,

13、并对比两种状态机的设计。,1基于摩尔状态机的设计 基于摩尔状态机设计的上升沿检测电路的状态转移图和ASM图如图6-4所示。从idle跳变到get_edg状态,表示输入信号从0变成1。当状态机处于idle状态时,如果在时钟的上升沿采集到输入信号为1,则表示检测到信号上升沿,状态机转换到edg状态,并且输出tick信号有效,其时序如图6-5所示,代码如程序6-3所示。,图6-4 基于摩尔状态机的上升沿检测电路状态图,图6-5 两种状态机描述时序的对比,【程序6-3】 基于摩尔状态机的上升沿检测电路的HDL描述。 module edge_detect_moore ( input wire clk,

14、reset, input wire s_in, output reg tick ); /状态常量声明 localparam 1:0 idle= 2b00, edg = 2b01, get_edg= 2b10;,/信号声明 reg 1:0 state_reg, state_next; /状态寄存器 always (posedge clk, posedge reset) if (reset) state_reg = idle; else state_reg = state_next; /下一状态逻辑和输出逻辑 always * begin state_next = state_reg; /默认状态 tick = 1b0; /默认输出为0 case (state_reg) idle:,if (s_in) state_next = edg; edg: begin tick = 1b1; if (s_in) state_n

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号