verilog FPGA 状态机描述

合集下载

verilog 状态机 最佳写法

verilog 状态机 最佳写法

verilog 状态机最佳写法Verilog编程语言广泛应用于数字电路设计中,特别是在嵌入式系统和硬件描述语言中。

状态机是一种常用的设计模式,可以帮助我们描述复杂的行为和控制逻辑。

本文将介绍如何使用Verilog编写状态机,并提供一些最佳实践。

第一部分:Verilog简介Verilog是一种硬件描述语言,最初由美国自动化控制协会(ACM)开发。

它是一种用于描述、仿真和生成数字电路的高级编程语言。

Verilog提供了描述硬件的能力,使我们能够在逻辑级别上描述电路的行为。

第二部分:状态机简介状态机是一种抽象的数学模型,用于描述系统或程序的行为。

它由一组状态、输入和输出组成,并在不同状态之间进行转换。

状态机可以用于描述任何连续或离散的系统,包括硬件和软件。

第三部分:状态机的设计方法在Verilog中,我们可以使用参数化模块和状态寄存器来描述状态机。

参数化模块可以接受输入和输出,根据当前状态和输入转换到下一个状态,并产生相应的输出。

下面是一个简单的例子:```module fsm #(parameter N=3) (input logic clk, reset, input logic [N-1:0] input, output [N-1:0] output);typedef enum logic [1:0] {S0, S1, S2} state_t;state_t state, next_state;always_ff @(posedge clk or posedge reset) begin if (reset) beginstate <= S0;end else beginstate <= next_state;endendalways_comb begincase (state)S0: begin// State S0 behavioroutput = input;next_state = S1;endS1: begin// State S1 behavioroutput = ~input;next_state = S2;endS2: begin// State S2 behavioroutput = 2'b11;next_state = S0;enddefault: begin// Default behavioroutput = 2'b00;next_state = S0;endendcaseendendmodule```在这个例子中,我们定义了一个状态机模块,它有一个时钟信号、一个复位信号、一个输入信号和一个输出信号。

基于Verilog 的有限状态机设计

基于Verilog 的有限状态机设计

