姓名 | 學號 |
---|---|
劉永勝 | F94089032 |
蔡宗瑾 | E14083137 |
李宇洋 | E24099025 |
這次實作的概念是,以verilog叫出內建的RAMB36E1
IP。實作 True dual port RAM 則代表支援2 read、2 write、1 read/1 write 3種資料傳輸方式。
呼叫方式如下方code範例,分成attributes的基本設置和port descriptions的腳位定義。之後依序說明設置方式和理由。
Available Attributes
依照題目要求實作true dual port RAM,在.RAM_MODE設置為"TDP",下方分項說明各個設定的意義。
(1) Set output register
在memory data輸出的位置,有一個output register,將此暫存器開啟,暫存從memory讀取出來的數值,保證下一級電路能有一個完整的clk cycle取資料。
(2) Set initial value in RAM
依題目要求,每32 bit為一個word,並依照指定位置,設置RAM的初始值。其中每4個offset代表4 byte,亦即1 word。例如: offset=28,則將數值設置在第7個word上。
Offset = 0 : 0x2597
Offset = 4 : 0x6425
Offset = 28 : 0x5071
Offset = 64 : 0x8CF5
(3) Define width of datapath
題目要求為32-bit datapath,但須設置為36-bit。4 bit作為parity bit。此外,因為實作true dual port,A、B兩個port的read、write皆須定義為36-bit。
Port Descriptions
先看到dual port RAM的IO名稱,dual port的關係,A、B兩個port各腳位都是成對的。下方依序說明各腳位的功用。
(1) Set clk port
在TDP mode中,A、B兩個port是可以獨立的,實現asynchronous讀寫,因此分別輸入不同的clk。此外,為了能用兩個AXI BRAM controller
實現dual port,因此必須定義兩個clk接線。
(2) Set enable output register
同前面設定output register,將A、B output register enable 設定為1'b1,表示兩個output register永遠開啟。
(3) Set enable RAM
RAM的read、write enable由兩個訊號控制,分別為enable和write_enable。並沒有所謂的read_enable訊號。enable表示RAM目前可讀、寫,write_enable為high則表示可寫、low表示可讀。下方表格說明兩訊號關係。
enable | write_enable | 說明 |
---|---|---|
1'b0 | 1'b0 | cannot read and write |
1'b0 | 1'b1 | cannot read and write |
1'b1 | 1'b0 | enable read only |
1'b1 | 1'b1 | enable write only |
在TDP mode中,.ENARDEN()、.ENBWREN()表示enable訊號,.WEA()、.WEBWE()則表示write_enable訊號。
<特別注意>
.WEA()、.WEBWE()為4-bit enable而非1-bit,原因是此RAM支援byte-wide write。我們的1 word為32-bit,等於4 byte,若我們今天要一次寫入32-bit則write_enable設定為4'b1111。若我們只想寫入32-bit中的LSB 8-bit,則write_enable設定為4'b0001。
(4) Set input address
在TDP mode.ADDRARDADDR()、.ADDRBWRADDR()分別代表port A、B的讀,寫16-bit address。
(5) Set input/output datapath
RAM input/output data皆為32-bit,而.DOADO()、.DOBDO()為output dual port,.DIADI()、.DIBDI()為input dual port。
根據Product selection guide,BRAM共有140個可使用,而我們這次dual port BRAM使用了其中的1個BRAM。因此從下方utilization report看到我們BRAM用了1/140 = 0.71%。
為了實現 真-dual port BRAM,必須使用兩個AXI BRAM controller
,分別連接到的BRAM port A、port B上,才能在C program測試時分別灌資料測試。
在接線時,會發現AXI BRAM controller
只有一個BRAM_PORTA的接口,接不上自行設定的verilog template BRAM。無意中發現只要點開AXI BRAM controller
最右邊的 + 就會出現controller詳細的接口,再手動連接到verilog template BRAM即可。
Block memory - RAMB36E1
分成parity mem、data mem,分別有16、128個word。每個word為256-bit。總共容量為 (16+128) * 256 = 36864,約為36Kb。PYNQ-Z2上共有多少容量的Block RAM ?
根據Product selection guide可得知Total Block RAM共有4.9Mb(Mebibyte)。一個Block RAM的容量有36Kb,又共有140個Block RAM,因此總容量為
承上題,共有多少個RAMB36E1 ?
本實作板子為PYNQ-Z2,屬於zynq-7000系列Soc家庭,其processing system(PS)的型號為Z-7020,根據Product selection guide可得知Total Block RAM(#36Kb blocks)有140個。
若要將RAMB36E1 Configure成36Kb FIFO,該使用什麼Verilog Template ?
下方為實作32-bitwise的FIFO,將RAMB36E1
在TDP mode操作,A port為read、B port為write。其中,以head、tail為FIFO的pointer,當head等於tail時,表示記憶體裡面是空的,則無法read data,write data則沒有考慮overflow,永遠都可以write。BRAM設定說明見程式碼註解 (17個設定說明)。
<特別注意>
程式碼第49行,ren需要加上inverter的邏輯,因為write_enable=0才是read data。
[1] Vivado Design Suite 7 Series FPGA and Zynq-7000 SoC Libraries Guide (UG953)文檔搜尋: RAMB36E1
[2] 考古
[3] 腳位說明
[4] 範例code