天天看點

數字IC手撕代碼-雙端口RAM(dual-port-RAM)雙端口RAM僞雙端口RAM真雙端口RAM

前言:

        本專欄旨在記錄高頻筆面試手撕代碼題,以備數字前端秋招,本專欄所有文章提供原理分析、代碼及波形,所有代碼均經過本人驗證。

目錄如下:

1.數字IC手撕代碼-分頻器(任意偶數分頻)

2.數字IC手撕代碼-分頻器(任意奇數分頻)

3.數字IC手撕代碼-分頻器(任意小數分頻)

4.數字IC手撕代碼-異步複位同步釋放

5.數字IC手撕代碼-邊沿檢測(上升沿、下降沿、雙邊沿)

6.數字IC手撕代碼-序列檢測(狀态機寫法)

7.數字IC手撕代碼-序列檢測(移位寄存器寫法)

8.數字IC手撕代碼-半加器、全加器

9.數字IC手撕代碼-串轉并、并轉串

10.數字IC手撕代碼-資料位寬轉換器(寬-窄,窄-寬轉換)

11.數字IC手撕代碼-有限狀态機FSM-飲料機

12.數字IC手撕代碼-握手信号(READY-VALID)

13.數字IC手撕代碼-流水握手(利用握手解決流水線斷流、反壓問題)

14.數字IC手撕代碼-泰淩微筆試真題

15.數字IC手撕代碼-平頭哥技術終面手撕真題

16.數字IC手撕代碼-兆易創新筆試真題

17.數字IC手撕代碼-樂鑫科技筆試真題(4倍頻)

18.數字IC手撕代碼-雙端口RAM(dual-port-RAM)

        ...持續更新

 更多手撕代碼題可以前往 數字IC手撕代碼--題庫

目錄

雙端口RAM

僞雙端口RAM

真雙端口RAM

代碼

testbench

波形

雙端口RAM

        這篇文章來介紹雙端口RAM,目的是為後續的同步FIFO和異步FIFO打下基礎,我們都知道其實FIFO就類似一個RAM,但是它對輸入輸出的信号做了處理,可以使得資料在跨時鐘域的時候不會出錯。寫FIFO都是要調用RAM的,那麼一個雙端口RAM怎麼寫呢?

        雙端口RAM分很多種,同步雙端口RAM(讀寫同時鐘),異步雙端口RAM(讀寫分别用讀時鐘和寫時鐘),以及每種雙端口RAM又分為僞雙端口RAM和真雙端口RAM。僞雙端口RAM是指有兩個讀寫通道,其中一個用來讀另一個用來寫。而真雙端口 RAM 指的是有兩個讀寫端口,每個端口都可以獨立發起讀或者寫。

        而單端口RAM就是對一個通道又讀又寫。 

數字IC手撕代碼-雙端口RAM(dual-port-RAM)雙端口RAM僞雙端口RAM真雙端口RAM

僞雙端口RAM

        一個僞雙端口RAM,一個通道讀,一個通道寫,寫通道有寫資料、寫位址和寫使能,讀通道有讀資料、讀位址和讀使能,再加上輸入時鐘,構成輸入輸出的端口。一個簡單的雙端口RAM可以寫成如下:

數字IC手撕代碼-雙端口RAM(dual-port-RAM)雙端口RAM僞雙端口RAM真雙端口RAM

        用兩個過程語句塊描述,一個通道讀,一個通道寫。如果是異步的時鐘,即讀寫不是同一時鐘的話,可以修改兩個過程語句塊的敏感事件清單,一個改成always@(posedge clkw),另一個改成always@(posedge clkr)即可。

真雙端口RAM

而對于一個真雙端口RAM,兩個通道即可讀又可寫,怎麼處理呢?

        真雙端口RAM,每個通道都有通道使能、輸入資料、輸出資料、資料位址、寫使能、通道時鐘六個端口,是以真雙端口RAM共有12個端口。通道a一套,通道b一套。

數字IC手撕代碼-雙端口RAM(dual-port-RAM)雙端口RAM僞雙端口RAM真雙端口RAM

        對真雙端口RAM的一個通道來說,當通道使能時,如果寫使能,則把值寫入到RAM的addra位址,并讀出RAM位于addra位址的舊的值。如果寫不使能,則讀出RAM位于addra位址的資料。

代碼

數字IC手撕代碼-雙端口RAM(dual-port-RAM)雙端口RAM僞雙端口RAM真雙端口RAM

testbench

數字IC手撕代碼-雙端口RAM(dual-port-RAM)雙端口RAM僞雙端口RAM真雙端口RAM

波形

數字IC手撕代碼-雙端口RAM(dual-port-RAM)雙端口RAM僞雙端口RAM真雙端口RAM

        之是以輸出資料會出現紅線,是因為RAM的一開始數值是不确定的,是以在每次切換位址後,讀取出來的RAM對應位址的舊的值是不确定的,是以是紅線。過一個周期後,改位址被寫入新的值,新的值被讀出,是以有data_o_a/b有資料。

        當然我們這裡還要提一下,可能有人會問,你這裡不會出現讀寫沖突嗎。你這裡怎麼判斷空滿,寫滿了怎麼停止寫入,讀空了怎麼停止讀出呢?

        對于第一個問題,兩個通道對RAM的同一塊位址同時進行讀寫,這個的解決辦法是在一開始的時候,就不要讓addra=addrb,解決問題的最好辦法就是不讓問題發生。

        對于第二個問題,關于位址指針和空滿判斷其實不屬于RAM的範疇,RAM可以把它了解為一個存儲的空間,具體的指針控制和空滿判斷其實是RAM外部添加的一些控制信号。不屬于RAM的範疇,具體如何解決位址指針移動及空滿判斷問題,會在同步FIFO及異步FIFO中給出詳細解答。 

 更多手撕代碼題可以前往 數字IC手撕代碼--題庫

繼續閱讀