有限状态机的设计
-
作用—描述一个规律的状态变化与对应输出
-
状态机类型
- mearly型:输出由当前状态和输入共同决定
- moore型:输出只与当前状态有关
-
设计步骤
- 根据设计需要,确定各状态与状态转移关系—状态转换图的设计
- 采取合理的格式进行代码编写
-
设计中常见的三种格式
-
设计中的一些关键点
- 状态机的设计必然涉及到state和nstate
- 避免锁存器的出现,因此,可以在状态转换器的always中的最开始加入nstate=state,这样相当于在每个if后配备了else,保证不会出现锁存器。
- 设计的核心就是必须要保证存在状态转换和对应输出的更新
-
实例设计一个1011序列检测器
-
状态机缺点
- 只能在固定的状态做固定的事情,这或许对流水线设计并不友好
- 同时考虑如果是一个很长序列需要检测状态机的设计显然会复杂化—移位寄存器加最后判断其实也是一种方案
function和task
- function组成—类似于函数—多个输入但只能有一个输出
- function是定义在一个module内部,可以直接在后续被调用
- 通常是描述一个组合逻辑,不存在时序问题,不可插入时延等
- 基本结构
function[2:0] test_code;// 定义函数名称及返回位宽 input [8:0] din;// 定义输入名称及位宽 begin /********* 主体功能 *********/ end endfunction // 调用格式 dout <= test_code(in);
- task—可以有多个input和多个output
- 可以加入延迟时间,可以直接访问module中的reg信号,可以作为敏感触发信号等
- 可以解决重复做一件事情且需要时间等待
- 基本结构
task test_code; input [31:0] din1; input [31:0] din2; output [31:0] dout1; output [31:0] dout2; begin @(posedge clk);#1; penable = 1; /*************** 其他功能 ***************/ end endtask // 调用格式 test_code(din1, din2);
- 总结:
- 尽量使用function
- function一般可综合,但是task中如果有时延则不可综合
- verilog语言提供一些系统function
- $time等等