← 2022 · MTK联发科 笔试

推荐答案 测试一下

用Verilog实现一个10010序列检测器,当检测到10010序列(包括重叠的情况时,序列检测器输出1,否则输出0,请画出状态转移框图并写出verilog代码。(15分)

编程题 中等 笔试真题

参考答案

我们分析题目:用Verilog实现一个10010序列检测器,包括重叠情况。需要画出状态转移框图并写出Verilog代码。这是典型的序列检测器设计,状态机通常采用Moore型或Mealy型。题目要求检测到10010序列输出1,否则输出0,包括重叠。重叠意味着序列可以部分重叠,比如1001010010,第二个序列与第一个重叠。状态机设计一般使用状态转移图,定义状态对应已匹配的序列长度。通常设定状态:S0~S4,检测到10010时输出1,然后根据下一个输入,可能跳转到重叠状态。例如:检测到10010,下一个输入是0?还是1?需要重新开始匹配或部分匹配。常见的序列10010,重叠情况:比如"10010"后接"010"?实际上重叠序列:10010的结尾10与下一个序列开头10重叠?我们检查:10010,如果下一个输入是0,则序列变成100100,其中前五位是10010,后五位是00100?不匹配。需要仔细设计状态转移。通常的做法:从S0开始,输入1到S1;输入0到S2? 定义状态代表已匹配的位数。例如:S0: 无匹配; S1: 匹配了1; S2: 匹配了10; S3: 匹配了100; S4: 匹配了1001; S5: 匹配了10010并输出1。然后从S5根据输入转到相应状态:如果下一个输入是0,则序列是100100,考虑重叠,最后一个字符是0,那么从末尾看,可以匹配“0”作为新序列的开始?但序列是10010,以0结尾,如果下一个输入是0,则最后两位是00,不能匹配开头1。但可能部分匹配:比如已匹配10010,下一个输入1,则序列末尾是101,可匹配到“1”作为新序列的开始?实际上更常见的是使用状态机自动处理重叠。一种简单方法:检测到序列后,输出1,然后根据当前输入和之前状态,跳转到最佳匹配状态。比如标准做法:定义状态为已匹配序列长度,用状态转移图。例如状态A0~A4表示已匹配0,1,2,3,4位,但检测到5位时进入状态A5?通常用A0到A4表示,输出在A4时?但要考虑重叠,通常设计状态时,检测到序列后,输出1,然后下一个时钟沿根据输入跳转到适当状态,比如如果输入是1,则开始匹配1;如果输入是0,则可能匹配0?但序列是10010,从第5位之后,如果下一个输入是0,则末尾两位是00,无法匹配任何前缀。所以实际上,当检测到10010后,如果下一个输入是0,则新序列从0开始,只能匹配到0,需要跳到匹配0的状态?但状态机应该从S0开始,输入0后停留在S0?一般不将0视为匹配,因为序列以1开头。所以通常状态机中,输入0且无匹配时,仍留在S0。但对于重叠,需要保证:当检测到10010后,输出1,然后下一个输入如果是1,则新序列可以从1开始匹配,即进入S1(匹配1);如果下一个输入是0,则无法匹配任何前缀,回到S0。但考虑重叠情况是否还有其它可能?比如序列10010和下一个序列10010可能重叠部分:10010 010? 实际上,10010后接010,但第二个序列是10010,所以从第3位开始重叠?10010结尾是“010”?10010的最后三位是010?10010从右往左:0,1,0,0,1? 不对,10010:位1:1,2:0,3:0,4:1,5:0。所以最后三位是010?实际最后三位是第3~5位:0,1,0 -> 010。如果下一个序列的开头是1,0,0,1,0,那么从第4位开始重叠?第4位是1,第5位是0,下一个序列第1位是1,第2位是0,所以重叠可以是"10"? 实际上,检查:已匹配10010,下一个输入如果又是1,则序列变成100101,新序列从第5位开始?更标准的方法是使用状态转移图,通常教材中有。我们可设计状态:IDLE, S1, S10, S100, S1001, S10010。其中S10010输出1。从每个状态根据输入0/1跳转。例如IDLE: 输入1->S1, 输入0->IDLE。S1: 输入0->S10, 输入1->S1(因为连续两个1,只能匹配第一个1)。S10: 输入0->S100, 输入1->? 序列10后输入1,得到101,无法匹配前缀?但可以匹配到S1(因为1),所以跳转到S1。S100: 输入1->S1001, 输入0->? 100后输入0得1000,末尾三位000?无法匹配前缀,但可能匹配到0?但序列以1开头,所以回到IDLE?但注意,如果输入0,即1000,末尾三位000,无法匹配任何前缀,只有最后一个0可以视为新序列的0,但0本身不是序列开头,所以回到IDLE。S1001: 输入0->S10010(并输出1), 输入1->? 1001后输入1得10011,末尾110?是否可以匹配到S1?最后一位1可以匹配S1,但前一位也是1,但序列是1001? 其实末尾两位11,不能匹配10。但最后一个1可以匹配S1,所以跳转到S1。S10010: 输入1->? 10010后输入1得100101,末尾101,可以匹配到S1?因为最后一个1,跳转到S1。输入0->? 10010后输入0得100100,末尾100?最后三位是100,可以匹配S100?因为100是前缀,从最后一位开始?实际上末尾四位是0100?我们分析:10010后加0得到100100,最后一位0,倒数第二位0,倒数第三位1,倒数第四位0,所以最后三位是100?最后三位:倒数第三位1,倒数第二位0,最后

涉及知识点

  • Verilog
  • verilog
  • 状态机
  • 时钟
← 上一题
登录后反馈错题