數(shù)字IC手撕代碼-泰凌微筆試真題

以上是泰凌微公司的筆試真題,手撕一個(gè)代碼,題目描述如下:
????????假設(shè)每個(gè)clock cycle輸入是一個(gè)3-bit數(shù)據(jù)信號(hào),現(xiàn)在需要按次序整形成5-bit數(shù)據(jù)信號(hào)輸出,并給出valid信號(hào)。其中LSB First,請(qǐng)用Verilog/VHDL給出代碼。
sample data:
輸入:000,110,011,011,010,010,011...? ?即:(000|11 0|011 |0 11|010|010|01 1)
輸出:00011,00110,11010,01001,1...? ? ?即:(000 11|0 011? 0|11010| 010 01|1)
????????該題目,仔細(xì)閱讀就會(huì)發(fā)現(xiàn),序列都是同一條序列,分割方式不同;說(shuō)白了其實(shí)就是一個(gè)位寬轉(zhuǎn)換題,然后加握手信號(hào)。實(shí)現(xiàn)一個(gè)含握手的3-5bit的位寬轉(zhuǎn)換模塊。這個(gè)題目,華子也考過(guò)類(lèi)似的,或者說(shuō)很多公司愛(ài)考這玩意。

下面解釋下,題目中出現(xiàn)的概念
1、LSB(Least Significant Bit)--最低有效位
? ? LSB代表二進(jìn)制中最小的單位,可以用來(lái)指示數(shù)字很小的變化。也就是說(shuō),LSB是一個(gè)二進(jìn)制數(shù)字中的第0位(即最低位),具有權(quán)值為2^0,可以用來(lái)檢測(cè)數(shù)的奇偶性。
2、MSB(Most Significant Bit)--最高有效位
? ? MSB代表一個(gè)n位二進(jìn)制數(shù)字中的n-1位,具有最高的權(quán)值2^(n-1).對(duì)于有符號(hào)的二進(jìn)制數(shù),負(fù)數(shù)采用反碼或補(bǔ)碼形式,此時(shí)MSB用來(lái)表示符號(hào),msb為1表示負(fù)數(shù),0表示正數(shù)。

????????好的,解釋完概念,題目的意思就非常明白了,實(shí)現(xiàn)一個(gè)含有握手信號(hào)的3-5 bit位寬轉(zhuǎn)換器,輸入為3bit,輸出5bit,且輸入的3bit從低位開(kāi)始排,即輸入000,110時(shí),第一個(gè)5bit輸出的是000 11,而不是10 000,也就是題目說(shuō)的LSB First。
思路分析
? ? ? ? ① 輸入第一個(gè)3bit,無(wú)法輸出;
????????② 輸入第二個(gè)3bit,此時(shí)存數(shù)6bit,可以輸出一次5bit,余下1bit;valid=1;
? ? ? ? ③ 輸入第三個(gè)3bit,此時(shí)由于輸出過(guò)一次5bit,余下1bit,加上這第三次輸入的3bit,此時(shí)存數(shù)4bit,無(wú)法輸出;
????????④ 輸入第四個(gè)3bit,此時(shí)存數(shù)7bit,可以輸出一次5bit,余下2bit;valid=1;
????????⑤ 輸入第五個(gè)3bit,此時(shí)存數(shù)5bit,可以輸出一次5bit,存數(shù)為0bit,狀態(tài)循環(huán)可回到初始狀態(tài)。valid=1;
????????顯然每五次輸入是一個(gè)輪回,這是因?yàn)?5bit是3bit和5bit 的最小公倍數(shù),因此每輸入15/3=5次,就輸出15/5=3次。如此反復(fù)循環(huán)。
????????根據(jù)分析我們看到,輸出有效的時(shí)間點(diǎn)是第二次輸入后、第四次輸入后、第五次輸入后,因此我們可以用一個(gè)計(jì)數(shù)器counter來(lái)作為valid信號(hào)的判據(jù),當(dāng)計(jì)數(shù)器為2、4、5時(shí),valid都拉高即可。理清思路,代碼就很好寫(xiě)了。
代碼:
計(jì)數(shù)器,來(lái)計(jì)入總共輸入了幾次3bit數(shù)據(jù):

當(dāng)輸入第二次、第四次、第五次時(shí),valid信號(hào)拉高:

????????case語(yǔ)句內(nèi)的作用是將數(shù)據(jù)進(jìn)行移位。因?yàn)樽疃嗲闆r下是存儲(chǔ)7bit數(shù)據(jù),然后輸出5bit,所以存儲(chǔ)輸入數(shù)據(jù)的空間只需要7bit就夠了。用7bit 的 data_store來(lái)存儲(chǔ)輸入數(shù)據(jù);
第一次輸入的3bit數(shù)據(jù)存儲(chǔ)在data_store的高3位,不輸出5bit數(shù)據(jù);
第二次輸入的3bit數(shù)據(jù)存儲(chǔ)在data_store的高4-6位。此時(shí),valid信號(hào)拉高,然后輸出5bit 數(shù)據(jù) data_out 等于data_store的高5bit即可;
第三次輸入的3bit數(shù)據(jù),讓data_store左移三位,然后存儲(chǔ)在低三位,不輸出5bit數(shù)據(jù);
第四次輸入的3bit數(shù)據(jù),讓data_store左移三位,然后存儲(chǔ)在低三位,此時(shí)7bit空間存滿(mǎn),因?yàn)檫M(jìn)行了兩次“左移三位”,所以此時(shí)7bit數(shù)據(jù)的最高位,就是原來(lái)7bit數(shù)據(jù)的最低位,也就是在第二次輸入數(shù)據(jù)時(shí),存儲(chǔ)6bit輸出5bit后,剩下的那1bit數(shù)據(jù)。再輸出高5bit數(shù)據(jù);余2bit
低五次輸入的3bit數(shù)據(jù),與上一階段余下的2bit數(shù)據(jù),湊5bit,放在data_store的高5位,輸出。

tb:整個(gè)testbench部分的激勵(lì),就按照題目的意思生成。


仿真波形:

輸入:000,110,011,011,010,010,011...? ?即:(000|11 0|011 |0 11|010|010|01 1)
輸出:00011,00110,11010,01001,1...? ? ?即:(000 11|0 011? 0|11010| 010 01|1)
每次輸出數(shù)據(jù)時(shí),valid信號(hào)有效,如波形所示。

ps:由于b站截圖顯示不全,up將完整代碼傳至網(wǎng)盤(pán)自取,總計(jì)代碼量60行左右,題目難度:簡(jiǎn)單。
代碼自取
鏈接:https://pan.baidu.c刪除中文om/s/1KpAE1cQLNa8刪除中文S5b2rZuqDFg?
提取碼:91m5?