同步fifo

fifo 为 先进先出缓存电路。按所需的时钟可以分为异步fifo(读写时钟频率或相位不相同)和同步fifo(读写时钟相同),其有按一个深度进行读写的,也有连续读写一块的,有读写位宽一致的,也有读写位宽是倍数关系的。

好的fifo设计的基本要求是:写满而不溢出,读空又不多读。

1.同步fifo的设计


下图为一个fifo的整体结构。根据此结构,写如下代码;

`define DATATH 32
module sfifo_top(
				input clk,
				input rst_n,
				input wr_en,
				input rd_en,
				input  [`DATATH-1:0] wrdata,
				output [`DATATH-1:0] rddata);

wire valid_wr,valid_rd,empty,full;				
ctr	ctrl(
			 .clk(clk),
			 .rst_n(rst_n),
			 .wr_en(wr_en),
		    .rd_en(rd_en),
			 .valid_wr(valid_wr),
			 .valid_rd(valid_rd),
			 .empty(empty),
			 .full(full),
			 .cnt());
			 
wire [2:0] grdptr;		 
rdptr   rdptrl(
			  .clk(clk),
			  .rst_n(rst_n),
			  .valid_rd(valid_rd),
			  .grdptr(grdptr));
			  
wire [2:0] gwrptr;		 
wrptr   wrptrl(
			  .clk(clk),
			  .rst_n(rst_n),
			  .valid_wr(valid_wr),
			  .gwrptr(gwrptr));
			  
ram32x8 ram32x8(
			 .clk(clk),
			 .rst_n(rst_n),
			 .rd_en(valid_rd),
			 .rdaddr(grdptr),
			 .wr_en(valid_wr),
			 .wraddr(gwrptr),
			 .wrdata(wrdata),
			 .rddata(rddata));
endmodule
	
此代码为sfifo的顶层模块。基本结构与上图相符合。

同步fifo的读写时钟为相同的,即读写地址是同步的。通过判断fifo中已经存在多少个没有被读走的数据,来判断读空还是写满了,即用一个计数器来记录其数据数,用来判断写满还是空。

a:当fifo进行读但不写时,计数器减一;当fifo进行写但不读时,自增加1.

b:当fifo即不进行读也不进行写时,则该计数器保持不变。

`define EMPTY 0
`define FULL 8


module ctr(
			input clk,
			input rst_n,
			input wr_en,
			input rd_en,
			output reg valid_wr,
			output reg valid_rd,
			output empty,
			output full,
			output reg [2:0]cnt);
			
	assign empty =  cnt == `EMPTY;
	assign full = cnt == `FULL;

		
	always @(posedge clk or negedge rst_n)begin
		if(!rst_n)begin
			cnt <= 3'd0;
			valid_wr <= 1'b0;
			valid_rd <= 1'b0;
		end
		else if(wr_en&&!full)begin
			valid_wr <= 1'b1;
			cnt <= cnt+1'b1;
		end
		else if(rd_en&&!empty)begin
			valid_rd <= 1'b1;
			cnt <=cnt - 1'b1;
		end
		else if(!wr_en&&!rd_en)begin
			cnt <= cnt;
			valid_wr <= 1'b0;
			valid_rd <= 1'b0;
		end
		else begin
			cnt <= 3'd0;
			valid_wr <= 1'b0;
			valid_rd <= 1'b0;
		end
	end
endmodule	

读写地址产生都比较简单,通过产生的读写有效信号,来促使地址加一。

`define ADDRTH 3
module wrptr(
			input clk,
			input rst_n,
			input valid_wr,
			output reg [`ADDRTH-1:0] gwrptr
			);
	
always @(posedge clk or negedge rst_n)begin
	if(!rst_n)
		gwrptr <= 3'b0;
	else if(valid_wr)
		gwrptr <= gwrptr +1'b1;
	else 
		gwrptr <= gwrptr;
end
endmodule

`define ADDRTH 3
module rdptr(
			input clk,
			input rst_n,
			input valid_rd,
			output reg [`ADDRTH-1:0] grdptr);
	always @(posedge clk or negedge rst_n)begin
		if(!rst_n)
			grdptr <= 3'b0;
		else if(valid_rd)
			grdptr <= grdptr +1'b1;
		else
			grdptr <= grdptr;
		end
endmodule

最后是一个简但的ram32x8

`define ADDRTH 3
`define DATATH 32
`define DEPTH 8
		
module ram32x8(
			input clk,
			input rst_n,
			input rd_en,
			input [`ADDRTH-1:0]rdaddr,
			input wr_en,
			input [`ADDRTH-1:0]wraddr,
			input [`DATATH-1:0] wrdata,
			output reg [`DATATH-1:0] rddata);
			
	reg [`DATATH-1:0] mem [`DEPTH-1:0] ;
	
 always @(posedge clk or negedge rst_n)begin
	if(~rst_n)
		rddata <= 32'b0;
	else if(rd_en)
		rddata <= mem[rdaddr];
	else rddata<=rddata;
 end
 
 always @(posedge clk or negedge rst_n)begin
	if(~rst_n)
		mem[wraddr] <= 32'b0;
	else if(wr_en)
		mem[wraddr] <= wrdata;
	else 
		mem[wraddr] <= mem[wraddr];
end
endmodule

上图为在xilinx 的ise下综合的RTL级



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA 同步 FIFO 是一种用于在 FPGA 设备中实现数据缓冲和数据转移的组件。它由一个读取指针和一个写入指针组成,可以实现读写操作的同步和互斥。 使用 FPGA 同步 FIFO 的一个常见场景是在不同率的数据传输之间进行数据缓冲和同步。当输入以不同率产生数据时,为了保证数据的可靠传输和处理,可以使用同步 FIFO 来缓冲输入数据,并在输出端以相同或不同率读取数据。 FPGA 同步 FIFO 的实现可以采用 FPGA 内部的存储单元,如 Block RAM 或 Distributed RAM。写入操作将数据写入 FIFO 的写入指针所指向的位置,并将写入指针前移。读取操作将数据从 FIFO 的读取指针所指向的位置读取出来,并将读取指针前移。读写指针的移动是同步的,以保证数据的正确性和完整性。 FPGA 同步 FIFO 的大小通常取决于数据传输的需求和 FPGA 设备的资源限制。可以根据数据产生和处理的速度来确定 FIFO 的大小,并且需要根据需要调整读写指针的顺序和移动策略,以满足数据的传输需求。 尽管 FPGA 同步 FIFO 在数据传输中起到了重要的作用,但同时也会增加设计的复杂性和资源消耗。在使用 FPGA 同步 FIFO 时,需要注意处理数据的同步和互斥问题,以及避免出现数据丢失、溢出等异常情况。 总之,FPGA 同步 FIFO 是一种用于实现数据缓冲和转移的组件,在不同率的数据传输中发挥了关键作用。它可以通过读写指针的同步移动来保证数据的可靠性和完整性,并且可根据需求和硬件资源进行灵活调整。但同时也需要注意处理同步和互斥问题,以确保数据的正确传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值