FIFO_IP核 模擬,quartus ii (內建)
阿新 • • 發佈:2018-12-14
年輕人,多睡覺!工作業餘之際,複習下曾經學過的。害怕忘記,於是記錄下來,也有一段記憶。若有錯誤,歡迎指正。 altera 板子測試 程式設計 1.首先是一個計數器cnt計數到64。 2.然後在cnt取0-31時,開始寫入資料,寫入的資料都等於cnt。 3.開始在cnt取32-63時,開始讀出資料。
module fifo_test( clk, rst_n, wren, rden, wrdata, rddata, full_sig, empty_sig ); input clk; input rst_n; output reg wren; output reg rden; output reg [5:0] rddata; output [5:0] wrdata;//使用wire型,這是自帶fifo 的要求 output full_sig; output empty_sig; //counter reg [5:0] cnt;
[email protected](posedge clk or negedge rst_n) if(!rst_n) cnt<=0; else if(cnt<=6'd63) cnt<=0; else cnt<=cnt+1'b1; // enable write [email protected](posedge clk or negedge rst_n) if(!rst_n) wren<=0; else if(cnt>=0&&cnt<=6'd31) wren<=1'b1; else wren<=0; //enable read[email protected](posedge clk or negedge rst_n) if(!rst_n) rden<=0; else if(cnt>=6'd32&&cnt<=6'd63) rden<=1'b1; else rden<=0; //write the data to the fifo [email protected](posedge clk or negegdge rst_n) if(rst_n) wrdata<=0; else if(wren) wrdata<=cnt; else wrdata<=wrdata; //在quartus 裡面呼叫fifo,自動生成,可以根據需要自己修改 fifo fifo_inst( .clock(clk), .data(wrdata), .rdreq(rden), .wrreq(wren), .empty(empty_sig), .full(full_sig), .q(rddata) ); endmodule );
最後是模擬檔案
`timescale 1ns/1ps
module fifo_test_vlg_tst();
reg clk;
reg rst_n;
wire empty_sig;
wire full_sig;
wire [5:0] rddata;
wire [5:0] wrdata;
wire rden;
wire wren;
fifo_test i1(
.clk(clk),
.empty_sig(empty_sig),
.full_sig(full_sig),
.rddata(rddata),
.rden(rden),
.rst_n(rst_n),
.wrdata(wrdata),
.wren(wren)
);
initial
begin
clk=0;
rst_n=0;
#200
rst_n=1;
end
always
begin
#5 clk=~clk;
end
endmodule
最後利用modesim,可以看到波形 上圖開始寫的時候。 可以看出cnt是迴圈計數到63。 empty_sig表示fifo空 開始寫的時候,由高拉低。同時wren開始拉高,開始存入wrdata資料0-31。 上圖是寫的時候。 可以看出在cnt=32時候, 在full_sig 由低拉高,說明fifo已經寫滿了。 同時rden從低到高。開始讀取資料,rddata依次出來的數字,都是之前fifo存入的數字。
由此可見,fifo 先進先出作用。