基于FPGA的FIFO读写实验

FIFO简介:基于FPGA的FIFO读写实验_第1张图片

基于FPGA的FIFO读写实验_第2张图片

基于FPGA的FIFO读写实验_第3张图片
基于FPGA的FIFO读写实验_第4张图片
data[7:0] :数据输入端口,当wrreq信号为高电平且clok信号为高电平时将data线上的数据写入到FIFO中
wrreq:写请求信号,高电平有效
rdreq:读请求信号,高电平有效
q[7:0]:数据读取端口,当rdreq信号为高电平,且clok信号为高电平时,FIFO 将数据放到q数据线上
full:写满信号标志位,当FIFO中数据写满时改为置1
almost_full :即将写满信号(可配置还差多少个数据即将写满,例如配置为3,表示还差三个数据的时候将almost_full 信号拉高)
empty:FIFO读空信号,全空时置1
almost_empty:即将读空信号(可配置,例如配置为3,表示还差三个数据将FIFO读空的时候,讲almost_empty 信号拉高)
usedw[7:0]:当前FIFO中可用的数据个数
sclr:同步清0信号,该信号为1时,并且在clok信号来到时将FIFO中的数据清0
aclr:异步清0信号,该信号为1时,将FIFO中数据立即清0,不受时钟的约束

//				FIFO实验顶层模块(此处设置的是双时钟FIFO  IP核)
//****************************************************
module  ip_fifo(
	input				sys_clk,
	input				sys_rst_n

);
//wire  define
wire					wrreq;			//写请求信号
wire  [7:0]			data;				// 写入FIFO的数据
wire					wrempty;		   // FIFO空信号
wire					wrfull;			// FIFO写满信号
wire              wrusedw ;      // 写入FIFO中的数据量

wire  				rdreq;			// 读请求信号
wire	[7:0]			q;					// 从FIFO输出的数据
wire					rdempty;			// FIFO读空信号
wire					rdfull;			// FIFO读满信号
wire              rdusedw ;      // 读出FIFO中的数据量
//*****************************************************
//**                    main code
//*****************************************************			
//例化FIFO模块
fifo u_fifo(
    .wrclk   ( sys_clk ),         // 写时钟
    .wrreq   ( wrreq   ),         // 写请求
    .data    ( data    ),         // 写入FIFO的数据
    .wrempty ( wrempty ),         // 写空信号
    .wrfull  ( wrfull  ),         // 写满信号
    .wrusedw ( wrusedw ),         // 写侧数据量
    
    .rdclk   ( sys_clk ),         // 读时钟
    .rdreq   ( rdreq   ),         // 读请求
    .q       ( q       ),         // 从FIFO输出的数据
    .rdempty ( rdempty ),         // 读空信号
    .rdfull  ( rdfull  ),         // 读满信号
    .rdusedw ( rdusedw )          // 读侧数据量
);
//例化写FIFO模块
fifo_wr u_fifo_wr(
    .clk     (sys_clk ),          // 写时钟
    .rst_n   (sys_rst_n),         // 复位信号

    .wrreq   (wrreq   ),          // 写请求
    .data    (data    ),          // 写入FIFO的数据
    .wrempty (wrempty ),          // 写空信号
    .wrfull  (wrfull  )           // 写满信号
);

//例化读FIFO模块
fifo_rd u_fifo_rd(
    .clk     (sys_clk ),          // 读时钟
    .rst_n   (sys_rst_n),         // 复位信号

    .rdreq   (rdreq   ),          // 读请求
    .data    (q       ),          // 从FIFO输出的数据
    .rdempty (rdempty ),          // 读空信号
    .rdfull  (rdfull  )           // 读满信号
);

endmodule









```//*********************************************************
//				写FIFO模块
//************************************************************
module  fifo_wr(
 //mudule clock
	input			    	clk,				//模块时钟信号
	input				   rst_n,			//模块复位信号
 //user interface	
	input 		   	wrempty,			//FIFO空信号
	input				   wrfull,			//FIFO写满信号
	output  reg		   wrreq,			//写请求信号
	output  reg [7:0]	data				//写入FIFO的数据
);
//reg define
reg	[1:0]     flow_cnt;						//状态计数
//*****************************************************
//**                    main code
//*****************************************************

//向FIFO中写入数据
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        wrreq <= 1'b0;
        data  <= 8'd0;
        flow_cnt <= 2'd0;
    end
    else begin
        case(flow_cnt)
            2'd0: begin 
                if(wrempty) begin     //写空时,写请求拉高,跳到下一个状态
                    wrreq <= 1'b1;
                    flow_cnt <= flow_cnt + 1'b1;
                end 
                else
                    flow_cnt <= flow_cnt;
            end 
            2'd1: begin               //写满时,写请求拉低,跳回上一个状态
                if(wrfull) begin
                    wrreq <= 1'b0;
                    data  <= 8'd0;
                    flow_cnt <= 2'd0;
                end
                else begin            //没有写满的时候,写请求拉高,继续输入数据
                    wrreq <= 1'b1;
                    data  <= data + 1'd1;
                end
            end 
            default: flow_cnt <= 2'd0;
        endcase
    end
end

endmodule






//*********************************************************
//				读FIFO模块
//*********************************************************
module  fifo_rd(
 //mudule clock
	input				clk,
	input				rst_n,
 //user interface	
	input		[7:0]	data,				// 从FIFO输出的数据
	input          rdfull ,       // FIFO读满信号
   input          rdempty,       // FIFO读空信号
   output  reg    rdreq          // 读请求

);
//reg define
reg   [7:0]          data_fifo;      // 读取的FIFO数据
reg   [1:0]          flow_cnt ;      // 状态流转计数
//*****************************************************
//**                    main code
//*****************************************************

//从FIFO中读取数据
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        rdreq <= 1'b0;
        data_fifo <= 8'd0;
    end
    else begin
        case(flow_cnt)			
            2'd0: begin
                if(rdfull) begin				//当FIFO寄存器中数据写满时,拉高读请求信号,并跳转到下一读状态
                    rdreq <= 1'b1;
                    flow_cnt <= flow_cnt + 1'b1;
                end
                else
                    flow_cnt <= flow_cnt;
            end 
            2'd1: begin
                if(rdempty) begin			//当FIFO被读空时,拉低读请求信号
                    rdreq <= 1'b0;
                    data_fifo <= 8'd0;
                    flow_cnt  <= 2'd0;
                end
                else begin						//读取数据
                    rdreq <= 1'b1;			
                    data_fifo <= data;
                end 
            end 
            default: flow_cnt <= 2'd0;
        endcase
    end
end 
endmodule

你可能感兴趣的:(FPGA,verilog,fifo,fpga)