大家好我是酸菜鱼,这个系列着重讲解数字ic或FPGA实习面试及秋招面试的高频手撕代码题。
本文具体内容涉及:利用移位寄存器 写序列检测。
一说到序列检测,你脑子里要立马跳出两种解法,一种是状态机写法, 一种是移位寄存器写法,看过一个面经,面试官让手撕一个 五位01序列的序列检测,作者用状态机写的,写完被批评代码太复杂,再写一个简单的方法(也即移位寄存器方法)最后没写出来。虽然第二种方法更简单更好用,但是我们两种方法都得会。
序列检测有什么用?
如果让你实现一个电子锁,输入密码,密码正确就开,密码错误就不开,你会如何写代码?用if-else嵌套嘛,如果第一个数对了,再去判断第二个数?
这种方法在输入密码位数比较少的时候可行,但是如果密码位数很多,if-else 被综合出来就是一个MUX,如果循环嵌套很多,那就是级联MUX,一连串长的逻辑会有很大的delay,所以这种方法是不可取的。
移位寄存器写法
移位寄存器写法的序列检测,会比状态机写法的简单很多,只需要给一组寄存器,用来存储输入数据,再和指定序列比较就行了。比如检测一长一点的序列,序列检测:1100_1101具体代码很简单,代码如下 。
代码:
主要思路就是:每周期读入一个信号din,然后存入data信号的最低位,一个周期存一位,如果连续来的八个信号正好是我们要检测的序列1100_1101,那么data里存的就是这个信号,判断data就和我们要检测的信号相等。
Testbench:
波形图:
detect信号检测到了序列 1100_1101 信号拉高。结果和我们预想的一致,但是代码简洁了许多,在没有要求的情况下,手撕代码就采用这种移位寄存器的方式。
标签:检测,代码,寄存器,序列,IC,写法,移位 From: https://www.cnblogs.com/jerry-caiyu/p/16718440.html