基于Verilog 的有限状态机设计与优化1 引言在集成电路的设计过程中, 不论是使用FPGA还是ASIC 来实现, 有限状态机经常是作为一个电路设计的关键部分而出现的. 状态机的功能是否完善( 是否强壮型) 对整个电路会产生重大的影响.有限状态机主要有两种类型: Moore 型状态机和M ealy 型状态机. Moore 型状态机是指输出只与当前状态有关, 与输入信号无直接关系. 而Mealy 型状态机的输出不只与当前状态有关, 还与输入信号有关.文中以目前常用的硬件描述语言Verilog HDL 为基础, 对不同的状态机编码类型和状态机描述风格对状态机性能的影响进行了深入的分析. 分别使用Xilinx ISE 和Design Compiler 对实例进行了综合,分析了面积、速度与功耗的信息, 给出了对于不同类型状态机的最佳编码风格.2 状态机编码状态的编码方式最常用的有二进制码、格雷码和独热码三种, 不同的状态机编码方式对状态机的影响非常大. 如表1 所示.二进制的编码从第一个状态到最后一个状态是按二进制码的顺序排列的, 是一种最普通的编码方式.表1 不同的编码比较十进制码Binary code Gray code One- hot code0 000 000 00011 001 001 00102 010 011 01003 011 010 1000用格雷码进行状态的变换时, 相邻状态转换只有一个状态位发生翻转. 这样就可以消除转换时由多条状态信号线的传输延迟所造成的毛刺, 大大地减少了由一个状态到下一个状态时逻辑的混淆可以降低功耗.one- hot 状态译码简单, 只有1 位是1 其他位为0, 易于修改, 可以减少组合逻辑, 但会使用更多的触发, 增加电路面积.Binary- code、Gray- code 编码使用最少的触发器, 较多的组合逻辑, 而One- hot 编码反之.因此, Binary 和Gray- code 适用于触发器资源较少, 组合电路资源丰富的情况( CPLD) , 对于FP GA 则更适用One- hot code, 因为这样可以充分利用FPGA 丰富的触发器资源. 另外, 小型设计通常使用Binary- code 和Gray- code, 对于大型的设计使用One- hot code 效果更佳.3 状态机的描述方法状态机的描述方法通常有三种: 一段式( one al ways) 、二段式( two always) 和三段式( three always) .3. 1 一段式一段式的状态机描述方法是指将整个状态机写到一个alw ays 模块里, 该模块描述当前状态转移, 又描述状态的输入和输出.由于一段式的描述方法是给STATE 自身赋值, 所以本身就会引入一个周期的延时, 需要在设计中通过预计算考虑进去.一段式的描述方法所有输出都是寄存器输出的, 因此不会产生毛刺, 但是这种组合逻辑和时序逻辑都写到一起的方法是不可取的, 而且在描述当前状态的时候还要考虑到下一状态的输出. 这种描述方法可读性差、难于理解和维护, 不利于时许约束、功能更改及调试, 对于Mealy 型的状态机来说, 容易出现Latches.3. 2 二段式二段式的状态机描述方法是指使用两个always模块, 其中一个always 模块采用同步时序的方式描述当前状态和下一状态的转移, 另一个alw ays 模块采用组合逻辑来描述下一状态和输出向量的赋值.二段式的描述方法比一段式的更合理, 它更易于阅读、理解和维护, 更利于综合并优化代码. 但是它的缺点是第二个alw ays 块组合逻辑的输出会出现毛刺, 影响电路性能.3. 3 三段式三段式的状态机描述方法是由二段式发展而来的, 在二段式两个alw ays 的基础上又增加了一个alw ays 块来描述每个状态的输出, 用寄存器寄存了一拍, 达到同步输出的目的.需要注意的是, 增加的一级寄存器会引入一个周期的延时, 需要在设计中通过预计算考虑进去, 避免逻辑发生错误. 这样一级寄存器的引入, 也就形成了FSMs 输入逻辑的一级流水.引入了组合逻辑寄存, 输出同步不仅会带来运行性能的提升, 还会增加系统的稳定性, 防止输出信号出现毛刺, 防止组合回路的产生.4 实例分析下面以一个简单红绿灯状态转移为例进行分析, 当RESET 信号给出以后进入IDEL 状态, 之后状态机的描述方法通常有三种: 一段式( one al 进入RED 状态, 之后进入GREEN 状态, 之后进入YELLOW 状态, 最后回到RED 状态. Default 时进入IDEL 状态.一4. 1 使用Xilinx ISE 进行分析在使用Xilinx ISE 对例子进行综合的时候, 右键点中综合软件, 选属性选型, 在HDL Options 中有一个优化选项为FSM Encoding Algorithm, 在其下拉菜单中选中AUTO( 默认项) , 工具就可以自动修改设计中的状态机的状态编码, 使其成为对FPGA 来说最优的编码风格.对于本设计来说, 由于只有4 个状态, 所以状态编码被优化成了Gray- code. 但是经过验证, 在状态较多的状态机设计中, 状态编码一般都被优化成One- hot code.通过表2, 对Xilinx ISE 的综合后报表进行分析可以看到, 由于one always 的状态机全部为时序电路,所以最大频率会比two alw ays 和three always 大.在面积方面, two always 型的状态机所占面积最小, three alw ays 稍大, 而one alw ays 型的状态机所用门数最多, 所占面积也最大.对于功耗来说, 使用Xilinx ISE 集成的Xpower进行功耗分析, 所得到的三种状态机编码风格的功耗并不存在明显差异.表2 Xilinx ISE 的综合结果使用门数最大频率one alw ays 8 313. 283MHztwo always 43 312. 891MHzthree alw ays 67 312. 891MHz4. 2 使用Design Compiler 进行分析在使用Design Complier 对所举实例进行分析话时, 分别选取了1always& binary、1always& one - hot、2always& binary、2alw ays& one - hot 、3alw ays& binary、3always& one- hot 等6 种设计, 每个设计分别设定了2 个时钟周期( . ns 和7ns) 进行分析. 综合得到的面积和延时的结果按顺序标在图2、图3 中. 表3、表4 给出了详细的数据.由图2 可见, 2alw ays 在面积上具有明显优势,其次是3alw ays. 由图3 对时序的分析可见, 2alw ays也是具有一定的优势.比较使用Design Compiler 和Xilinx ISE 的综合结果可以发现, 不论是使用FPGA 还是ASIC, tw oalw ays 所占面积总是最小的, 其次是three alw ays,而one alw ays 所占面积最大. 这主要是由于one alw ays 的状态机全部为时序电路, 所以花费的面积最大, three alw ays 由于多采用一级寄存器同步, 所以所花费的面积比two always 的要大一些.5 比较分析通过以上分别使用Xilinx ISE 和Design Compiler 对实例进行的分析, 可见two alw ays 的编码风格存在巨大的优势. 因为Moore 型的状态机输出只有状态寄存器驱动, 状态机所受影响差异不会很大,所以建议对Moore 型状态机采用two alw ays 的编码风格.而Mealy 型状态机, 输出不只与当前状态有关,还与输入信号有关, 输出是组合逻辑的输出, 这样在每个STATE 中产生的信号复杂而且有不同的timeskew , 如果信号直接输出而不引用寄存器同步的话, 在高频的电路中很可能会导致时序上的错误. 所以建议使用three alw ays 风格, 将输出同步一拍.对于one alw ays 的风格, 虽然在一些开源的IP盒中经常见到, 但是通过以上的分析, 可以发现这种状态及描述风格存在着巨大的缺陷.至于状态编码的使用, 对于FPGA 来说建议使用工具自动优化状态机的状态编码, 而对于ASIC 来说, 建议在小型设计中使用Binary- code 和Gray code, 而对于大型的设计则使用One- hot code.6 结束语文中结合了一个Verilog HDL 的实例, 对三种不同的状态机编码和状态机描述方式进行了深入的研究, 分析了其各自的优缺点. 并分别使用Xilinx ISE 和Design Compiler 对一个实例进行了综合, 对面积、速度与功耗进行了分析. 结果表明one alw ays的写法需要被摒弃, two alw ays 的编码风格适合Moore 型状态机, 而three always 的编码风格适合Mealy 型状态机. 文中同时也给出了适合不同设计的最优状态编码。

verilog的三种描述方式

verilog的三种描述方式

Verilog的三种描述方式Verilog是一种硬件描述语言(HDL),用于描述数字电路和系统。

它是一种高级语言,允许工程师以更高层次的抽象来描述电路,从而简化了电路设计和验证过程。

Verilog有三种主要的描述方式,分别是结构描述、行为描述和数据流描述。

本文将详细介绍这三种描述方式,并分析它们的特点和适用场景。

1. 结构描述结构描述是Verilog的一种描述方式,它通过层次结构和模块之间的连接关系来描述电路。

在结构描述中,我们可以使用模块、端口、电路连接和实例化等概念来描述电路的组成和连接方式。

结构描述类似于画出电路图,只需要关注电路的结构和连接关系,而不需要考虑电路的具体功能。

结构描述的语法如下所示:module ModuleName (input wire A, input wire B, output wire C);// 输入端口定义// 输出端口定义// 内部信号定义// 子模块实例化// 逻辑实现endmodule结构描述的特点是清晰明了,易于理解和调试。

通过模块化的设计和层次结构,可以方便地对电路进行分析和调试。

结构描述适用于需要详细描述电路结构和连接关系的场景,比如设计一个复杂的处理器或系统。

2. 行为描述行为描述是Verilog的另一种描述方式,它通过描述电路的功能和行为来实现对电路的描述。

行为描述使用类似于编程语言的语法,可以使用条件语句、循环语句和顺序语句等来描述电路的行为。

在行为描述中,我们可以直接使用Verilog的语法来描述电路的逻辑功能,而不需要关注电路的结构和连接关系。

行为描述的语法如下所示:module ModuleName (input wire A, input wire B, output wire C);// 输入端口定义// 输出端口定义// 内部信号定义// 逻辑实现always @ (A or B) begin// 行为描述endendmodule行为描述的特点是灵活性高,可以方便地实现复杂的逻辑功能。

verilog奇偶分频、一段式、两段式、三段式状态机

verilog奇偶分频、一段式、两段式、三段式状态机

汇报总结1、偶数分频偶数倍分频相对简单,可以通过计数器对预分频的脉冲沿计数实现,如果要进行N倍(N为整数)偶数分频,可由预分频的时钟触发计数器计数,当计数器从0计数到N/2—1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数,以此循环下去。

分频的主体程序如下:`define div_en 8module freq_div_even(clk_in,reset,clk_out);input clk_in;input reset;output clk_out;reg clk_out;reg[2:0] count;initialbegincount=0;clk_out=0;endalways@(posedge clk_in)beginif(!reset)begincount<=0;clk_out<=0;endelseif(count==(`div_en/2-1))beginclk_out<=~clk_out;count<=0;endelsebegincount<=count+1;endendendmodule下面定义N为8,对一个脉冲8分频,测试程序如下:`timescale 1ns/1nsmodule testbench;reg reset;reg clk_in;reg[2:0] count;wire clk_out;freq_div_even test(.clk_in(clk_in),.reset(reset),.clk_out(clk_out));initialbeginreset=0;clk_in=0;#5 reset=1;endalways #10 clk_in=~clk_in;endmodule波形图如下:2、奇数分频对于对占空比没有特殊要求的奇数分频,需要对上升沿和下降沿脉冲进行计数,利用下降沿产生的波形移相半个输入脉冲的作用,最后用错位“异或”法实现。

最新FPGA状态机学习笔记(verilog)资料

最新FPGA状态机学习笔记(verilog)资料

FPGA之有限状态机学习笔记有限状态机(FSM)是由寄存器组合组合逻辑构成的硬件时序电路。

FSM 的状态只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态。

Mealy型FSM的下一个状态不仅取决于当前所在状态,还取决于各个输入值。

Moore型FSM的下一个状态只取决于当前状态。

Verilog HDL可以用很多方法描述FSM,最常用的是用always语句和case 语句。

FSM常用模型有Gray和独热码两种,对于用FPGA实现的FSM建议采用独热码。

因为采用独热码可省下许多组合电路的使用,提高电路的速度和可靠性,且总的单元数并无显著增加。

用Verilog语言描述FSM,可以充分发挥硬件描述语言的抽象建模能力。

有限状态机设计的一般步骤:(1)、逻辑抽象,得出状态转换图(2)、状态化简(3)、状态分配(4)、选定触发器的类型并求出状态方程、驱动方程和输出方程(5)、按照方程得出逻辑图以下就是分别用独热码和Gray码实现上述状态的源程序:采用独热码源程序:module fsm(Clock,Reset,A,B,C,D,E,Multi,Contig,Single);input Clock;input Reset;input A,B,C,D,E;output Multi,Contig,Single;reg Multi;reg Contig;reg Single;parameter [6:0]S1=7'b0000001,S2=7'b0000010,S3=7'b0000100,S4=7'b0001000,S5=7'b0010000,S6=7'b0100000,S7=7'b1000000;parameter U_DL Y=1;reg [6:0] curr_st;reg [6:0] next_st;always @(posedge Clock or posedge Reset) beginif(!Reset)curr_st=S1;elsecurr_st= #U_DL Y next_st;endalways @(curr_st or A or B or C or D or E) begincase(curr_st)S1:beginMulti =1'b0;Contig =1'b0;Single =1'b0;if(A&~B&C)next_st =S2;else if(A&B&~C)next_st =S4;elsenext_st =S1;endS2:beginMulti =1'b1;Contig =1'b0;Single =1'b0;if(!D)next_st =S3;elsenext_st =S4;endS3:beginMulti =1'b0;Contig =1'b1;Single =1'b0;if(A|D)next_st =S4;elsenext_st =S3;endS4:beginMulti =1'b1;Contig =1'b1;Single =1'b0;if(A&B&~C)next_st =S5;elsenext_st =S4;endS5:beginMulti =1'b1;Contig =1'b0;Single =1'b0;next_st =S6;endS6:beginMulti =1'b0;Contig =1'b1;Single =1'b1;if(!E)next_st =S7;elsenext_st =S6;endS7:beginMulti =1'b0;Contig =1'b1;Single =1'b0;if(E)next_st =S1;elsenext_st =S7;enddefault:next_st =S1;endcaseendendmoduleModelsim仿真激励文件程序如下:`timescale 1 ns/ 1 psmodule fsm_vlg_tst();// constants// general purpose registersreg eachvec;// test vector input registersreg A;reg B;reg C;reg Clock;reg D;reg E;reg Reset;// wireswire Contig;wire Multi;wire Single;// assign statements (if any)fsm i1 (// port map - connection between master ports and signals/registers .A(A),.B(B),.C(C),.Clock(Clock),.Contig(Contig),.D(D),.E(E),.Multi(Multi),.Reset(Reset),.Single(Single));initialbeginClock=0;forever #10Clock=~Clock;endinitialbeginReset=0;#100Reset=1;endinitialbegin//{A,B,C,D,E}=5'b10101;//# 10// {A,B,C,D,E}=5'b11000;{A,B,C,D,E}=5'b10111;//A=1;//B=0;//C=1;#100//{A,B,C,D,E}=5'b10101;D=0;#50//{A,B,C,D,E}=5'b10111;A=1;D=1;#50//{A,B,C,D,E}=5'b11011;A=1;B=1;C=0;#100//{A,B,C,D,E}=5'b11010;E=0;#50//{A,B,C,D,E}=5'b11011;E=1;endendmodule注:initial块中语句是顺序执行的,因此在需要延时的时候,按相对时间延时。

