网站做专题,建设工程公司采购的网站,温州小程序开发哪家好,朋友让你做网站如何拒绝序列检测 用一个atemp存储之前的所有状态#xff0c;即之前出现的七位 含无关项检测
要检测011XXX110
对于暂时变量的高位#xff0c;位数越高就是越早出现的数字#xff0c;因为新的数字存储在TEMP的最低位 不重叠序列检测
#xff0c;一组一组
011100
timescale 1ns…序列检测 用一个atemp存储之前的所有状态即之前出现的七位 含无关项检测
要检测011XXX110
对于暂时变量的高位位数越高就是越早出现的数字因为新的数字存储在TEMP的最低位 不重叠序列检测
一组一组
011100
timescale 1ns/1ns
module sequence_detect(input clk,input rst_n,input data,output reg match,output reg not_match);parameter ZERO0, ONE1, TWO2, THREE3, FOUR4, FIVE5, SIX6, FAIL7;reg [2:0] state, nstate;reg [2:0] cnt;always(posedge clk or negedge rst_n) beginif(~rst_n)cnt 0;elsecnt cnt6? 1: cnt1; endalways(posedge clk or negedge rst_n) beginif(~rst_n)state ZERO;elsestate nstate;endalways(*) beginif(~rst_n)nstate ZERO;elsecase(state)ZERO : nstate data? FAIL : ONE;ONE : nstate data? TWO : FAIL;TWO : nstate data? THREE: FAIL;THREE: nstate data? FOUR : FAIL;FOUR : nstate data? FAIL : FIVE;FIVE : nstate data? FAIL : SIX;SIX : nstate data? FAIL : ONE;FAIL : nstate cnt6? ZERO: FAIL;default: nstate ZERO;endcaseendalways(*) beginif(~rst_n) beginmatch 0;not_match 0;endelse beginmatch cnt6stateSIX;not_match cnt6stateFAIL;endendendmodule状态机代码
状态机简写为FSM
非阻塞赋值可以理解为次态就是当前时间步结束后在下一个时间步将右侧表达式的值应用到被赋值的信号上从而实现状态的更新
module StateMachine(input wire clk,input wire reset,output wire [1:0] state
);reg [1:0] current_state, next_state;always (posedge clk or posedge reset) beginif (reset)current_state 2b00;elsecurrent_state next_state;
endalways (current_state) begincase(current_state)2b00: next_state 2b01; // State transition from 00 to 012b01: next_state 2b10; // State transition from 01 to 102b10: next_state 2b00; // State transition from 10 to 00default: next_state 2b00;endcase
endassign state current_state;endmodule
两种状态机
Mealy状态机的输出信号取决于现态与输入
Moore状态机仅取决于当前状态即现态
Moore
module moore(input wire clk,input wire a,output wire b,output wire[1:0]state
);
reg[1:0]current_state;
wire b_out;parameter s02b00;
parameter s12b01;
parameter s22b10;xzz
always(posedge clk)begincase(current_state)s0beginif(a)begincurrent_states1;b_out1b0;endends1:beginif(!a)begincurrent_states2;b_out1b1;endends2:beginif(a)begincss0;b1b1;endendendcase
end
assign bb_out;
assign statecs;
end
在摩尔状态机中每个状态都有一个特定的输出值该输出值在进入该状态时被分配并保持不变直到状态发生转移
reg [:] current_state ;
reg [:] next_state ;wire [:0] IDLE ;
wire [:0] S0 ;
wire [:0] S1 ;
wire [:0] S2 ;//\
//**************************** State Machine *******************************
//\always (posedge sclk or negedge s_rst_n) beginif(!s_rst_n)current_state IDLE;elsecurrent_state next_state;
endalways (*) beginnext_state IDLE;case(current_state)IDLE:beginif(idle2s0 1b1)next_state S0;elsenext_state current_state;endS0:beginif(s02s1 1b1)next_state S1;elsenext_state current_state;endS1:beginif(s12s2 1b1)next_state S2;elsenext_state current_state;endS2:beginif(s22idle 1b1)next_state IDLE;elsenext_state current_state;enddefault:beginnext_state IDLE;endendcase
endassign idle2s0 current_state IDLE
assign s02s1 current_state S0
assign s12s2 current_state S1
assign s22idle current_state S2 always (posedge sclk or negedge s_rst_n) beginif(!s_rst_n) beginendelse begincase(next_state)end
end
always(*)会在输入信号变化时自动执行
在每个状态内部检查特定的输入信号条件如果满足就将次态设置为特定值不然就将次态保留为现态
在状态转移的逻辑中使用阻塞因为阻塞赋值会按照代码的顺序逐行执行并立即更新被赋值的变量在状态转移逻辑中使用阻塞赋值可以确保在同一个时间步内只有一个状态转移会被执行
非阻塞赋值允许在同一个时间步内同时更新多个变量的值将右侧表达式的值保存在一个暂存器内然后在时间步的末尾将暂存器的值赋给左侧可以确保所有变量在同一个时间步内同时更新保持状态的一致性。在状态转移逻辑中使用阻塞赋值可以按顺序进行状态检查和状态转移而在时钟驱动的逻辑中使用非阻塞赋值可以模拟时序行为确保状态的同步更新。
在摩尔状态机中在每个时钟上升沿状态机会根据当前状态和输入信号计算出下一个状态并在下一个上升沿时更新输出因此需要等待时钟的到来才能进行状态转移和生成输出
摩尔状态机的当前输出总是在一个周期后米利状态机中输入更改会在逻辑完成后立即导致输出更改
摩尔状态机
以一个序列检测器为例检测到输入信号11时输出z为1其他时候为0。用摩尔型FSM实现需要用到三个状态ABC。而用米利型FSM实现则需要两个状态AB。摩尔型FSM输出函数的输入只由状态变量决定要想输出z1必须C状态形成即寄存器中的两个1都打进去后才可以。输出z1会在下一个有效沿到来的时候被赋值。而米利型FSM输出函数是由输入和状态变量共同决定的。状态在B的时候如果输入为1则直接以组合电路输出z1不需要等到下个有效沿到来。从而也就不需要第三个状态C。
是输出函数仅取决于当前状态而不是状态转移仅取决于当前状态
就是说米利与摩尔状态机的状态转换肯定都取决于现态与输入只不过米利状态机的输出是要取决于输入与现态然后摩尔的输出直取决于现态。
也就是说有多少种输出信号摩尔状态机就需要额外增加多少种状态在这个状态下才会输出相应的信号
而对于米利状态机只需要提供输出这个信号时的现态即可从这个现态延申出输出信号
就比如说两道题每道ABCD选项
用摩尔状态机的话就需要1初始状态2*2种状态
2*2就是选对与没选对的状态即第一道题选对了第二道题对了的状态输出一个分数
第一道题选对了第二道题错了的状态输出一个分数
第一道题选错了第二道题对了的状态输出一个分数
第一道题选错了第二道题错了的状态输出一个分数
摩尔状态机就是一个树形的结构需要有节点记录决策后的结果
而米利状态机只需要记录决策的节点即可
即米利状态机需要12种状态即两道题决策的状态输出函数就取决在在这个决策状态现态与决策输入信号
那么在上例种可以认为第一位与第二位就是要决策的状态所以米利状态机至少需要两个状态而摩尔状态机至少要三个需要有额外的节点状态来负责输出。即想要输出1必须要进入状态C
检测11只有第一位是1时摩尔与米利状态机进入A状态在此基础上只有第二位是1时进入B状态此时米利状态机就不需要新状态了摩尔状态机还需要一个新状态来记录最终的输出
就是说米利状态机的每个状态是每个状态节点还未进行决策时的情况而摩尔状态机是已经做出决策的状况。就是第一位A状态对米里而言是要做第一位的决策还不知道做的结果是什么取决于输入。而摩尔的第一位B状态是已经做出了决策且决策是1那么就进入B状态
初始状态摩尔是A,米利是A摩尔的A是真初始状态表示还没有任何结果初始化的一个状态米利可以理解为要做第一个决策但还不知道结果是什么的一个状态也可以认为是初始状态
那么对摩尔状态转移就是只有为1时才会进入下一个状态C就是都为1的状态。在状态转移过程种不输出在状态节点上进行输出可以认为摩尔状态机的状态是记录结果的状态。
对米利状态转移就是做出不同的选择会进入不同的状态只有为1才会进入下一个状态下一次决策前的状态其输出在转移的过程中进行输出也就是给到输入后就意味着此时的决策已经知道就进入下个状态是记录决策节点的状态其输出在由最后的节点延申出的线条当中
摩尔与米利检测1101
所以按照上面的思路摩尔与米利状态机检测1101分别需要5和4种状态
摩尔的话就是纯初始状态以及4个匹配成功的状态只要不断的匹配成功才会进入下个状态记录的是结果即S0代表初始S1,S2,S3,S4分别代表每位都匹配成功的结果S1记录第一位正确第二位待定。S2记录第一位第二位正确第三位待定…… 代码 米利与摩尔状态机都要有这样的代码块即并不是这个原因导致摩尔
米利的话就是4个位要确定的状态也是只有确定匹配才会进入下个状态。记录的是要进行选择时的状态即S0,S1,S2,S3分别代表每位未确定前的状态即IDLE,S0就是第一位待定……第一位确定第二位待定…… 所以按照上面的思路摩尔状态机要慢一个周期因为确定结果进行非阻塞赋值要在当下这个周期结束后才进行而米利状态机知道当下状态知道输入信号就可以在当下周期用ASSIGN输出信号 按键消抖
软件按键消抖模块软件算法通常通过软件延时和状态机来实现按键消抖。当检测到按键状态变化时软件会进行一定的延时以等待按键抖动稳定。在延时结束后再次检测按键状态只有当连续多次检测到相同的按键状态时才确认按键的有效触发。 就是说在连续的三个时间周期内检测到的按键值都一样那就可以认为按键已经稳定下来了也就可以进行采用了 这个就是用来检测三个按键是否相同寄存器分别寄存上一个状态