推荐答案
测试一下
题目
画出可以检测11101串的状态转移图,并用Verilog实现FSM;要求每检测到一次该序列,输出2个周期的高电平信号;要求使用低功耗的状态机编码方式;
参考答案与知识点
参考答案
我们分析题目:检测序列11101,检测到后输出2个周期的高电平。要求低功耗状态机编码,即使用格雷码或one-hot?通常低功耗编码使用格雷码(减少翻转),但one-hot在FPGA中常用且功耗较低?实际上低功耗状态机编码常采用格雷码(Gray code)或二进制编码中减少毛刺。但题目明确说“低功耗的状态机编码方式”,一般指使用格雷码(相邻状态只变化1bit)或one-hot(每个状态只有一个1,但状态数多时翻转少?)。这里序列长度5,状态数至少5个(加上输出状态?)。需要设计状态转移图,然后Verilog实现。注意输出要求:每检测到一次序列,输出2个周期的高电平。也就是说,检测到序列的最后一位(1)后,下一个时钟周期开始输出高,持续2个周期。可以用Moore型或Mealy型?通常序列检测用Mealy输出在检测到时输出,但这里要求输出2个周期,所以用Moore型更合理,增加两个输出状态。或者用Mealy加计数器。但为了简单,用Moore型:状态包括:IDLE, S1, S11, S111, S1110, DETECT1, DETECT2。或者直接用移位寄存器?但题目要求FSM。
解析:状态机设计:状态编码采用格雷码,如000,001,011,010,110,111,101等,但需要7个状态?实际序列11101共5位,加上两个输出状态共7个。但注意检测到11101后,下一次检测可能重叠,如11101后面接着1,可以检测到11101?重叠部分:11101的后缀0101?实际上重叠需要处理:例如输入111011...,检测到第一个11101后,后面的输入如果是1,可能组成新的序列?从最后一个1开始?序列11101结尾是1,如果下一个是1,则前一个1可以成为新序列的第一个1,所以从S1开始?需要仔细设计。常见做法:利用状态机实现序列检测,考虑重叠情况。11101的重叠:例如输入1110111...,检测到第一个11101后,下一个输入是1,此时状态应该回到S1(因为最后一个1是序列的第一个1)?还是从IDLE?实际上,11101的最后一位是1,如果下一个输入是1,那么它可以是新序列的第一个1,但同时前一个1(原序列的最后一个1)也是新序列的第二个1?需要分析:原始序列11101,假设已检测到1110,输入1则完成序列。完成后,当前状态?如果采用Moore型,在检测到序列时进入输出状态,输出两周期。两周期后,下一个输入是什么?需要从当前输入开始重新检测。通常做法是:在检测到序列的最后一个1时,进入一个输出状态(比如DET1),输出高,下一个时钟沿进入DET2,输出高,下一个时钟沿回到IDLE并开始检测新输入。但为了重叠检测,需要在输出状态期间也要处理输入?或者输出状态只负责输出,不处理输入。可以在DET2状态时根据输入跳转到相应状态。更严谨的设计:状态机有7个状态:IDLE, S1, S11, S111, S1110, DET1, DET2。其中S1110表示已匹配前4位“1110”,等待最后一位1。当输入为1时,从S1110进入DET1(输出高),同时注意重叠:如果输入是1,那么从S1110来的1也可以看作是序列的第一个1?实际上序列11101,匹配完成后,最后一个1是序列的第5位,同时它也可以作为新序列的第1位。因此,在DET1状态时,输入是什么?DET1状态是检测到序列后的第一个输出周期,此时输入已经过去了?通常状态机的输出是组合逻辑或寄存器输出,输入在时钟沿采样。设计时,当在S1110状态且输入为1时,下一个状态进入DET1,同时输出高。在DET1状态时,时钟沿到来,输入是新的,此时需要根据新输入决定下一个状态。为了重叠,从DET1状态,如果输入是1,那么应该进入S1(因为上一个1可以当作新序列的第一个1)?还是进入S11?因为DET1之前的状态是S1110并刚接收到1,这个1既是序列的最后一个,也是新序列的第一个。但DET1状态时,输入是新的,所以重叠处理:实际上从S1110到DET1时,输入已经被用了,下一个输入是新的。如果在DET1状态下输入是1,则我们需要考虑之前的1(即序列的最后一个1)加上新输入的1,组成“11”,所以应该进入S11状态?但之前的1在DET1中已经被看作输出的一部分,但状态机中应该保存之前的信息。或者我们可以在S1110收到1时,不仅进入DET1,还要记录该1,以便重叠。常用方法是:在S1110状态下,输入1,下一状态可以是S1(如果考虑重叠从该1开始)?但这样会丢失前一个1作为新序列第一个?实际上序列11101,匹配完成后,最后一个1是第5位,如果下一个输入是1,那么新序列的前两位是“11”(前一个1和这个1)。所以状态应该变为S11。因此,从S1110收到1后,下一状态应为DET1,同时,由于该输入1也是新序列的一部分,我们可以在DET1状态时根据输入处理?但DET1状态时,输入是下一个时钟的输入。更好的做法是:在S1110状态时,输入为1,则下一个状态进入一个状态同时表示输出和部分匹配。例如,可以设计一个组合:在S1110且输入1时,下一状态直接设为S11(或S1?)并输出高?但输出需要持续2周期,所以不能直接回S11。可以设计两个输出状态:OUT1和OUT2,且在OUT1和OUT2期间也要根据输入进行状态转移以处理重叠。例如,从S1110到OUT1时,如果输入是1(下一个时钟的输入),则OUT1的下一状态为OUT2还是S11?需要精心设计。
为了简化,题目没有强调重叠检测,通常默认需要支持重叠。但许多教材中序列检测的经典例题是支持重叠的。这里我们按支持重叠设计。一种常见方法是:使用移位
涉及知识点
- Verilog
- 低功耗
- 状态机
- FPGA
- 功耗