没有合适的资源?快使用搜索试试~ 我知道了~
经典——状态机设计 指导 源代码
3星 · 超过75%的资源 需积分: 18 23 下载量 166 浏览量
2009-09-10
20:00:52
上传
评论
收藏 695KB PDF 举报
温馨提示
试读
31页
这里有状态机设计的指导,其中包含了一些经典的状态机设计例子,希望会对大家有所帮助!
资源推荐
资源详情
资源评论
F
F
S
S
M
M
设
设
计
计
指
指
导
导
P
P
a
a
n
n
d
d
e
e
n
n
g
g
2
2
0
0
0
0
4
4
-
-
6
6
-
-
2
2
9
9
做了一段时间逻辑,遇到复杂的时序逻辑设计时,遇到了瓶颈。于是想到了用“状态机”进行设计。
总结了一些很基础的知识,与大家共享!
以 Verilog 语言为例。
设计方法
FSM 分两大类:米里型和摩尔型。
组成要素有输入(包括复位),状态(包括当前状态的操作),状态转移条件,状态的输出条件。
设计 FSM 的方法和技巧多种多样,但是总结起来有两大类:第一种,将状态转移和状态的操作和判断
等写到一个模块(process、block)中。另一种是将状态转移单独写成一个模块,将状态的操作和判断等
写到另一个模块中(在 Verilog 代码中,相当于使用两个“always” block)。其中较好的方式是后者。其原因
如下:
首先 FSM 和其他设计一样,最好使用同步时序方式设计,好处不再累述。而状态机实现后,状态转移
是用寄存器实现的,是同步时序部分。状态的转移条件的判断是通过组合逻辑判断实现的,之所以第二种
比第一种编码方式合理
,就在于第二种编码将同步时序和组合逻辑分别放到不同的程序块(process,block)
中实现。这样做的好处不仅仅是便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加
合适的时序约束条件,利于布局布线器实现设
计。
显式的 FSM 描述方法可以描述任意的 FSM(参考 Verilog 第四版)P181 有限状态机的说明。
两个 always 模块。其中一个是时序模块,一个为组合逻辑。
时序模块设计与书上完全一致,表示状态转移,可分为同步与异步复位。
同步:always @(posedge clk)
if (!reset)
…………
异步:
always @(posedge clk or negedge reset)
if (!reset)
…………
组合逻辑用 case 语句,sensitive list 包括 current statement and a (b.c.d………..)。
设计注意要点
注:关于 one-hot、
gray、binary 的说明
Binary、gray-code 编码使用最少的触发器,较多的组合逻辑。而 one-hot 编码反之。由于 CPLD 更
多的提供组合逻辑资源,而 FPGA 更多的提供触发器资源,所以 CPLD 多使用 gray-code,而 FPGA 多使
用 one-hot 编码。另一方面,对于小型设计使用 gray-code 和 binary 编码更有效,而大型状态机使用 one-hot
更高效。
看 synplicity 的文档,推荐在 24 个状态以上会用格雷码,在 5~24 个状态会用独热码,在 4 个状态以
内用二进制
码,肯定独热码比二进制码在实现 FSM 部分会占更多资源,但是译码输出控制简单,所以如果
状态不是太多,独热码较好。状态太少译码不会太复杂,二进制就可以了。状态太多,前面独热码所占资
源太多,综合考虑就用格雷码了。
在代码中添加综合器的综合约束属性或者在图形界面下设置综合约束属性可以比较方便的改变状态的
编码。
在 synplify 综合时,把 FSM compile 勾上,就算用 binary 表示,综合器会自动综合成 one-hot 模式。
也可在 coding 时直接添加描述:
VHDL
attribute TYPE_ENCODING_style of <typename> : type is ONEHOT;
Verilog
Reg[2:0] state; // synthesis syn_encoding = "value"(onehot)
编码风格:
1. 避免生成锁存器
一个完备的状态机(健壮性强)应该具备初始化(reset)状态和默认(default)状态。
当芯片加电或者复位后,状态机应该能够自动将所有判断条件复位,并进入初始化状态。需要注
明的一点是,大多数 FPGA 有 GSR(Global Set/Reset)信号,当 FPGA 加电后,GSR 信号拉高,
对所有的寄存器,RAM 等单元复位/置位,这时配置于 FPGA 的逻辑并未生效,所以不能保证正确的
进入初始化状态。所以使用 GSR 进入 FPGA 的初始化状态,常常会产生种种不必一定的麻烦。一般
简单方便的方法是采用异步复位信号,当然也可以使用同步复位,但是要注意同步复位的逻辑设计。
状态机也应该有一个默认(default)状态,当转移条件不满足,或者状态发生了突变时,要能保
证逻辑不会陷入“死循环”。这是对状态机健壮性的一个重要要求,也就是常说的要具备“自恢复”功能。
对应于编码就是对 case,if-else 语句要特别注意,要写完备的条件判断语句。VHDL 中,当使用
CASE 语句的时候,要使用“When Others”建立默认状态。使用“IF...THEN...ELSE”语句的时候,要用
在“ELSE”指定默认状态。Verilog 中,使用“case”语句的时候要用“default”建立默认状态,使用“if...else”
语句的注意事项相似。
另外有一个技巧:大多数综合器都支持 Verilog
编码状态机的完备状态属性--“full case”。这个
属性用于指定将状态机综合成完备的状态,如 Synplicity 的综合工具(Synplify/Synplify Pro)支持的
命令格式如下:
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),也就是说在同一时间只有一个状态能够成立。
2. 参数定义用 parameter
状态的定义用 parameter 定义,不推荐使用`define 宏定义的方式,因为‘define 宏定义在编译时自动
替换整个设计中所定义的宏,而 parameter 仅仅定义模块内部的参数,定义的参数不会与模块外的其他状
态机混淆。
3. 一定要使用”<=”非阻塞赋值方式
采用非阻塞赋值方式消除很多竞争冒险的隐患。
引申讨论一个问题:在使用非阻塞赋值的时候,看见很多设计者采用"intra-assignment timing delay"(在
非阻塞赋值前人为加入一个很小单位的延时)。如下例:
always @(posedge clk or posedge rst)
if (rst)
state <= #1 IDLE;
else
state <= #1 nextstate;
关于这种写法的阐释有下面几点:
I. 首先,这种描述是行为级描述方式,仅仅在仿真时起作用,在综合时会自动被综合器忽略。也就是通
常所说的延时描述是不可综合的。
II. 这种描述的好处之一是:它简单模拟了赋值过程寄存器内部的 clock-to-output 的延时,在做行为级功
能仿真的时候,也可以发现一些由于寄存器固有延迟造成的时序和功能问题。
III. 避免了由 RTL 级代码向门级描述转变过程中的一些潜在错误。models from an RTL model.这种方式
很好的避免了 hold 时间带来的问题。
IV. 使用这种用法必须明确,综合是延时是被忽略的,所有同步时序的赋值仍然是按照非阻塞方式进行的。
总
总
结
结
:
:
一
一
般
般
来
来
说
说
,
,
越
越
是
是
复
复
杂
杂
的
的
设
设
计
计
越
越
需
需
要
要
遵
遵
循
循
C
C
o
o
d
d
i
i
n
n
g
g
s
s
t
t
y
y
l
l
e
e
。
。
对
对
F
F
S
S
M
M
的
的
设
设
计
计
也
也
是
是
如
如
此
此
。
。
对
对
于
于
简
简
单
单
的
的
m
m
o
o
o
o
r
r
e
e
型
型
的
的
F
F
S
S
M
M
(
(
输
输
出
出
不
不
超
超
过
过
5
5
个
个
)
)
。
。
因
因
为
为
是
是
单
单
方
方
向
向
的
的
递
递
进
进
关
关
系
系
,
,
所
所
以
以
可
可
以
以
用
用
s
s
i
i
n
n
g
g
l
l
e
e
a
a
l
l
w
w
a
a
y
y
s
s
模
模
式
式
。
。
对
对
于
于
m
m
e
e
e
e
l
l
y
y
型
型
F
F
S
S
M
M
和
和
复
复
杂
杂
的
的
m
m
o
o
o
o
r
r
e
e
型
型
F
F
S
S
M
M
一
一
定
定
要
要
采
采
用
用
t
t
w
w
o
o
a
a
l
l
w
w
a
a
y
y
s
s
的
的
编
编
码
码
模
模
式
式
。
。
对
对
于
于
特
特
别
别
复
复
杂
杂
的
的
F
F
S
S
M
M
(
(
输
输
出
出
超
超
过
过
5
5
个
个
)
)
,
,
应
应
该
该
把
把
输
输
出
出
单
单
独
独
建
建
立
立
a
a
l
l
w
w
a
a
y
y
s
s
b
b
l
l
o
o
c
c
k
k
,
,
可
可
以
以
用
用
组
组
合
合
逻
逻
辑
辑
方
方
式
式
(
(
输
输
出
出
对
对
应
应
于
于
当
当
前
前
状
状
态
态
)
)
,
,
也
也
可
可
以
以
用
用
时
时
序
序
方
方
式
式
(
(
输
输
出
出
赋
赋
值
值
对
对
应
应
于
于
n
n
e
e
x
x
t
t
s
s
t
t
a
a
t
t
e
e
)
)
。
。
具
具
体
体
参
参
考
考
下
下
面
面
的
的
文
文
档
档
!
!
在 ISE 和 Foundation 中都提供了 state-maching 生成器,用生成器生成 FSM 可以避免大多数问题,
而且代码规范。在了解状态机的设计原理后,就可以把主要精力放在
如
如
何
何
进
进
行
行
算
算
法
法
的
的
设
设
计
计
与
与
优
优
化
化
。
03.12.24
The Fundamentals of Efficient Synthesizable Finite State Machine
Design using NC-Verilog and BuildGates
Clifford E. Cummings
Sunburst Design, Inc.
503-641-8446
cliffc@sunburst-design.com
INTERNATIONAL CADENCE USERGROUP CONFERENCE
September 16-18, 2002
San Jose, California
ICU-2002
San Jose, CA
Voted Best Paper
2
nd
Place
剩余30页未读,继续阅读
资源评论
- Beccawbb2013-05-08挺好的资源,例子能再多点就好了
wjh20064713
- 粉丝: 3
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功