#FPGA(同步FIFO)

1.IDE:Quartus II


2.设备:Cyclone II  EP2C8Q208C8N  


3.实验:同步fifo数据先入先出,输入8位宽数据,输出也为8位宽数据,每三个时钟输入一个数据,数据输入同时也会自增1,直到255。


4.时序图:


5.步骤


6.代码:

fifo.v

/*
 *同步fifo
 */
module fifo(
input   wire              sys_clk   ,
input   wire     [7:0]    pi_data   ,         //输入的数据
input   wire              rd_req    ,
input   wire              wr_req    ,

output  wire              empty     ,
output  wire              full      ,
output  wire     [7:0]    po_data   ,        //出来的数据
output  wire     [7:0]    usedw              //fifo中的数据个数
);

/*
 *实例化配置的fifo IP核
 */
scfifo_8x256	scfifo_8x256_inst (
	.clock (sys_clk),
	.data  (pi_data),
	.rdreq (rd_req ),
	.wrreq (wr_req ),
           
	.empty (empty  ),
	.full  (full   ),
	.q     (po_data),
	.usedw (usedw  )
	);


endmodule

tb_fifo.v

/*
 *同步fifo仿真代码
 */
`timescale 1ns/1ns
 module tb_fifo();
 
reg             sys_clk      ;
reg             sys_rst_n    ;
reg    [7:0]    pi_data      ;
reg             rd_req       ;
reg             wr_req       ;

wire             empty        ;
wire             full         ;
wire    [7:0]    po_data      ;
wire    [7:0]    usedw        ;
               
            
reg    [1:0]    cnt          ;      //计数器,三个时钟fifo进一个数据

/*
 *初始化
 */
initial
      begin
	        sys_clk = 1'b1 ;
			  sys_rst_n = 1'b0 ;
			  #20
			  sys_rst_n = 1'b1 ;
      end	
		
always #10 sys_clk = ~ sys_clk ;     //模拟时钟

/*
 *计数器
 */
always @ (posedge sys_clk or negedge sys_rst_n) begin
     if(sys_rst_n == 1'b0)
	      cnt <= 2'd0;
	  else if(cnt == 2'd3)
	      cnt <= 2'd0;
	 else
	      cnt <= cnt + 1'b1;
end

/*
 *写请求信号(三个时钟信号一次写请求)
 */
always @ (posedge sys_clk or negedge sys_rst_n) begin
     if(sys_rst_n == 1'b0)
	      wr_req <= 1'b0 ;
	  else if(cnt == 2'd0 && rd_req == 1'b0)
	      wr_req <= 1'b1 ;
	  else
	      wr_req <= 1'b0 ;
end

/*
 *输入信号赋值(0~255)
 */
always @ (posedge sys_clk or negedge sys_rst_n) begin
     if(sys_rst_n == 1'b0)
	     pi_data <= 8'd0 ;
	  else if(pi_data == 8'd255 && wr_req == 1'b1)    //数据满
	     pi_data <= 8'd0 ;
	  else if(wr_req == 1'b1)          //数据没有满的情况下,且写请求信号到来则将写入的数据增大1
	     pi_data <= pi_data + 1'b1 ; 
	  else
	     pi_data <= pi_data ;
end

/*
 *读请求信号
 */
always @ (posedge sys_clk or negedge sys_rst_n) begin
     if(sys_rst_n == 1'b0)
	     rd_req <= 1'b0 ;
	  else if(full == 1'b1)        //数据满则发出读信号
	     rd_req <= 1'b1 ;
	  else if(empty == 1'b1)       //数据空则失能读信号
	     rd_req <= 1'b0 ;
     else
	     rd_req <= rd_req ;
end
	  
/*
 *实例化fifo模块
 */
fifo fifo_inst( 
.sys_clk     (sys_clk)    ,
.pi_data     (pi_data)    ,
.rd_req      (rd_req )    ,
.wr_req      (wr_req )    ,
                     
.empty       (empty  )    ,
.full        (full   )    ,
.po_data     (po_data)    ,
.usedw       (usedw  )    
);

endmodule

 


  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值