#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

 


相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-09 11:04:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-09 11:04:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-09 11:04:01       82 阅读
  4. Python语言-面向对象

    2024-02-09 11:04:01       91 阅读

热门阅读

  1. SQL面试题挑战15:sql实现分钟级的趋势图

    2024-02-09 11:04:01       54 阅读
  2. Debezium发布历史117

    2024-02-09 11:04:01       46 阅读
  3. Android studio 六大基本布局详解

    2024-02-09 11:04:01       48 阅读
  4. Acwing143最大异或对

    2024-02-09 11:04:01       48 阅读
  5. Vivado用ILA抓波形保存为CSV文件

    2024-02-09 11:04:01       48 阅读
  6. c#通过ExpressionTree 表达式树实现对象关系映射

    2024-02-09 11:04:01       41 阅读
  7. 38. C++ 引用的本质

    2024-02-09 11:04:01       47 阅读