數(shù)字IC手撕代碼-握手信號(READY-VALID)
????????大家好我是酸菜魚,這個系列著重講解數(shù)字ic或FPGA實習(xí)面試及秋招面試的高頻手撕代碼題。
往期專欄:
數(shù)字ic手撕代碼-導(dǎo)覽目錄 - 嗶哩嗶哩 (bilibili.com)
數(shù)字ic手撕代碼-格雷碼的編碼與解碼 - 嗶哩嗶哩 (bilibili.com)
數(shù)字IC手撕代碼-序列檢測(移位寄存器寫法) - 嗶哩嗶哩 (bilibili.com)
專欄眾多,不一一列舉,詳情請看導(dǎo)覽目錄...?
本文講同步時鐘下的數(shù)據(jù)握手,用于前后模塊的數(shù)據(jù)交互。
握手信號
握手信號,就是為了模塊之間的數(shù)據(jù)交互正確才衍生出來的信號。其無非就是三種可能
一、上游master提供的valid 信號隨數(shù)據(jù)一起拉高,但下游slave過一段時間才準(zhǔn)備好的valid先高為敬。

二、下游slave一直準(zhǔn)備好,但上游數(shù)據(jù)過段時間才有效的ready先高為敬。

三、上游master的valid信號和下游slave的ready同時為高。

????????當(dāng)初up第一次接觸握手信號的時候,其實是很清楚上面的三條握手原則的,但是具體的,master和slave之間的握手信號該怎么寫代碼卻迷迷糊糊。就利用這篇文章簡單的講一下master和slave之間是怎么通過握手信號來解決數(shù)據(jù)交互問題的。同時也為下一篇文章《多級流水線握手》打下基礎(chǔ)。下一篇文章會講解如何利用握手信號,解決流水線因為上流斷流及下游反壓導(dǎo)致的流水線停滯問題。
????????好,回到本篇文章來。
????????對于master來說,master發(fā)出一個數(shù)據(jù),如果數(shù)據(jù)有效,master就會把傳送給slave的valid信號拉高,即告訴slave數(shù)據(jù)有效可以接收!如果slave準(zhǔn)備好了,slave就把傳送給master的ready信號拉高,告訴master我準(zhǔn)備好了,如果你數(shù)據(jù)有效,我就可以接收!所以當(dāng)master傳輸?shù)臄?shù)據(jù)有效,且slave也準(zhǔn)備好時,數(shù)據(jù)就會在下一個周期被slave取走,master可以接著傳下一個數(shù)據(jù)。
????????對于你寫的模塊來說,如果要跟上下做數(shù)據(jù)握手,那么對于上游,你是一個slave,對于下游,你又是一個master了,所以接口應(yīng)該如下:

接口解釋:
????????data_i為輸入的數(shù)據(jù),如果valid_i為1,則數(shù)據(jù)有效,ready_o是slave發(fā)送給上游master的準(zhǔn)備信號,如果ready_o準(zhǔn)備好了,則為1。
????????data_o為該模塊輸出給下游的數(shù)據(jù),如果輸出的數(shù)據(jù)有效,則valid_o為1。下游也會有準(zhǔn)備好和沒準(zhǔn)備好的時候,所以還需要一個下游提供給本模塊的ready_i信號,來告訴我們下游是否準(zhǔn)備完畢。

代碼編寫如上,關(guān)鍵就在于注釋:
如果下游準(zhǔn)備好了,并且上游輸入的數(shù)據(jù)有效的話, 把輸入數(shù)據(jù)乘以二賦值給輸出數(shù)據(jù)。
如果下游準(zhǔn)備好可以接收數(shù)據(jù)了,那本模塊就可以處理數(shù)據(jù)了。
如果本模塊準(zhǔn)備好了,就把上游的valid_i傳遞給下游valid_o.
這里的testbench也很重要。

我們用tb來模擬本模塊的上游master和下游slave,用tb給本模塊提供上游數(shù)據(jù)data_i和valid_i信號。分別模擬了上游斷流,即valid_i中途拉低,以及下游反壓,即ready_i中途為低的情況。都通過。

當(dāng)輸出數(shù)據(jù)有效的時候,本模塊輸出的valid_o為高,均符合要求。不熟悉的小伙伴,多看看波形理解一下,整個module也在上面分為兩部分貼出來了,感興趣可以自己動手打一下,上面的是完整代碼。tb省略了端口例化和變量定義。