- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2、状态编码
最常用的有三种编码方式: state0, state1, state2, state3 二进制 00, 01, 10, 11 格雷码 Gray 00, 01, 11, 10 独热编码One-hot 0001,0010, 0100,1000 CPLD使用Gray状态码,FPGA使用one-hot 编码
datain=0/out=0
case语句
datain=1/out=1
If(!datain) next_state=1’b0; else next_state=1’b1; end 1’b1 : begin out=datain; If(!datain) next_state=1’b0; else next_state=1’b1; end default: {next_state, out}=2’b00; endcase endmodule 必须规定状态变量,用来定义状态机的状态。 必须有初态处理和默认状态处理 要改变当前的状态,必须改变状态变量的值,状态变量的值的改变要与 时钟沿同步。
下一个状态 默认状态
改写为摩尔状态机
datain=0 rst=1 0 out=0 datain=0
datain=1 1 out=0
datain=0
datain=1 2 out=1 datain=1
改写为摩尔状态机
module exp(out, datain, clk, rst); input clk, rst, datain; output out; reg out; reg[1:0] state,next_state; always@(posedge clk or posedge rst) begin if(rst) state<=2’b0; else state<=next_state; end always@(state or datain) begin case(state) 2’b00: begin out=1’b0; if(!datain) next_state=2’b00; else next_state=2’b01; end 2’b01 : begin out=1’b0; if(datain) next_state=2’b10; else next_state=2’b00; end 2’b10 : begin out=1’b1; if(!datain) next_state=2’b00; else next_state=2’b10; end default: {next_state,out}=3’b000; endcase end endmodule
01101
识别11序列
out
datain=0/out=0
module exp(out, datain, clk, rst); input clk, rst, datain; rst=1 output out; reg out; 0 reg state,next_state; 状态变量 always @(posedge clk or posedge rst) begin datain=1/out=0 if(rst) state<=1’b0; else state<=next_state; end 1 always @(state or datain) begin case(state) 1’b0: begin out=1’b0;
有限状态机设计
将对象(电路)的工作过程表达为:
各种不同状态 在 事件控制下 的变迁过程
这种描述方法称为有限状态机(FSM)
有限状态机:实例
有限状态机:要素
FSM包含 1. 一组状态集(states)、 2. 一个起始状态(start state)、 3. 一组输入符号集(input alphabet)、 4. 一组输出符号集(output alphabet ) 5. 一组映射输入符号和当前状态到下一状 态的转换函数(transition function)
对比
datain=0 rst=1 0 out=0 datain=0
datain=1 1 out=0
datain=0
datain=1 2 out=1 datain=1
状态机设计应注意的问题 1、起始状态的选择
起始状态是指电路复位后所处的状态,选择一个合理的起始 状态将使整个系统简洁高效。有的EDA软件会自动为基于 状态机的设计选择一个最佳的起始状态。
2.
有限状态机模型
输出在输入后立即变化,不依赖时钟信号的同步 INPUT NEXT STATE LOGIC Mealy 型输出
STATE MEMORY
OUTPUT OUTPUT LOGIC
Clock
Moore型 输出
必须等待时钟信号的到来,当状态变化时才导致输出变化
FSM的应用举例
clk rst
米里型状态机状态转移图
FSM的结构
Current State Register Next State Logic: NS = f( PS, I ) Output Logic
Moore状态机 & Mealy状态机
1.
摩尔型(Moore) 输出仅是 当前状态 的函数 米里型(Mealy) 输出信号是 当前状态 和 当前输入信号 的函数
4、状态转换的描述
一般使用case语句来描述状态之间的转换 ,用case语句表述比用if-else语句更清 晰明了。 case语句最后要加上default避免锁存器 的产生
作业
实验四
3、状态编码的定义
直接使用整数编码描述 利用‘define定义 利用parameter声明
reg [1:0] case case(state) case(state) 0: …… 1: …… …… endcase …… 不要漏掉符号“'” `define S0 2’b00; 2’ `define S1 2’b01; 2’ case(state) case(state) `S0: ….; `S1: ….; module MealyFSM(clk,reset,a,y); MealyFSM( clk,reset,a,y); reg[1:0] state; Parameter S0=2’d0,S1=2’d1,S2=2’d2,S3=2’d3; S0=2’ d0,S1=2’ d1,S2=2’ d2,S3=2’ …… always@(state or a) case(state) case(state) 倾向采用, S0: …… 可读性好, S1: …… 方便! S2: …… …… endcase ……. ……. endmodule