前言
本次博客主要基于HDLBits中关于两種不同难度的 序列识别电路 的实现的复盘,第一种序列识别器较为简单,通过理解其逻辑功能后就能够轻松实现;第二种识别检测器基于双状态机,即状态转移中需要考虑不只一種输入的影响,对于第二类题目,笔者提供了两種解决方案以供参考。
一:简单的序列检测器
题目:先上题目传送门(HDLBits中的一道练习题)☞序列识别器【By HDLBits】。本题要求对输入序列进行识别:当输入为0111110即只有五个1时,舍弃位(discard)要求被置高;当输入01111110即正正又六个1时,标志位(flag)被置高;当输入有七个或七个以上的1时,错误标志位(error)被置高。
1.设计思路
设计时,加上错误标志位的置位,一共有10个状态,因此可根据题目的逻辑要求画出状态转移图(如下):
要注意,当序列状态达到五个1且下一个输入为0时,此时舍弃位置一,即s8状态时disc = states8;当达到6个1且下一输入为零即状态s9时,标志位置高flag = states9;序列中出现7哥或以上的1即维持在s7时,错误标志位被置高,error = state==s7;
2.代码
根据上述整理出的设计思路编写代码:
module fsm_sequence_reg(clk,reset,in,disc,flag,err)
input clk;
input reset; // Synchronous reset
input in;
output disc;
output flag;
output err;
parameter s0=0,s1=1,s2=2,s3=3,s4=4,s5=5,s6=6,s7=7,s8=8,s9=9;
reg [3:0]state,next_state;
always @(posedge clk) begin
if(reset)
state <= s0;
else
state <= next_state;
end
always @(*) begin
case(state)
s0:next_state = in?s1:s0;
s1:next_state = in?s2:s0;
s2:next_state = in?