null硬件描述语言 硬件描述语言 同步状态机的
原理、结构和设计同步状态机的
原理、结构和设计主要内容主要内容状态机的结构
Mealy状态机和Moore状态机的不同点
如何用Verilog来描述可综合的状态机什么是有限状态机?什么是有限状态机?有限状态机是由寄存器组和组合逻辑构成的硬件时序电路;其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只能在同一时钟跳变沿的 情况下才能从一个状态转向另一个状态;究竟转向哪一状态不但取决于各个输入值还取决于当前状态。状态机可用于产生在时钟跳变沿时刻开关的复杂的控制逻辑,是数字逻辑的控制核心。状态机的结构状态机的结构状态寄存器:
产生下一个状态的组合逻辑:
输出逻辑:
下一个状态=F(当前状态,输入信号)
输出信号=G(当前状态,输入信号)记忆状态机当前所处的状态,n个触发器可以记忆2n个状态根据输入信号和当前状态,决定下一个状态由当前状态和输出信号决定当前状态的输出。null
状态机可用于产生在时钟跳变沿时刻开关的复杂的控制逻辑,是数字逻辑的控制核心。通常用case语句设计实现,注意以下三点:
状态翻转时刻。
前状态下次态
当前状态下输出状态机的种类状态机的种类隐式状态机FSM
不需要声明状态寄存器
仿真效率高
只适合于线性的状态改变
大多数综合工具不能处理显式FSM:
利于结构化
易于处理缺省条件
能处理复杂的状态改变
所有综合工具都支持 按照输出逻辑又可以分为:按照输出逻辑又可以分为:Mealy状态机:时序逻辑的输出不仅取决于当前状态,还取决于输入。
Moore状态机:时序逻辑的输出只取决于当前状态。Mealy状态机和Moore状态机Mealy状态机和Moore状态机Mealy 状态机
下一个状态 = F(当前状态,输入信号);
输出信号 = G(当前状态,输入信号);图 时钟同步的状态机结构 (Mealy 状态机)Moor 状态机
下一个状态 = F(当前状态,输入信号)
输出信号 = G(当前状态);Moor 状态机
下一个状态 = F(当前状态,输入信号)
输出信号 = G(当前状态);图 时钟同步的状态机结构 (Moor状态机) 带流水线输出的 Mealy 状态机
下一个状态 = F(当前状态,输入信号);
输出信号 = G(当前状态,输入信号); 带流水线输出的 Mealy 状态机
下一个状态 = F(当前状态,输入信号);
输出信号 = G(当前状态,输入信号);图3 带流水线输出的Mealy 状态机 如何用Verilog来描述状态机如何用Verilog来描述状态机图形表示:状态、转移、条件和逻辑开关有限状态机的图形表示图2.4.4 状态转移图
有限状态机的Verilog描述定义模块名和输入输出端口;
定义输入、输出变量或寄存器;
定义时钟和复位信号;
定义状态变量和状态寄存器;
用时钟沿触发的always块表示状态转移过程;
在复位信号有效时给状态寄存器赋初始值;
描述状态的转换过程:符合条件,从一个状态到另外一个状态,否则留在原状态;
验证状态转移的正确性,必须完整和全面。有限状态机的Verilog描述用可综合的Verilog模块设计状态机的典型方法用可综合的Verilog模块设计状态机的典型方法module fsm (Clock, Reset, A, K2, K1);
input Clock, Reset, A; //定义时钟、复位和输入信号
output K2, K1; //定义输出控制信号的端口
reg K2, K1; //定义输出控制信号的寄存器
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; K2<=0; K1<=0;
endnullelse
case (state)
Idle: begin
if (A) begin
state <= Start;
K1<=0;
end
else state <= Idle;
end
Start: begin
if (!A) state <= Stop;
else state <= Start;
endnull Stop: begin //符合条件进入新状态,否则留在原状态
if (A) begin
state <= Clear;
K2<= 1;
end
else state <= Stop;
end
Clear: begin
if (!A) begin
state <= Idle;
K2<=0; K1<=1;
end
else state <= Clear;
end
endcase
endmodule nullSypify综合Sypify综合Quartus综合Quartus综合null用可综合的Verilog模块设计,用独热码表示状态的状态机我们还可以用另一个 Verilog HDL模型来表示同一个有限状态,
见下例。(用可综合的Verilog模块设计用独热码表示状态的状态机)
module fsm (Clock, Reset, A, K2, K1);
input Clock, Reset, A;
output K2, K1;
reg K2, K1;
reg [3:0] state ;
parameter Idle = 4’b1000,
Start = 4’b0100,
Stop = 4’b0010,
Clear = 4’b0001;
用可综合的Verilog模块设计,用独热码表示状态的状态机null always @(posedge clock)
if (!Reset)
begin
state <= Idle; K2<=0; K1<=0;
end
else
case (state)
Idle: if (A) begin
state <= Start;
K1<=0;
end
else state <= Idle;
null Start: if (!A) state <= Stop;
else state <= Start;
Stop: if (A) begin
state <= Clear;
K2<= 1;
end
else state <= Stop;
Clear: if (!A) begin
state <=Idle;
K2<=0; K1<=1;
end
else state <= Clear;null default: state <= Idle;
endcase
endmodule
[例2]与[例1]的主要不同点是状态编码,[例2]采用了独热编码,而[例1]则采用Gray码,究竟采用哪一种编码好要看具体情况而定。 FPGA设计建议采用独热编码。由输出制定的码表示状态的状态机 直接把状态码定义为输出,也就是把状态码的指定与状态机控制的输出联系起来,把状态的变化直接用作输出,这样做可以提高输出信号的开关速度并节省电路器件。由输出制定的码表示状态的状态机 这种设计方法常用在高速状态机中,在设计高速状态机时可以采用该方法。例中state[3] 和state[0]分别表示前面两个例子中的输出K2和K1。nullmodule fsm (Clock, Reset, A, K2, K1, state);
input Clock, Reset, A;
output K2, K1;
output [4:0] state;
reg [4:0] state ;
assign
K2= state[4]; // 把状态变量的最高位用作输出K2
assign
K1= state[0]; // 把状态变量的最低位用作输出K1nullparameter
//-------output coded state assignment ---
//-------- K2_i_j_n_K1 –
Idle = 5'b0_0_0_0_0,
Start = 5'b0_0_0_1_0,
Stop = 5'b0_0_1_0_0,
StopToClear = 5'b1_1_0_0_0,
Clear = 5'b0_1_0_1_0,
ClearToIdle = 5'b0_0_1_1_1;
null always @(posedge Clock)
if (!Reset)
begin
state <= Idle;
end
else
case (state)
Idle : if (A)
state <= Start;
else state <= Idle;
Start: if (!A) state <= Stop;
else state <= Start;nullStop: if (A)
state <= StopToClear;
else state <= Stop;
StopToClear: state <= Clear;
Clear: if (!A)
state <= ClearToIdle;
else state <= Clear;
ClearToIdle: state <= Idle;
default: state <= Idle;
endcase
endmodule由输出制定的码表示状态的状态机在比较复杂的状态机设计过程中,往往把状态的变化与输出开关的控制分成两部分来考虑。就象前面讲过的Mealy状态机输出部分的组合逻辑。由输出制定的码表示状态的状态机为了调试方便,通常把每一个输出开关写成一个个独立的always组合块。在调试多输出状态机时,这样做比较容易发现问题和改正模块编写中出现的问题。nullmodule fsm (Clock, Reset, A, K2, K1);
input Clock, Reset, A;
output K2, K1;
reg K2, K1;
reg [1:0] state, nextstate ;
parameter
Idle = 2'b00,
Start = 2'b01,
Stop = 2'b10,
Clear = 2'b11;null //-------- 每一个时钟沿产生一次可能的状态变化-----------
always @(posedge Clock)
begin
if (!Reset)
state <= Idle;
else
state <= nextstate;
end
//-------------------------------------------------------null//------ 产生下一状态的组合逻辑 -------------------------
always @(state or A)
case (state)
Idle: if (A)
nextstate = Start;
else nextstate = Idle;
Start: if (!A) nextstate = Stop;
else nextstate = Start;
Stop: if (A) nextstate = Clear;
else nextstate = Stop;
Clear: if (!A) nextstate = Idle;
else nextstate = Clear;
default: nextstate =2'bxx;
endcase
null//---- 产生输出K1的组合逻辑 --------------
always @(state or Reset or A)
if (!Reset) K1=0;
else
if (state == Clear && !A) //从Clear转向 Idle
K1=1;
else K1= 0;
//--- 产生输出K2的组合逻辑 ---------------
always @(state or Reset or A )
if (!Reset) K2 = 0;
else
if (state == Stop && A) // 从Stop转向 Clear
K2 = 1;
else K2 = 0;
//------------------------------------------
endmodule状态机的测试状态机的测试不同风格的描述适合不同规模的状态机和不同的综合工具,有的风格查错和修改较容易,但写简单的状态机时比较麻烦。上面四个例子是同一个状态机的四种不同的Verilog HDL模型,它们都是可综合的,在设计复杂程度不同的状态机时有它们各自的优势。如用不同的综合器对这四个例子进行综合,综合出的逻辑电路可能会有些不同,但逻辑功能是相同的。 状态机的测试模块 状态机的测试模块`timescale 1ns/1ns
module t;
reg a;
reg clock,rst;
wire k2,k1;
initial // initial常用于仿真时信号的给出。
begin
a=0;
rst = 1; //给复位信号变量赋初始值
clock = 0; //给时钟变量赋初始值
#22 rst = 0; //使复位信号有效
#133 rst = 1; //经过一个多周期后使复位信号无效
end
状态机的测试模块 状态机的测试模块 always #50 clock = ~clock; //产生周期性的时钟
always @ (posedge clock) //在每次时钟正跳变沿时刻产生不同的a
begin
#30 a = {$random}%2; // 每次a是 0还是1是随机的。
#(3*50+12); // a 的值维持一段时间
end
initial
begin #100000 $stop; end
//系统任务,暂停仿真以便观察仿真波形。
//----------- 调用被测试模块t.m ----------
fsm m(.Clock(clock), .Reset(rst),.A(a),.K2(k2),.K1(k1));
endmodule 状态机设计的总结:状态机设计的总结:有限状态机设计的一般步骤:1) 逻辑抽象,得出状态转换图,包括:确定输入、输出信号,状态的数量及编号,并画出状态转换图2) 状态化简3) 状态分配
在触发器资源丰富的FPGA或ASIC设计中采用独热编码(one-hot-coding)既可以使电路性能得到保证又可充分利用其触发器数量多的优势,也可以采取输出编码的状态指定来简化电路结构,并提高状态机的运行速度。4) 选定触发器的类型并求出状态方程、驱动方程和输出方程。5) 按照方程得出逻辑图null
用Verilog HDL来描述有限状态机,可以充分发挥硬件描述语言的抽象建模能力,使用always块语句和case(if)等条件语句及赋值语句即可方便地实现。具体的逻辑化简及逻辑电路到触发器映射均可由计算机自动完成,上述设计步骤中的第2步及4、5步不再需要很多的人为干预,使电路设计工作得到简化,效率也有很大的提高。
本文档为【Verilog课件__状态机】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。