數(shù)字IC手撕代碼-數(shù)據(jù)位寬轉(zhuǎn)換器(寬-窄,窄-寬轉(zhuǎn)換)
????????大家好我是酸菜魚,這個(gè)系列著重講解數(shù)字IC或FPGA實(shí)習(xí)面試及秋招面試的高頻手撕代碼題 。
往期手撕代碼題:
數(shù)字ic手撕代碼-導(dǎo)覽目錄 - 嗶哩嗶哩 (bilibili.com)
數(shù)字IC手撕代碼-分頻器(任意奇數(shù)分頻) - 嗶哩嗶哩 (bilibili.com)
數(shù)字IC手撕代碼-序列檢測(cè)(狀態(tài)機(jī)寫法) - 嗶哩嗶哩 (bilibili.com)
數(shù)字IC手撕代碼-分頻器(任意小數(shù)分頻) - 嗶哩嗶哩 (bilibili.com)
......
完全內(nèi)容,請(qǐng)前往導(dǎo)覽目錄查看。
數(shù)據(jù)位寬轉(zhuǎn)換器:
????????數(shù)據(jù)位寬轉(zhuǎn)換器,一般常用于模塊接口處,比如一個(gè)電路模塊的輸出數(shù)據(jù)位寬大于另一個(gè)模塊的輸入數(shù)據(jù)位寬,此時(shí)就需要進(jìn)行數(shù)據(jù)位寬轉(zhuǎn)換。比如SATA控制器中,內(nèi)部數(shù)據(jù)位寬為32bit,但外部物理收發(fā)器PHY的接口通常為16bit,或者8bit,在不使用FIFO進(jìn)行緩存的情況下,可以使用數(shù)據(jù)位寬轉(zhuǎn)換器,通過(guò)時(shí)鐘倍頻在實(shí)現(xiàn)數(shù)據(jù)位寬的轉(zhuǎn)換。
?1.由寬到窄的數(shù)據(jù)轉(zhuǎn)換
????????假設(shè)數(shù)據(jù)從模塊A傳入到模塊B,模塊A的輸出數(shù)據(jù)為32位,模塊B的輸入數(shù)據(jù)位寬為16位,那么如何能把數(shù)據(jù)從A傳入B而不損失數(shù)據(jù)呢。
????????答:通過(guò)時(shí)鐘的分頻與倍頻實(shí)現(xiàn)。
????????我們假設(shè)一個(gè)原時(shí)鐘clk1,通過(guò)二分頻,把原時(shí)鐘變?yōu)闀r(shí)鐘clk2,那么clk2的時(shí)鐘周期就是clk1的兩倍。在clk2的上升沿,我們讀入32bit數(shù)據(jù),在clk2x的上升沿我們輸出16bit數(shù)據(jù),由于clk1的頻率是clk2的兩倍,每讀入一次32bit數(shù)據(jù),就會(huì)輸出兩次16bit數(shù)據(jù),從而實(shí)現(xiàn)了數(shù)據(jù)位寬的轉(zhuǎn)換,如圖:


代碼:

Testbench:

波形:

2.由窄到寬的數(shù)據(jù)轉(zhuǎn)換
????????由窄到寬的數(shù)據(jù)位寬轉(zhuǎn)換原理和由寬到窄的是一樣的。把頻率高一點(diǎn)的時(shí)鐘用來(lái)采樣16bit數(shù)據(jù),頻率低一點(diǎn)的時(shí)鐘用來(lái)輸出32bit數(shù)據(jù)。
?代碼:

Testbench:

波形:

????????位寬轉(zhuǎn)換的核心就在于生成一個(gè)與原時(shí)鐘成比例關(guān)系的時(shí)鐘,這樣時(shí)鐘頻率的比例關(guān)系就可以和數(shù)據(jù)的位寬扯上聯(lián)系。