只有一个元素的异步FIFO

59 篇文章 4 订阅
54 篇文章 5 订阅
module one_entry_fifo #(parameter dw=16 )(

        input	rd_clk, wr_clk, rd_rst_n,wr_rst_n,we,re,

        input	[dw-1:0]	d ,reset_value,

        output	reg [dw-1:0]	q ,

        output	 reg  empty , full 

    );

    //synopsys sync_set_reset "rd_rst_n,wr_rst_n"

wire legal_wr  =  we  &(~full);

wire legal_rd  =  re & (~empty) ;

reg wr_ptr ,rd_ptr ;// only one bit !

reg wr_ptr_r,wr_ptr_rr; 

reg rd_ptr_r,rd_ptr_rr; 







always @(posedge rd_clk)wr_ptr_r <=wr_ptr;

always @(posedge rd_clk)wr_ptr_rr <=wr_ptr_r; 




always @(posedge wr_clk)rd_ptr_r <= rd_ptr;

always @(posedge wr_clk)rd_ptr_rr <= rd_ptr_r; 




always @(posedge rd_clk)if( wr_ptr_rr == rd_ptr ) empty<=1;else empty <= legal_rd ; 

always @(posedge wr_clk)if( rd_ptr_rr != wr_ptr ) full<=1 ;else full <= legal_wr ; 




always @(posedge rd_clk)if (~rd_rst_n)  rd_ptr <= 0;else  if ( legal_rd ) rd_ptr <= ~ rd_ptr ;

always @(posedge wr_clk)if (~wr_rst_n)  wr_ptr <= 0;else  if ( legal_wr ) wr_ptr <= ~ wr_ptr ;




reg [dw-1:0] buff ;  always @(posedge wr_clk)if ( legal_wr ) buff <= d ;

always @(posedge rd_clk)if ( ~rd_rst_n ) q <= reset_value ;else if ( legal_rd ) q <= buff; 







endmodule

 

因为只有一个元素,所以避免了使用格雷码来传递计数器。
应用场合:
1 ,跨时钟区域的信号,数据传递。
2,结合单时钟FIFO组成更大的容量的异步FIFO(和同步FIFO连接时候注意空和满标志的处理)。

异步 FIFO 是一种基于硬件或软件实现的数据结构,用于在不同的时钟域之间传递数据,它可以在一个时钟域中接受数据,然后在另一个时钟域中输出相同的数据。下面是一个简单的异步 FIFO 的实现: ```python class AsyncFIFO: def __init__(self, depth): self.depth = depth self.data = [0] * depth self.read_ptr = 0 self.write_ptr = 0 self.count = 0 async def write(self, data): while self.count == self.depth: await asyncio.sleep(0) self.data[self.write_ptr] = data self.write_ptr = (self.write_ptr + 1) % self.depth self.count += 1 async def read(self): while self.count == 0: await asyncio.sleep(0) data = self.data[self.read_ptr] self.read_ptr = (self.read_ptr + 1) % self.depth self.count -= 1 return data ``` 这个异步 FIFO 使用了一个循环缓冲区来存储数据,当缓冲区满时,写入操作将会被阻塞,直到有空间可用。当缓冲区为空时,读取操作将会被阻塞,直到有数据可用。注意到异步 FIFO 使用了 async/await 语法,这使得它可以与异步程序一起使用,例如 asyncio 库。 使用异步 FIFO 的示例代码如下: ```python async def producer(fifo): for i in range(10): await fifo.write(i) print(f"producer write: {i}") await asyncio.sleep(0.1) async def consumer(fifo): for i in range(10): data = await fifo.read() print(f"consumer read: {data}") await asyncio.sleep(0.2) async def main(): fifo = AsyncFIFO(depth=5) tasks = [asyncio.create_task(producer(fifo)), asyncio.create_task(consumer(fifo))] await asyncio.gather(*tasks) asyncio.run(main()) ``` 这个示例程序使用了两个协程,一个生产者协程和一个消费者协程,它们分别写入和读取数据到异步 FIFO 中。控制台输出如下: ``` producer write: 0 producer write: 1 producer write: 2 producer write: 3 producer write: 4 consumer read: 0 producer write: 5 consumer read: 1 producer write: 6 consumer read: 2 producer write: 7 consumer read: 3 producer write: 8 consumer read: 4 producer write: 9 consumer read: 5 consumer read: 6 consumer read: 7 consumer read: 8 consumer read: 9 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值