同步FIFO设计
来源:互联网 发布:js object tostring 编辑:程序博客网 时间:2024/05/21 16:56
同步FIFO设计:
FIFO(first in first out)可以由其名称理解为先入先出储存器,其设计即为双口RAM,其外部没有读写地址线,写入时按照顺序写入,读取时同样按照顺序将先写入的先读出来,后再将后写入的按顺序读出。
依照以上设计思想,首先需主体寄存器80个,每8个为一组,并行输入一组8个数据。当写入时先写入[7:0]这低位8个寄存器,随后一个时钟周期内移位至高八位内,再在低8位中存入数据。以此可实现循环储存。在代码实现部分使用拼接符 { } 来实现移位。
再读取时,同样先读取最先进入的,所以在设计中加入了一个计数器来计算移位次数,使每次读取时可以从最先开始的数据位输出。在读取和输入都是用状态机来实现。
无论是在读取时还是写入时,每一次数据位的增减都经过判断,输入/输出,移位三步在3个时钟周期内完成,所以数据的保持时间为3倍的系统时间。
module FIFO_ctrl( clk, rst_n, fifo_wr_en, fifo_rd_en, fifo_full, fifo_empty, fifo_wr_data, fifo_rd_data, fifo_data_num ); input clk; input rst_n; input fifo_wr_en; input fifo_rd_en; input [7:0] fifo_wr_data; output fifo_full; output fifo_empty; output reg [7:0] fifo_rd_data; output reg [6:0] fifo_data_num; reg [3:0] fifo_rd_addr; reg [3:0] fifo_wr_addr; wire fifo_wr_cen; wire fifo_rd_cen; reg [79:0] fifo_mem; reg [1:0] rd_state; reg wr_state; // reg [4:0] wr_cnt;// reg [4:0] rd_cnt; reg [4:0] cnt; // always@(*)begin// rd_cnt <= 4'd9 - wr_cnt;// end always@( posedge clk or negedge rst_n) begin if( ! rst_n ) begin cnt <= 4'd0; rd_state <= 2'd0; wr_state <= 1'd0; end else if (fifo_wr_cen) begin case( wr_state ) 1'd0 : begin fifo_mem[7:0] <= fifo_wr_data; wr_state <= 1'd1; rd_state <= 2'd0; end 1'd1 : begin fifo_mem <= { fifo_mem[71:0],fifo_mem[79:72]}; cnt <= cnt + 1'd1; wr_state <= 1'd0; end endcase end else if(fifo_rd_cen) begin case(rd_state) 2'd0 : begin if( ! cnt) begin fifo_mem <= {fifo_mem[7:0],fifo_mem[79:8]}; cnt <= cnt - 1'd1; wr_state <= 1'd0; end else rd_state <= 2'd1; end 2'd1 : begin fifo_rd_data <= fifo_mem[7:0]; rd_state <= 2'd2; end 2'd2 : begin fifo_mem <= { fifo_mem[71:0],fifo_mem[79:72]}; cnt <= cnt + 1'd1; rd_state <= 2'd1; end endcase end end always @(posedge clk or negedge rst_n) begin if(! rst_n) fifo_data_num <= 7'd0 ; else if (fifo_wr_en & (~ fifo_full) & (~(fifo_rd_en & (~fifo_empty))) & (wr_state == 0)) //Valid Write Only, increase data cnt; fifo_data_num <= fifo_data_num + 4'd8 ; else if (fifo_rd_en & (~ fifo_empty) & (~(fifo_wr_en & (~fifo_full))) & (rd_state == 1)) //Valid Read Only, decrease data cnt; fifo_data_num <= fifo_data_num - 4'd8 ; end //middle wire assign fifo_empty = (fifo_data_num == 0 ) ; assign fifo_wr_cen = fifo_wr_en & (~ fifo_full) ; assign fifo_full = (fifo_data_num == 7'd80) ; assign fifo_rd_cen = fifo_rd_en & (~ fifo_empty) ; endmodule
设计的RTL图为
资源使用率
仿真图
仿真时首先写入,由于未读取,fifo_rd_data为不定值,随后读取,fifo_rd_data输出存储值。fifo_wr_data为输入值,fifo_data_num为FIFO内存留的数据位数。
通过这次设计,再次深入了解了FIFO的结构,加深了Verilog与FPGA的使用熟悉程度。设计还有很大的缺陷,占用资源过大,而却未能够真正的先入先出。
阅读全文
1 0
- 同步FIFO设计
- 同步fifo设计
- 同步FIFO设计
- 异步FIFO同步化设计
- 同步fifo
- 同步FIFO和异步FIFO
- 同步FIFO(转)
- 同步FIFO实现
- 同步FIFO理解
- Verilog同步FIFO
- 同步FIFO的编写
- 异步FIFO设计
- 异步FIFO设计方法
- STM32F4 按键FIFO设计
- 异步FIFO设计
- 同步FIFO之VHDL描述
- 同步FIFO的Verilog实现
- 同步FIFO和异步FIFO的Verilog实现
- win10 安装mysql5.7.19
- bzoj4555 [Tjoi2016&Heoi2016]求和(NTT)
- poj1330题解(最近公共祖先模板题)
- socket网络编程(3)- socket网络编程遇到的问题
- Linux 后台运行python程序
- 同步FIFO设计
- MySQL读书笔记
- eclipse下hadoop程序开发
- hdu 1231
- 题目描述 给定一个字符串,找出该字符串的最长回文子串。回文字符串指的就是从左右两边看都一样的字符串,如aba,cddc都是回文字符串。字符串abbacdc存在的回文子串有abba和cdc,因此它的最长
- C++中sizeof和结构体以及内存对其
- web.xml文件的作用及基本配置
- keras相关笔记记载
- Django基础