fpga 有限状态机例子

fpga 有限状态机例子

fpga 有限状态机例子有限状态机(Finite State Machine,FSM)是一种常见的设计模式,用于描述和实现具有有限数量状态的对象的行为。

在硬件设计中,有限状态机常常用于描述数字逻辑电路的行为。

以下是一个使用Verilog语言编写的简单有限状态机的例子:verilog复制代码module counter(input clk, reset, output reg [3:0] count);// 定义状态机的状态parameter IDLE = 4'b0000; // 初始状态parameter COUNTER = 4'b0001; // 计数状态// 状态机的当前状态reg [3:0] current_state;// 状态转移逻辑always @(posedge clk or posedge reset) begin if (reset) begincurrent_state <= IDLE; // 如果reset信号为高,则进入IDLE状态end else begincase (current_state)IDLE: beginif (count == 4'b1000) current_state <= COUNTE R; // 如果计数达到8,则进入COUNTER状态endCOUNTER: begincurrent_state <= IDLE; // 在COUNTER状态下,计数完成后回到IDLE状态enddefault: begincurrent_state <= IDLE; // 如果状态机处于未知状态,则强制回到IDLE状态endendcaseendend// 计数逻辑always @(posedge clk) beginif (current_state == COUNTER) count <= count + 1; // 在COUNTER状态下,计数器递增endendmodule在这个例子中,我们定义了一个简单的4位计数器。

