數(shù)字IC手撕代碼-序列檢測(移位寄存器寫法)
大家好我是酸菜魚,這個(gè)系列著重講解數(shù)字ic或FPGA實(shí)習(xí)面試及秋招面試的高頻手撕代碼題
往期題目:
數(shù)字IC手撕代碼-分頻器(任意偶數(shù)分頻,任意奇數(shù)分頻,任意小數(shù)分頻)----分頻大師 - 嗶哩嗶哩 (bilibili.com)
數(shù)字IC手撕代碼-序列檢測(狀態(tài)機(jī)寫法) - 嗶哩嗶哩 (bilibili.com)
本文具體內(nèi)容涉及:利用移位寄存器 寫序列檢測。
????????一說到序列檢測,你腦子里要立馬跳出兩種解法,一種是狀態(tài)機(jī)寫法, 一種是移位寄存器寫法,看過一個(gè)面經(jīng),面試官讓手撕一個(gè)?五位01序列的序列檢測,作者用狀態(tài)機(jī)寫的,寫完被批評代碼太復(fù)雜,再寫一個(gè)簡單的方法(也即移位寄存器方法)最后沒寫出來。雖然第二種方法更簡單更好用,但是我們兩種方法都得會。
序列檢測有什么用?
????????如果讓你實(shí)現(xiàn)一個(gè)電子鎖,輸入密碼,密碼正確就開,密碼錯(cuò)誤就不開,你會如何寫代碼?用if-else嵌套嘛,如果第一個(gè)數(shù)對了,再去判斷第二個(gè)數(shù)?

????????這種方法在輸入密碼位數(shù)比較少的時(shí)候可行,但是如果密碼位數(shù)很多,if-else 被綜合出來就是一個(gè)MUX,如果循環(huán)嵌套很多,那就是級聯(lián)MUX,一連串長的邏輯會有很大的delay,所以這種方法是不可取的。
移位寄存器寫法
????????移位寄存器寫法的序列檢測,會比狀態(tài)機(jī)寫法的簡單很多,只需要給一組寄存器,用來存儲輸入數(shù)據(jù),再和指定序列比較就行了。比如檢測一長一點(diǎn)的序列,序列檢測:1100_1101
????????具體代碼很簡單,代碼如下
代碼:

????????主要思路就是:每周期讀入一個(gè)信號din,然后存入data信號的最低位,一個(gè)周期存一位,如果連續(xù)來的八個(gè)信號正好是我們要檢測的序列1100_1101,那么data里存的就是這個(gè)信號,判斷data就和我們要檢測的信號相等。
Testbench:

波形圖:

detect信號檢測到了序列 1100_1101 信號拉高。結(jié)果和我們預(yù)想的一致,但是代碼簡潔了許多,在沒有要求的情況下,手撕代碼就采用這種移位寄存器的方式。