集安网站建设,天津抖音seo,注册万网后网站怎么赚钱的,餐饮管理系统下载1 FIFO相关概念 FIFO是First in first out 的缩写#xff0c;是一种先进先出的数据缓存器#xff0c;它与普通存储器的区别是没有外部读写地址线。这样使用起来就非常简单#xff0c;但缺点是只能顺序写入数据#xff0c;顺序读出数据#xff0c;其数据地址由内部读写指针…1 FIFO相关概念 FIFO是First in first out 的缩写是一种先进先出的数据缓存器它与普通存储器的区别是没有外部读写地址线。这样使用起来就非常简单但缺点是只能顺序写入数据顺序读出数据其数据地址由内部读写指针自动加1完成不能像普通的存储器那样由地址线决定读取或写入某个具体的存储单元。
2 使用FIFO的情况 FIFO 一般用于不同时钟域之间的数据传输比如一端为串行输入的图像数据另一端为处理器以并行方式读取的图像数据由于两端读写速率不一致需要先行将串行数据进行串并转换缓存写入FIFO中达到一定的条件MCU在一次性将所有缓存数据读走直到FIFO的状态变成空为止。
3 FIFO相关的一些参数及端口信号 FIFO的宽度它指的是FIFO一次读写操作的数据位专用FIFO芯片的宽度是固定的也有可选择的如果用FPGA自己实现一个FIFO其数据位也就是宽度可以自己定义。 FIFO的深度它指的是FIFO可以存储多少个N位的数据。如1个8位的FIFO深度是16那就是可以存储16个8位的数据深度为1024就可以存储1024个8位的数据。 满标志输出信号FIFO已经满的时候由FIFO的状态电路送出一个信号以阻止继续向FIFO中写数据照成溢出。 空标志输出信号FIFO已空的时候由FIFO的状态电路送出一个信号以阻止继续从FIFO中读出数据而造成无效数据的读出。 读使能输入信号读出数据时的使能信号 读时钟输入信号读数据时所需要的时钟信号在每个有效时钟沿来临时如果读使能信号有效则读数据。 读出数据输出信号读操作时反映在输出端口上的有效数据。 写使能输入信号写入数据时的使能信号 写时钟写入数据所需要的时钟 写入数据输入信号待写入数据写操作时将端口上的数据写入FIFO。 读指针指向下一个要读出的数据的存储单元的地址读完后自动加1 写指针指向下一个要写入数据的存储单元的地址写完后自动加1
读写指针其实就是读写的地址只不过这个地址不是任意选择而是连续的。
4 FIFO的分类 根据FIFO工作的时钟域可以将FIFO分为同步FIFO和异步FIFO。同步FIFO是指读时钟和写时钟为同一个时钟异步FIFO是指读写时钟不一致是相互独立的。
5 设计指标 FIFO
分别实现同步和异步FIFOFIFO深度为1024宽度为8FIFO的实现基于FPGA内的双端口RAM而非寄存器
6 代码设计
module fifo_serial(clk,wen,rst,full,empty,data_in,data_out
);input clk; // 外部输入时钟input wen; // 外部输入写使能低有效input ren; // 外部输入读使能低有效input rst; // 外部输入复位信号低有效input [7:0]data_in; // 外部输入待写入数据output full;output empty;output [7:0] data_out; // 外部读出的数据reg [9:0] waddr;reg [9:0] raddr;reg [10:0] count;// FIFO中有效数据个数如果为0则FIFO为空状态如果为1024则FIFO为满状态wire wen_wire;wire ren_wire;// 在写使能并且没有满的情况下写指针加1如果已经满了则写指针不变always(posedge clk or negedge rst)if(rst1b0) waddr 10d0;else if(wen 1b0 full ! 1b1)waddr waddr 1b1;else waddr waddr;// 在读使能并没有空的情况下读指针加1如果已经满了则读指针不变 always(posedge clk or negedge rst)if(rst 1b0)raddr 10d0;else if(ren 1b0 empty ! 1b1)raddr raddr 1b1;elseraddr raddr;// 从上面这段代码产生FIFO内有效数据计数器always(posedge clk or negedge rst)if(rst 1b0)count 11d0;else begincase({wen, ren})2b00:begincount count;end2b01:beginif(full 1b0)count count 1;elsecount count;end 2b10:beginif(empty 1b0)count count 1;elsecount count;enddefault:begincount count;endendcaseend// FIFO 中有效数据个数如果为0则FIFO为空状态
assign empty(count11d0)?1b1:1b0;// FIFO 中有效数据个数如果为1024则FIFO为满状态
assign full (count11d1024)?1b1:1b0;// 在写使能有效并且已经满的情况下不产生对双端口RAM的写操作
assign wen_wire (full 1b1)? 1b1:wen;// 在读使能有效并且已经空的情况下不产生对双端口RAM的读操作
assign ren_wire (empty 1b1)?1b1:ren;// 下面为例化的双端口RAM
dpram1k u1(.WD(data_in),.RD(data_out),.WEN(wen_wire),.REN(ren_wire),.WADDR(waddr),.RADDR(raddr),.RWCLK(clk),.RESET(rst)
);