Verilog三段式状态机描述

Verilog三段式状态机描述
end
end
同样的状态机也可以用下面的代码以“One hot”编码方式实现。
// These are the symbolic names for states
// 定义状态的符号名称
parameter [1:0]
S0 = 2'h0,
S1 = 2'h1,
S2 = 2'h2,
Verilog三段式状态机描述
时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息。
状态机采用VerilogHDL语言编码,建议分为三个always段完成。
三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器, 然后直接在每个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件。
case (state)
S0: begin
if (x) begin
next_state = S1;
end
else begin
next_state = S2;
end
always @ (posedge clk or negedge rst_n) //异步复位
if(!rst_n)
current_state <= IDLE;
else
current_state <= next_state;//注意,使用的是非阻塞赋值
//第二个进程,组合逻辑always模块,描述状态转移条件判断
end
endcase
end
always @ (posedge clk or posedge reset)
begin

verilog的三种描述方式

verilog的三种描述方式

verilog的三种描述方式(最新版)目录1.引言2.Verilog 描述方式概述1.结构描述2.数据流描述3.行为描述4.混合描述3.结构描述1.门级结构描述2.模块级结构描述4.数据流描述1.逻辑关系2.持续赋值语句5.行为描述1.寄存器传输级描述2.状态机描述6.混合描述7.结论正文一、引言Verilog 是一种硬件描述语言,广泛应用于数字电路和模拟混合信号电路的设计验证。

