欢迎光临散文网 会员登陆 & 注册

有一种方法是用异步FIFO来处理跨时钟域处理

2022-05-25 22:26 作者:大方老师单片机课堂  | 我要投稿

在进修跨时钟域处理的时候,有一种方法是用异FIFO来处理跨时钟域处理的


\\\插播一条:

自己在今年整理一套单片机单片机相关论800余篇

论文制作思维导图

原理+源代+开题报++外文资料

想要的同学私信找我。

在进修跨时钟域处理的时候,有一种方法是用异FIFO来处理跨时钟域处理的。那么在这之前先看看同FIFO实现。

所谓同FIFO,就是读写时钟是同一个时钟频次。本次实现是通过计数器的形式来实现满空标志。详细实现如下:

module fifo_sync(

input clk,

inputrst_n,

input[7:0]datain, //输写数据inputwr, //写请求inputrd, //读请求

outputreg[7:0] dataout, //输出数据outputempt, //空标志outputfull //满标);

//定义寄存reg [3:0]cnt; //计数器用于计FIFO中寄存了多少数据,方便提供满空标reg [3:0]wr_ptr, rd_ptr; //读写指reg[7:0]fifo_mem[15:0]; //168位的寄存器用于寄存数据FIFO//定义状parameter S0 = 2'b00, S1 = 2'b01, S2 = 2'b10, S3 = 2'b11;

//用一段式状态机简略实FIFOalways @(posedge clk or negedge rst_n) begin

if(!rst_n) begin

cnt

wr_ptr

rd_ptr

dataout

end

else begin

case ({rd,wr})

S0 : begin //空闲cnt

wr_ptr

rd_ptr

dataout0;

end

S1:begin//FIOFif(!full)begin

fifo_mem[wr_ptr]datain;

wr_ptrwr_ptr+1'b1;

rd_ptrrd_ptr;

cntcnt+1'b1;

dataout0;

end

end

S2:begin//FIFOif(!empt)begin

dataoutfifo_mem[rd_ptr];

rd_ptrrd_ptr+1'b1;

wr_ptrwr_ptr;

cntcnt-1'b1;

end

end

S3:begin//同时读FIFOif(!full)begin

fifo_mem[wr_ptr]datain;

wr_ptrwr_ptr+1'b1;

end

if(!empt)begin

dataoutfifo_mem[rd_ptr];

rd_ptrrd_ptr+1'b1;

end

end

default:;

endcase

endend

//满空标志信号产生assignfull=(cnt==4'd15);assignempt=(cnt==4'd0);

endmodule

简单的测试:

`timescale1ns/1nsmodulefifo_sync_tb();

regclk;regrst_n;reg[7:0]datain;regwr,rd;

wire[7:0]dataout;wireempt;wirefull;

initialbeginclk=1'b1;rst_n=1'b0;datain=0;wr=1'b0;rd=1'b0;#50rst_n=1'b1;#40wr=1'b1;#20rd=1'b1;#20rd=1'b0;#170wr=1'b0;#200rd=1'b1;#40rd=1'b0;#500$stop;end

always#5clk=~clk;

always@(posedgeclk)begin

dataindatain+1'b1;end

fifo_syncfifo(

.clk(clk),

.rst_n(rst_n),

.datain(datain),//输入数据.wr(wr),//写请求.rd(rd),//读请求

.dataout(dataout),//输出数据.empt(empt),//空标志.full(full)//


【文章福利】:小编整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!~点击绿色通讯软件搜airuimcu加入。

有一种方法是用异步FIFO来处理跨时钟域处理的评论 (共 条)

分享到微博请遵守国家法律