博主:noend297
+加为好友
+发送站内短信
+我的博客精华
+我的推荐文章
软件技术 (7)
硬件技术 (0)
资料下载 (1)
杂谈 (1)
2008年份 (9)
· 有限状态机
· 环形缓冲区
· 基于51串口通讯编程软件架构剖析(请大家就本文相关内容发表评论,来探讨一个高效可靠的通讯架构)
· C运行时库详解
· 函数的定义,声明与原型
更多>>
· : type is ONEHOT; Verilog示例: Synplicity: Reg[2:0] state; /* synthesis syn_encoding = "value" */; // The syn_encoding attribute has 4 values : sequential, onehot, gray and safe. Exemplar: Parameter /* exemplar enum */ s0 = 0, s1 = 1, s2 = 2, s3 = 3, S4 = 4; Reg [2:0] /* exemplar enum */ present_state, next_state ; 状态机的编码风格 a.关于FSM的编码方法。FSM分两大类:米勒型和摩尔型。组成要素有输入(包括复位),状态(包括当前状态的操作),状态转移条件,状态的输出条件。 设计FSM的方法和技巧多种多样,但是总结起来有两大类:第一种,将状态转移和状态的操作和判断等写到一个模块(process、block)中。另一种是将状态转移单独写成一个模块,将状态的操作和判断等写到另一个模块中(在Verilog代码中,相当于使用两个“always” block)。其中较好的方式是后者。其原因如下。 首先FSM和其他设计一样,最好使用同步时序方式设计,好处不再累述。而状态机实现后,状态转移是用寄存器实现的,是同步时序部分。状态的转移条件的判断是通过组合逻辑判断实现的,之所以第二种比第一种编码方式合理,就在于第二种编码将同步时序和组合逻辑分别放到不同的程序块(process,block)中实现。这样做的好处不仅仅是便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。 b.初始化状态和默认状态。 一个完备的状态机(健壮性强)应该具备初始化状态和默认状态。当芯片加电或者复位后,状态机应该能够自动将所有判断条件复位,并进入初始化状态。需要注明的一点是,大多数FPGA有GSR(Global Set/Reset)信号,当FPGA加电后,GSR信号拉高,对所有的寄存器,RAM等单元复位/置位,这是配置于FPGA的逻辑并未生效,所以不能保证正确的进入初始化状态。所以使用GSR企图进入FPGA的初始化状态,常常会产生种种不必一定的麻烦。一般的方法是采用异步复位信号,当然也可以使用同步复位,但是要注意同步复位的逻辑设计。解决这个问题的另一种方法是将默认的初始状态的编码设为全零,这样GSR复位后,状态机自动进入初始状态。 令一方面状态机也应该有一个默认(default)状态,当转移条件不满足,或者状态发生了突变时,要能保证逻辑不会陷入“死循环”。这是对状态机健壮性的一个重要要求,也就是常说的要具备“自恢复”功能。对应于编码就是对case,if-else语句要特别注意,要写完备的条件判断语句。VHDL中,当使用CASE语句的时候,要使用“When Others”建立默认状态。使用“IF...THEN...ELSE”语句的时候,要用在“ELSE”指定默认状态。Verilog中,使用“case”语句的时候要用“default”建立默认状态,使用“if...else”语句的注意事项相似。 另外提一个技巧:大多数综合器都支持Verilog编码状态机的完备状态属性--“full case”。这个属性用于指定将状态机综合成完备的状态,如Synplicity的综合工具(Synplify/Synplify Pro,Amplify,etc)支持的命令格式如下: case (current_state) // synthesis full_case 2’b00 : next_state <= 2’b01; 2’b01 : next_state <= 2’b11; 2’b11 : next_state <= 2’b00; //这两段代码等效 case (current_state) 2’b00 : next_state <= 2’b01; 2’b01 : next_state <= 2’b11; 2’b11 : next_state <= 2’b00; default : next_state <= 2bx; Synplicity还有一个关于状态机的综合属性,叫“// synthesis parallel_case”其功能是检查所有的状态是“并行的”(parallel),也就是说在同一时间只有一个状态能够成立。 c.使用完备的“if...else”还有一个重要的好处,就是可以避免生成非目的性的“锁存器”(Latch)。详见westor的一篇文章“为什么XST与Synplify的综合结果不一样?” d.状态机的定义可以用parameter定义,但是不推荐使用`define宏定义的方式,因为‘define宏定义在编译时自动替换整个设计中所定义的宏,而parameter仅仅定义模块内部的参数,定义的参数不会与模块外的其他状态机混淆"> 1。状态机的编码 如果寄存器比较多,触发器比较少…
· 在CAN通信卡设备驱动程序中,为了增强CAN通信…
· 如果外部数据存储区够大,还是喜欢用分层的结构采…
· 全部用case跳转更好一些,因为当时MCU资源紧张,…
· 接收数据的同时,进行数据帧的解析,思路可取数据…
日志总数:9 篇
评论数量:6
访问次数:2822