Verilog 状态机写法

状态机是时序电路的万能钥匙,所有时序电路都能通过状态机实现。以前写程序时喜欢用一段式状态机,现在流行用三段式。好象三段时也没多大优点。

在CPLD中寄存器较少,个人感觉用一段式也可以,主要是省资源。

时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息。

状态机采用VerilogHDL语言编码,建议分为三个always段完成。

三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器, 然后直接在每个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件。

三段式描述方法虽然代码结构复杂了一些,但是换来的优势是使FSM做到了同步寄存器输出,消除了组合逻辑输出的不稳定与毛刺的隐患,而且更利于时序路径分组,一般来说在FPGA/CPLD等可编程逻辑器件上的综合与布局布线效果更佳。

示列如下:

//第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器

always @ (posedge clk or negedge rst_n)  //异步复位

if(!rst_n)

current_state <= IDLE;

else

current_state <= next_state;//注意,使用的是非阻塞赋值

//第二个进程,组合逻辑always模块,描述状态转移条件判断

always @ (current_state)   //电平触发

begin

next_state = x;  //要初始化,使得系统复位后能进入正确的状态

case(current_state)

S1: if(...)

next_state = S2;  //阻塞赋值

...

endcase

end

//第三个进程,同步时序always模块,格式化描述次态寄存器输出

always @ (posedge clk or negedge rst_n)

...//初始化

case(next_state)

S1:

out1 <= 1‘b1;  //注意是非阻塞逻辑

S2:

out2 <= 1‘b1;

default:...   //default的作用是免除综合工具综合出锁存器。

endcase

end

时间: 2024-10-14 09:07:58

Verilog 状态机写法的相关文章

三种不同状态机写法

一段式状态机: 1 reg[3:0] cs, ns; 2 always @(posedge clk or negedge rst_n) begin 3 if (!rst_n) begin 4 cs <= IDLE; 5 cmd <= 3'b111; 6 end 7 else begin 8 case (cs) 9 IDLE : if (wr_req) begin cs <= WR_S1; cmd <= 3'b011; end 10 else if (rd_req) begin cs

verilog状态机

如下是官网quartus的帮助文档中的说明. A state machine is a sequential circuit that advances through a number of states. By default, the Quartus II software automatically infers state machines in your Verilog HDL code by finding variables whose functionality can be

Verilog状态机使用技巧

“没有什么难处是通过增加一个状态机不能够解决的,如果不行,那就俩..” 在实现某种功能时,若感觉该功能的各种可能状态间的切换太绕了,此时,增加几个状态机往往能使思路变得清晰,功能的实现也就简单明了了. 造成此种现象的原因是由于原本要实现的功能包含了各个相互联系的小功能,这些功能又是具有相关性的,若要在一个状态机中实现代码就会写的很别扭. 若是将各个小的功能独立成互不影响的状态机,并通过一个总的状态机来实现这些小功能间的连接,代码就会变得简洁清晰,主要还是帮助写作者理清思路,而不必搞些弯弯绕的东西

verilog 状态机键盘扫描

module key (clk,rst,key_up,led);input clk,rst,key_up;output reg [3:0] led;parameter T10ms=31'd2_000_00;reg clk_state;reg [31:0] cnt;parameter state_init=2'b00,state_click=2'b01,state_check=2'b10;reg [1:0] current_state,next_state;reg [3:0] num_click,

C语言状态机模板

转载声明:如果转载本博客内容,请联系[email protected],获得作者书面授权. 前言 上一篇我的博客中探讨了一种非swtich-case结构的状态机写法,但是个人感觉写起来比较麻烦,如果增加一个状态,需要手动地在函数指针数组中添加相应的功能函数,而且状态函数的也必须写在函数指针数组前面导致代码结构较差,如果写在后面,又要在前面声明,就更麻烦了,总之,不易维护,想到Adam Dunkels在LwIP中逆天的宏定义用法,使得代码有自动更新的功能,于是也尝试着套用下其写法,现在这段代码更易

小刘(第二版)

第三章 3.1 uva1585 uvalive3354 题意:错题0分,对题得分为目前位置连续正确数.求总分. 思路:模拟 代码: #include <cstdio> #include <cstring> char str[10000]; int main() { int t; scanf("%d", &t); while (t--) { scanf("%s", str); int res = 0; int now = 0; for

调度器,极小资源单片机值得一用(转)

源:再出个调度器,极小资源单片机值得一用 自认为有如下特点: 1)  超级可以移植性,与CPU无关,几乎任何支持C语言编程的CPU都可以用!(本文仅仅以51单片机为例而已,但实际上可以任意移植)2)  小之又小, 原理很简单,一看就懂.3)  省之又省, 可以说对RAM和ROM省到极致.4)  取protothread之精华,将定时器与状态机和伪线程语法融合到一个框架,任务函数可以有两种写法.5)  基于定时器触发,调度效率高,最大化减少无效的代码运行时间. ******************

ECMAScript6 入门 Generator

---------------------------------------------------------------------------------------------------------------------------- 基本概念 Generator 函数是一个状态机,封装了多个内部状态,执行 Generator 函数会返回一个遍历器对象 Generator 函数除了状态机,还是一个遍历器对象生成函数, 返回的遍历器对象,可以依次遍历 Generator 函数内部的每

上升沿检测器的两种状态机实现及直接实现Verilog

p { margin-bottom: 0.1in; direction: ltr; line-height: 120%; text-align: justify } 上升沿检测即是在输入信号由0变1时,输出一个时钟周期的指示信号.整理该题目的主要目的是为了加深对边沿检测印象及更好的理解两种状态机(Moore机及Mealy机)的实现机制的理解. 书中源代码及测试代码见尾部 基于Moore机的设计 基于Moore机的上升沿检测状态机如下图所示,在0状态和1状态之间还有一个边沿状态,在状态0下,输入信