生活随笔
收集整理的這篇文章主要介紹了
verilog基础篇RAM IP核的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在該頁面中,我們去掉了q output port(去掉輸出寄存器),并且添加了一個rden讀使能信號,所謂rden讀使能信號就是,當該信號為高電平時,我們才可以讀取RAM IP核中的數據。
其余的頁面我們使用默認設置即可,不要忘記勾選inst初始化模板文件。
//該代碼主要實現了先往RAM IP核中的0-31地址寫入0-31數據,
//每個地址對應一個數據,比如0地址對應0數據,1地址對應1數據,以此類推
//寫完了32個數據之后,我們在將RAM IP核中的0-31地址中的數據讀出
//當寫數據時,我們需要將寫使能信號拉高,當讀數據時,我們需要將讀使能信號拉高
//該代碼主要實現了先往RAM IP核中的0-31地址寫入0-31數據,
//每個地址對應一個數據,比如0地址對應0數據,1地址對應1數據,以此類推
//寫完了32個數據之后,我們在將RAM IP核中的0-31地址中的數據讀出
//當寫數據時,我們需要將寫使能信號拉高,當讀數據時,我們需要將讀使能信號拉高
module verilog_ip_RAM
(
input clk_50M,
input RST_N,
/*RAM端口*/
output reg [4:0] address, //RAM的地址端口
output reg [7:0] wrdata, //RAM的寫數據端口
output [7:0] rddata, //RAM的讀數據端口
output reg [5:0] time_cnt, //計數器
output wren, //RAM的寫使能端口
output rden //RAM的讀使能端口
);//計數器
reg [5:0] time_cnt_n;//time_cnt的下一個狀態//RAM的地址端口
reg [4:0] address_n; //address的下一個狀態//RAM的寫數據端口
reg [7:0] wrdata_n; //wrdata的下一個狀態//時序邏輯電路,用來給time_cnt寄存器賦值
always @ (posedge clk_50M or negedge RST_N)
begin
if(!RST_N)time_cnt<=1'b0;
elsetime_cnt<=time_cnt_n;
end/*組合電路*/
always @ (*)
beginif(time_cnt==6'd63)time_cnt_n=0;elsetime_cnt_n=time_cnt+1;
end/*時序電路,用來給address寄存器賦值*/
always @ (negedge clk_50M or negedge RST_N)
beginif(!RST_N)address<=1'b0;elseaddress<=address_n;
end/*組合電路,用來生成RAM地址*/
always @ (*)
beginif(address==5'd31)address_n=1'b0;elseaddress_n=address+1'b1;
end/*組合電路,根據計數器用來生成RAM寫使能*/
assign wren = (time_cnt>=1'b0&&time_cnt<=5'd31)?1'b1:1'b0;/*時序電路,用來給wrdata寄存器賦值*/
always @ (negedge clk_50M or negedge RST_N)
beginif(!RST_N)wrdata<=1'b0;elsewrdata<=wrdata_n;
end/*組合電路,根據計數器用來生成寫入RAM的數據*/
always @ (*)
beginif(time_cnt>=1'b0&&time_cnt<=5'd31)wrdata_n=time_cnt;elsewrdata_n=wrdata;end/*組合電路,根據計數器用來生成RAM讀使能*/
assign rden =(time_cnt>=6'd32&&time_cnt<=6'd63)?1'b1:1'b0;/*RAM IP核模塊*/RAM RAM_inst (.address ( address ), //RAM的地址端口.clock ( clk_50M ), //時鐘端口.data ( wrdata ),//RAM的寫數據端口.rden ( rden ), //RAM的讀使能端口.wren ( wren ), //RAM的寫使能端口.q ( rddata ) //RAM的讀數據端口);endmodule
寫數據如上圖所示
從圖中可以看到寫使能信號為高,讀使能信號為低時候,該操作就是往RAM IP核里面寫數據。
在上升沿,數據生成由time_cnt生成,在下降沿進行寫數據,由上圖可以看到在地址30的時候,就寫入數據30,在地址31的時候,就寫入數據31.
讀數據如上圖所示
讀數據由于有一個寄存器的延時,在下降沿的地址遞增,在下一個上升沿輸出對應地址的數據。
也可以用signal tap II 調試觀察
總結
以上是生活随笔為你收集整理的verilog基础篇RAM IP核的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。