在 Verilog 中,有多种描述方式可以实现逻辑功能,包括结构描述、数据流描述、行为描述和混合描述。

本文将对这些描述方式进行详细介绍。

二、Verilog 描述方式概述1.结构描述:通过调用逻辑原件,描述它们之间的连接来建立逻辑电路的 Verilog 模型。

这里的逻辑元件包括内置逻辑门、自主研发的已有模块、商业 IP 模块。

结构描述分为门级结构描述和模块级结构描述。

2.数据流描述:根据信号之间的逻辑关系,采用持续赋值语句描述逻辑电路的行为。

数据流描述关注信号的传输和处理过程,适用于组合逻辑电路的设计。

3.行为描述:通过描述电路的输入输出行为,以及电路内部状态的变化,来实现逻辑功能的描述。

行为描述主要包括寄存器传输级描述和状态机描述。

4.混合描述:结合结构描述、数据流描述和行为描述,实现对逻辑功能的全面描述。

混合描述可以充分利用 Verilog 的各种特性,提高描述的准确性和效率。

三、结构描述1.门级结构描述:通过实例化内置逻辑门或使用自定义模块,构建逻辑电路的结构。

例如,可以使用与门、或门、非门等逻辑门实现组合逻辑电路。

2.模块级结构描述:将具有一定功能的模块进行组合,形成复杂的逻辑电路。

模块可以是自主研发的已有模块,也可以是商业 IP 模块。

四、数据流描述1.逻辑关系:根据信号之间的逻辑关系,使用持续赋值语句进行描述。

