ZYNQ之FPGA学习----RAM IP核使用实验
1 RAM IP核介紹
RAM 的英文全稱是 Random Access Memory, 即隨機存取存儲器, 它可以隨時把數據寫入任一指定地址的存儲單元,也可以隨時從任一指定地址中讀出數據,其讀寫速度由時鐘頻率決定
Xilinx 7 系列器件具有嵌入式存儲器結構,嵌入式存儲器結構由一列列 BRAM(塊 RAM)存儲器模塊組成,通過對這些 BRAM 存儲器模塊進行配置,可以實現各種存儲器的功能,例如:RAM、移位寄存器、ROM 以及 FIFO 緩沖器
Vivado 軟件自帶了 BMG IP 核(Block Memory Generator,塊 RAM 生成器),可以配置成 RAM 或者 ROM
2 實驗任務
實驗任務是使用 Xilinx BMG IP 核,配置成一個單端口的 RAM,然后對 RAM 進行讀寫操作。BMG IP 核配置成單端口 RAM 如圖所示:
圖片來自《領航者ZYNQ之FPGA開發指南》
- DINA: RAM 端口 A 寫數據信號
- ADDRA: RAM 端口 A 讀寫地址信號,對于單端口 RAM 來說,讀地址和寫地址共用同該地址線
- WEA: RAM 端口 A 寫使能信號,高電平表示向 RAM 中寫入數據,低電平表示從 RAM 中讀出數據
- ENA: 端口 A 的使能信號,高電平表示使能端口 A,低電平表示端口 A 被禁止,禁止后端口 A 上的讀寫操作都會變成無效。另外 ENA 信號是可選的,當取消該使能信號后,RAM 會一直處于有效狀態
- RSTA: RAM 端口 A 復位信號,可配置成高電平或者低電平復位,該復位信號是一個可選信號
- REGCEA: RAM 端口 A 輸出寄存器使能信號,當 REGCEA 為高電平時,DOUTA 保持最后一次輸出的數據,REGCEA 同樣是一個可選信號
- CLKA: RAM 端口 A 的時鐘信號
- DOUTA: RAM 端口 A 讀出的數據
3 實驗設計
3.1 創建工程
新建工程,操作如圖所示:
輸入工程名和工程路徑,如圖所示:
選擇創建RTL工程,如圖所示:
直接點擊Next:
繼續點擊Next:
添加芯片型號,操作如圖所示:
完成工程創建:
3.2 設計輸入
點擊IP Catalog,搜索Block Memory,如圖所示:
雙擊Block Memory Generator,彈出如下窗口:
- Component Name: 設置該 IP 核的名稱
- Interface Type: RAM 接口總線,選擇 Native 接口類型(標準 RAM 接口總線)
- Memory Type: 存儲器類型,可配置成 Single Port RAM(單端口 RAM)、Simple Dual Port RAM(偽雙端口 RAM)、True Dual Port RAM(真雙端口 RAM)、Single Port ROM(單端口 ROM)和 Dual Port ROM(雙端口 ROM),本實驗選擇 Single Port RAM,即配置成單端口 RAM
- ECC Options: Error Correction Capability,糾錯能力選項,單端口 RAM 不支持 ECC
- Write Enable: 字節寫使能選項,勾中后可以單獨將數據的某個字節寫入 RAM 中
- Algorithm Options: 算法選項,可選擇 Minimum Area(最小面積) 、 Low Power(低功耗)和 Fixed Primitives(固定的原語)
設置端口A的參數,如圖所示:
- Write Width: 端口 A 寫數據位寬,單位 Bit
- Read Width: 端口 A 讀數據位寬,一般和寫數據位寬保持一致
- Write Depth: 寫深度,即 RAM 所能訪問的地址范圍為 0-31
- Read Depth: 讀深度,默認和寫深度保持一致
- Operating Mode: RAM 讀寫操作模式,共分為三種模式,分別是 Write First(寫優先模式)、Read First(讀優先模式)和 No Change(不變模式)。寫優先模式指數據先寫入 RAM 中,然后在下一個時鐘輸出該數據;讀優先模式指數據先寫入 RAM 中,同時輸出 RAM 中同地址的上一次數據;不變模式指讀寫分開操作,不能同時進行讀寫
- Enable Port Type: 使能端口類型,Use ENA pin(添加使能端口 A 信號);Always Enabled(取消使能信號,端口 A 一直處于使能狀態)
- Port A Optional Output Register: 端口 A 輸出寄存器選項,其中Primitives Output Register默認是選中狀態,作用是打開 BRAM 內部位于輸出數據總線之后的輸出流水線寄存器
- Port A Output Reset Options: RAM 復位信號選項
Other Options 選項界面用于設置 RAM 的初始值:
Summary選項界面顯示了存儲器的類型,消耗的 BRAM 資源等,如圖所示:
彈出如下窗口,直接點擊Generate:
點擊OK即可:
IP 核自動生成的只讀的 verilog 例化模板文件,雙擊打開,如圖所示:
創建工程頂層文件,操作如圖所示:
創建文件,輸入文件名ip_ram:
創建完成:
雙擊打開,輸入代碼如下:
module ip_ram( input sys_clk , //系統時鐘 input sys_rst_n, //系統復位,低電平有效 output ram // 任意定義); //wire define wire ram_en ; //RAM 使能 wire ram_wea ; //ram 讀寫使能信號,高電平寫入,低電平讀出 wire [4:0] ram_addr ; //ram 讀寫地址 wire [7:0] ram_wr_data ; //ram 寫數據 wire [7:0] ram_rd_data ; //ram 讀數據 //ram 讀寫模塊 ram_rw u_ram_rw( .clk (sys_clk ), .rst_n (sys_rst_n ), //RAM .ram_en (ram_en ), .ram_wea (ram_wea ), .ram_addr (ram_addr ), .ram_wr_data (ram_wr_data ), .ram_rd_data (ram_rd_data ) ); //ram ip 核 blk_mem_gen_0 blk_mem_gen_0 ( .clka (sys_clk ), // input wire clka .ena (ram_en ), // input wire ena .wea (ram_wea ), // input wire [0 : 0] wea .addra (ram_addr ), // input wire [4 : 0] addra .dina (ram_wr_data ), // input wire [7 : 0] dina .douta (ram_rd_data ) // output wire [7 : 0] douta ); endmodule繼續創建文件ram_rw,如圖所示:
雙擊打開,輸入代碼:
module ram_rw( input clk , //時鐘信號 input rst_n , //復位信號,低電平有效 output ram_en , //ram 使能信號 output ram_wea , //ram 讀寫選擇 output reg [4:0] ram_addr , //ram 讀寫地址 output reg [7:0] ram_wr_data, //ram 寫數據 input [7:0] ram_rd_data //ram 讀數據 ); //reg define reg [5:0] rw_cnt ; //讀寫控制計數器 //控制 RAM 使能信號 assign ram_en = rst_n; //rw_cnt 計數范圍在 0~31,寫入數據;32~63 時,讀出數據 assign ram_wea = (rw_cnt <= 6'd31 && ram_en == 1'b1) ? 1'b1 : 1'b0; //讀寫控制計數器,計數器范圍 0~63 always @( posedge clk or negedge rst_n) begin if(rst_n == 1'b0)rw_cnt <= 1'b0; else if(rw_cnt == 6'd63) rw_cnt <= 1'b0; else rw_cnt <= rw_cnt + 1'b1; end //產生 RAM 寫數據 always @( posedge clk or negedge rst_n) begin if(rst_n == 1'b0) ram_wr_data <= 1'b0; else if(rw_cnt <= 6'd31) //在計數器的 0-31 范圍內,RAM 寫地址累加 ram_wr_data <= ram_wr_data + 1'b1; else ram_wr_data <= 1'b0 ; end //讀寫地址信號 范圍:0~31 always @( posedge clk or negedge rst_n) begin if(rst_n == 1'b0) ram_addr <= 1'b0; else if(ram_addr == 5'd31) ram_addr <= 1'b0; else ram_addr <= ram_addr + 1'b1; end endmodule如圖所示:
3.3 分析與綜合
對設計進行分析,操作如圖所示:
分析后的設計,Vivado自動生成頂層原理圖,如圖所示:
對設計進行綜合,操作如圖所示:
綜合完成后,彈出窗口如下,直接關閉:
3.4 約束輸入
創建約束文件,操作如圖所示:
創建文件,輸入文件名:
雙擊打開,輸入約束代碼:
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk] set_property -dict {PACKAGE_PIN J15 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]如圖所示:
3.5 設計實現
點擊 Flow Navigator 窗口中的 Run Implementation,如圖所示:
點擊OK:
報錯,如圖所示:
錯誤解決方案:Vivado 設計實現時報錯The design is empty的解決方案(親測有效)
3.6 功能仿真
創建TestBench,操作如圖所示:
創建文件,輸入文件名:
創建完成:
雙擊打開,輸入TestBench(激勵)代碼:
`timescale 1ns / 1ps module tb_ip_ram (); reg sys_clk; reg sys_rst_n; always #10 sys_clk = ~sys_clk; initial begin sys_clk = 1'b0; sys_rst_n = 1'b0; #200 sys_rst_n = 1'b1; end ip_ram u_ip_ram( .sys_clk (sys_clk ), .sys_rst_n (sys_rst_n ) ); endmodule如圖所示:
開始進行仿真,操作如下:
選擇HDL仿真對象,這里把我們解決錯誤時,任意添加的輸出ram也選擇了(不需要選擇):
選擇HDL仿真對象:
點擊Restart,波形窗口中的當前仿真時刻點回歸到0ns:
刪掉誤添加的ram,開始仿真,ram進行寫操作:
ram進行讀操作:
關閉仿真:
點擊OK即可:
3.7 下載驗證
由于疫情,一直無法去實驗室,故ZYNQ開發板不在身邊,該步驟內容待更新
致謝領航者ZYNQ開發板,開啟FPGA學習之路!
希望本文對大家有幫助,上文若有不妥之處,歡迎指正
分享決定高度,學習拉開差距
總結
以上是生活随笔為你收集整理的ZYNQ之FPGA学习----RAM IP核使用实验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正则匹配0-999区间数字
- 下一篇: 由子网掩码字符串转换成长度前缀的代码示例