没有合适的资源?快使用搜索试试~ 我知道了~
如何写好状态机 Verilog FSM
4星 · 超过85%的资源 需积分: 14 9 下载量 167 浏览量
2011-05-17
13:22:47
上传
评论
收藏 358KB PDF 举报
温馨提示
试读
57页
如何写好状态机 通过使用实例告诉你如何用Verilog写常见的FSM 一段式FSM,两段式FSM,三段式FSM.
资源推荐
资源详情
资源评论
第七章 有限状态机和可综合风格的Verilog HDL
----------------------------------------------------------------------------------------------------------------------
114
第七章 有限状态机和可综合风格的Verilog HDL
前言
由于Verilog HDL和 VHDL 行为描述用于综合的历史还只有短短的几年,可综合风格的Verilog HDL 和
VHDL的语法只是它们各自语言的一个子集。又由于HDL的可综合性研究近年来非常活跃,可综合子集的
国际标准目前尚未最后形成,因此各厂商的综合器所支持的HDL子集也略有所不同。本教材中有关可综
合风格的Verilog HDL的内容,我们只着重介绍RTL级、算法级和门级逻辑结构的描述,而系统级(数
据流级)的综合由于还不太成熟,暂不作介绍。由于寄存器传输级(RTL)描述是以时序逻辑抽象所得
到的有限状态机为依据的,所以把一个时序逻辑抽象成一个同步有限状态机是设计可综合风格的
Verilog HDL模块的关键。在本章中我们将通过各种实例由浅入深地来介绍各种可综合风格的Verilog
HDL模块,并把重点放在时序逻辑的可综合有限状态机的Verilog HDL设计要点。至于组合逻辑,因为
比较简单,只需阅读典型的用Verilog HDL描述的可综合的组合逻辑的例子就可以掌握。为了更好地掌
握可综合风格,还需要较深入地了解阻塞和非阻塞赋值的差别和在不同的情况下正确使用这两种赋值
的方法。只有深入地理解阻塞和非阻塞赋值语句的细微不同,才有可能写出不仅可以仿真也可以综合
的Verilog HDL模块。只要按照一定的原则来编写代码就可以保证Verilog模块综合前和综合后仿真的
一致性。符合这样条件的可综合模块是我们设计的目标,因为这种代码是可移植的,可综合到不同的
FPGA和不同工艺的ASIC中,是具有知识产权价值的软核。
7.1.有限状态机
有限状态机是由寄存器组和组合逻辑构成的硬件时序电路,其状态(即由寄存器组的1和0的组合状态
所构成的有限个状态)只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态,究竟转向
哪一状态还是留在原状态不但取决于各个输入值,还取决于当前所在状态。
(这里指的是米里Mealy型有限状态
机,而莫尔Moore型有限状态机究竟转向哪一状态只决于当前状态。)
在Verilog HDL中可以用许多种方法来描述有限状态机,最常用的方法是用always语句和case语句。下
面的状态转移图表示了一个有限状态机,例1的程序就是该有限状态机的多种Verilog HDL模型之一:
Idle
Start
Stop
Clear
A/G=0 !A
A/F=1
!Reset /F=0 G=0
!Reset /F=0 G=0
!Reset | !A/F=0 G=1
图7.1 状态转移图
!Reset /F=0 G=0
第七章 有限状态机和可综合风格的Verilog HDL
----------------------------------------------------------------------------------------------------------------------
115
上面的状态转移图表示了一个四状态的有限状态机,它的同步时钟是Clock,输入信号是 A 和 Reset,
输出信号是 F 和 G。状态的转移只能在同步时钟(Clock)的上升沿时发生,往哪个状态的转移则取
决于目前所在的状态和输入的信号(Reset 和 A)。下面的例子是该有限状态机的Verilog HDL模型之
一:
[例1]:
module fsm (Clock, Reset, A, F, G);
input Clock, Reset, A;
output F,G;
reg F,G;
reg [1:0] state ;
parameter Idle = 2’b00, Start = 2’b01,
Stop = 2’b10, Clear = 2’b11;
always @(posedge Clock)
if (!Reset)
begin
state <= Idle; F<=0; G<=0;
end
else
case (state)
idle: begin
if (A) begin
state <= Start;
G<=0;
End
else state <= idle;
end
start: if (!A) state <= Stop;
else state <= start;
Stop: begin
if (A) begin
state <= Clear;
F <= 1;
end
else state <= Stop;
end
Clear: begin
if (!A) begin
state <=Idle;
F<=0; G<=1;
End
else state <= Clear;
end
endcase
endmodule
我们还可以用另一个Verilog HDL模型来表示同一个有限状态,见下例:
[例2]:module fsm (Clock, Reset, A, F, G);
input Clock, Reset, A;
第七章 有限状态机和可综合风格的Verilog HDL
----------------------------------------------------------------------------------------------------------------------
116
output F,G;
reg F,G;
reg [3:0] state ;
parameter Idle = 4’b1000,
Start = 4’b0100,
Stop = 4’b0010,
Clear = 4’b0001;
always @(posedge clock)
if (!Reset)
begin
state <= Idle; F<=0; G<=0;
end
else
case (state)
Idle: begin
if (A) begin
state <= Start;
G<=0;
end
else state <= Idle;
end
Start: if (!A) state <= Stop;
else state <= Start;
Stop: begin
if (A) begin
state <= Clear;
F <= 1;
End
Else state <= Stop;
end
Clear: begin
if (!A) begin
state <=Idle;
F<=0; G<=1;
End
else state <= Clear;
end
default: state <=Idle;
endcase
endmodule
[例2]与[例1]的主要不同点是状态编码,[例2]采用了独热编码,而[例1]则采用Gray码,究竟采用哪
一种编码好要看具体情况而定。对于用FPGA实现的有限状态机建议采用独热码,因为虽然采用独热编
码多用了两个触发器,但所用组合电路可省下许多,因而使电路的速度和可靠性有显著提高,而总的
单元数并无显著增加。采用了独热编码后有了多余的状态,就有一些不可到达的状态,为此在CASE语
句的最后需要增加default分支项,以确保多余状态能回到Idle状态。
我们还可以再用另一种风格的Verilog HDL模型来表示同一个有限状态,在这个模型中,我们用always
语句和连续赋值语句把状态机的触发器部分和组合逻辑部分分成两部分来描述。见下例:
第七章 有限状态机和可综合风格的Verilog HDL
----------------------------------------------------------------------------------------------------------------------
117
[例3]
module fsm (Clock, Reset, A, F, G);
input Clock, Reset, A;
output F,G;
reg [1:0] state ;
wire [1:0] Nextstate;
parameter Idle = 2’b00, Start = 2’b01,
Stop = 2’b10, Clear = 2’b11;
always @(posedge Clock)
if (!Reset)
begin
state <= Idle;
end
else
state <= Nextstate;
assign Nextstate = ( state == Idle ) ? ( A ? Start : Idle ) :
( state==Start ) ? ( !A ? Stop : Start ) :
( state== Stop ) ? ( A ? Clear : Stop ) :
( state== Clear) ? ( !A ? Idle : Clear) : Idle;
assign F = (( state == Stop) && A );
assign G = (( state == Clear) && (!A || !Reset));
endmodule
我们还可以再用另一种风格的Verilog HDL模型来表示同一个有限状态,在这个模型中,我们分别用沿
触发的always语句和电平敏感的always语句把状态机的触发器部分和组合逻辑部分分成两部分来描
述。见下例:
[例4]
module fsm (Clock, Reset, A, F, G);
input Clock, Reset, A;
output F,G;
reg [1:0] state, Nextstate;
parameter Idle = 2’b00, Start = 2’b01,
Stop = 2’b10, Clear = 2’b11;
always @(posedge Clock)
if (!Reset)
begin
state <= Idle;
end
else
state <= Nextstate;
always @( state or A )
begin
第七章 有限状态机和可综合风格的Verilog HDL
----------------------------------------------------------------------------------------------------------------------
118
F=0;
G=0;
if (state == Idle)
begin
if (A)
Nextstate = Start;
else
Nextstate = Idle;
G=1;
end
else
if (state == Start)
if (!A)
Nextstate = Stop;
else
Nextstate = Start;
else
if (state == Stop)
if (A)
Nextstate = Clear;
else
Nextstate = Stop;
else
if (state == Clear)
begin
if (!A)
Nextstate = Idle;
else
Nextstate = Clear;
F=1;
end
else
Nextstate= Idle;
end
endmodule
上面四个例子是同一个状态机的四种不同的Verilog HDL模型,它们都是可综合的,在设计复杂程度不
同的状态机时有它们各自的优势。如用不同的综合器对这四个例子进行综合,综合出的逻辑电路可能
会有些不同,但逻辑功能是相同的。下面总结了有限状态机设计的一般步骤,供大家参考。
有限状态机设计的一般步骤:
1) 逻辑抽象,得出状态转换图
就是把给出的一个实际逻辑关系表示为时序逻辑函数,可以用状态转换表来描述,也可以用状
态转换图来描述。这就需要:
• 分析给定的逻辑问题,确定输入变量、输出变量以及电路的状态数。通常是取原因(或条
件)作为输入变量,取结果作为输出变量。
• 定义输入、输出逻辑状态的含意,并将电路状态顺序编号。
• 按照要求列出电路的状态转换表或画出状态转换图。
这样,就把给定的逻辑问题抽象到一个时序逻辑函数了。
剩余56页未读,继续阅读
资源评论
- 微笑小鱼2012-05-09好像是硬件编程语言的一个状态机,想找C++的呢
新月冷焰
- 粉丝: 6
- 资源: 22
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功