例如,对于一个与非门,可以使用`assign #5 neg(a);`语句描述其输出信号与输入信号 a 的逻辑关系。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3-4
3-3
三段式状态机描述(推荐编码) Example: 三段式状态机描述(推荐编码)
module state_machine (clock, reset, rdy, r_w, oe, we); input clock, reset; input rdy, r_w; output oe,we; reg oe,we; reg [3,0] present_state, next_state; parameter idle =4’b0001, decision=4’b0010; read=4’b0100, write=4’1000; // sequential state transition always @ (posedge clock or negedge reset ) if ( ! reset ) present_state <= idle ; else present_state <= next_state ; read: begin if ( rdy) next_state = idle ; else next_state = read; end write: begin if ( rdy) next_state = idle ; else next_state = write ; end default: begin next_state = 4’bx ; end endcase //combinational block always @(reset or present_state or rdy or r_w) end //end always begin begin //Registered output case (present_state) always @ (posedge clock or idle: begin negedge reset ) if ( rdy) if ( ! reset ) next_state = decision ; {oe,we} <= 2’b00 else else next_state = idle ; begin end case(next_state) decision: begin idle: {oe,we} <= 2’b00 ; if ( r_w) decision: {oe,we} <= 2’b00; next_state = read ; read: {oe,we} <= 2’b10; else write: {oe,we} <= 2’b01; next_state = write ; endcase end end endmodule;
两段式状态机描述使用task 推荐编码) task( Example: 两段式状态机描述使用task(推荐编码)
module state_machine (clock, reset, rdy, r_w, oe, we); input clock, reset; input rdy, r_w; output oe,we; reg oe,we; reg [3,0] present_state, next_state; parameter idle =4’b0001, decision=4’b0010; read=4’b0100, write=4’1000; // sequential state transition always @ (posedge clock or negedge reset ) if ( ! reset ) present_state <= idle ; else present_state <= next_state ; read: begin read_output;

if ( rdy) next_state = idle ; else next_state = read; end write: begin write_output; if ( rdy) next_state = idle ; else next_state = write ; end default: begin idle_output; //combinational block next_state = 4’bx ; always @(reset or present_state or rdy or r_w) end begin endcase case(present_state) end //end always begin idle: begin idle_output; //output tasks if ( rdy) task idle_output; next_state = decision ; {oe,we} = 2’b00; else endtask next_state = idle ; task decision_output; end decision: begin {oe,we} = 2’b00; endtask decision_output; task read_output; if ( r_w) {oe,we} = 2’b10; next_state = read ; endtask else next_state = write ; task write_output; end {oe,we} = 2’b01; endtask endmodule;
rdy
rdy
decision: begin {oe,we} = 2’b00; if ( r_w) next_state = read ; else next_state = write ; end read: begin {oe,we} = 2’b10;
module state_machine (clock, reset, rdy, r_w, oe, we); input clock, reset; input rdy, r_w; output oe,we; reg oe,we; reg [3,0] present_state, next_state; parameter idle =4’b0001, decision=4’b0010; read=4’b0100, write=4’1000; // sequential state transition always @ (posedge clock or negedge reset ) if ( !reset ) present_state <= idle ; else present_state <= next_state ;
3.5 状态机描述方法
Example: 一段式状态机 描述方法
module Mealy_state_machine (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: begin stop =2’b10, clear =2’11; if ( A ) begin always @(posedge clock or negedge reset) state <= clear; if (!reset) K2 <= 1; begin end state <= idle; {K2,K1} <= 2’b00; else state <= stop; end end else case (state) clear: begin idle: begin if ( !A) begin if ( A) begin state <= idle ; state <= start ; {K2,K1} <= 2’b01; K1 <= 0; end end else state <= clear ; else end state <= idle ; endcase end endmodule start: begin if ( !A) state <= stop ; else state <= start ; end
3-1
Example: 两段式状态机 描述方法(推荐) 描述方法(推荐)
Outputs State idle decision write read oe 0 0 0 1 we 0 0 1 0
write 01
Reset
idle 00
rdy r_w
rdy
decision 00
rdy r_w
read 10
if ( rdy) next_state = idle ; else next_state = read; end write: begin {oe,we} = 2’b01; if ( rdy) next_state = idle ; //combinational block else always @(reset or present_state or rdy or r_w) next_state = write ; begin end case (present_state) default: begin idle: begin {oe,we} = 2’b00; {oe,we} = 2’b00; next_state = 4’bx ; if ( rdy) end next_state = decision ; endcase else end // end always begin3-2 next_state = idle ; endmodule; end
相关文档
最新文档