FIFO的两种输出:时序输出与组合逻辑输出
来源:互联网 发布:辐射4配置文件优化 编辑:程序博客网 时间:2024/06/12 01:04
对于FIFO的输出有两种:1、输出为时序clk,这样当master发起读信号,一个clk之后有效数据才能传送到master,两个clk时master才能读取有效数据;(但对于此种也可以进行改进,让master一个clk即能读取数据:fifo的输出端保持输出将要被读取的数据,被读取后output next被读取数据,即输出端output尚未读取的数据)
2、输出为组合逻辑,当前clk内有效数据即能传送到master,一个clk时master即能读取有效数据。
下面贴出两种FIFO的code:
第一种输出为timing logic:
`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company: // Engineer: // // Create Date: 07/16/2014 01:32:23 PM// Design Name: // Module Name: round_fifo// Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision:// Revision 0.01 - File Created// Additional Comments:// //////////////////////////////////////////////////////////////////////////////////`define BUF_WIDTH 5 // BUF_SIZE = 16 -> BUF_WIDTH = 4, no. of bits to be used in pointer`define BUF_SIZE ( 1<<`BUF_WIDTH )module round_fifo( clk, rst, buf_in, buf_out, wr_en, rd_en, buf_empty, buf_full, fifo_counter );input rst, clk, wr_en, rd_en; // reset, system clock, write enable and read enable.input [31:0] buf_in; // data input to be pushed to bufferoutput[31:0] buf_out; // port to output the data using pop.output buf_empty, buf_full; // buffer empty and full indication output[`BUF_WIDTH :0] fifo_counter; // number of data pushed in to buffer reg[31:0] buf_out;reg buf_empty, buf_full;reg[`BUF_WIDTH :0] fifo_counter;reg[`BUF_WIDTH -1:0] rd_ptr, wr_ptr; // pointer to read and write addresses reg[31:0] buf_mem[`BUF_SIZE -1 : 0]; // always @(fifo_counter)begin buf_empty = (fifo_counter==0); buf_full = (fifo_counter== `BUF_SIZE);endalways @(posedge clk or posedge rst)begin if( rst ) fifo_counter <= 0; else if( (!buf_full && wr_en) && ( !buf_empty && rd_en ) ) fifo_counter <= fifo_counter; else if( !buf_full && wr_en ) fifo_counter <= fifo_counter + 1; else if( !buf_empty && rd_en ) fifo_counter <= fifo_counter - 1; else fifo_counter <= fifo_counter;endalways @( posedge clk or posedge rst)begin if( rst ) buf_out <= 0; else begin if( rd_en && !buf_empty ) buf_out <= buf_mem[rd_ptr]; else buf_out <= buf_out; endendalways @(posedge clk)begin if( wr_en && !buf_full ) buf_mem[ wr_ptr ] <= buf_in; else buf_mem[ wr_ptr ] <= buf_mem[ wr_ptr ];endalways@(posedge clk or posedge rst)begin if( rst ) begin wr_ptr <= 0; rd_ptr <= 0; end else begin if( !buf_full && wr_en ) wr_ptr <= wr_ptr + 1; else wr_ptr <= wr_ptr; if( !buf_empty && rd_en ) rd_ptr <= rd_ptr + 1; else rd_ptr <= rd_ptr; endendendmodule
2、输出为组合逻辑,并且此处buf_out即是next output data,master直接读取,rd_en只是控制fifo更新next output data
`define BUF_WIDTH 5 // BUF_SIZE = 16 -> BUF_WIDTH = 4, no. of bits to be used in pointer`define BUF_SIZE ( 1<<`BUF_WIDTH )module round_fifo( clk, rst, buf_in, buf_out, wr_en, rd_en, buf_empty, buf_full, fifo_counter );input rst, clk, wr_en, rd_en; // reset, system clock, write enable and read enable.input [31:0] buf_in; // data input to be pushed to bufferoutput[31:0] buf_out; // port to output the data using pop.output buf_empty, buf_full; // buffer empty and full indication output[`BUF_WIDTH :0] fifo_counter; // number of data pushed in to buffer reg buf_empty, buf_full;reg[`BUF_WIDTH :0] fifo_counter;reg[`BUF_WIDTH -1:0] rd_ptr, wr_ptr; // pointer to read and write addresses reg[31:0] buf_mem[`BUF_SIZE -1 : 0]; // always @(fifo_counter)begin buf_empty = (fifo_counter==0); buf_full = (fifo_counter== `BUF_SIZE);endalways @(posedge clk or posedge rst)begin //fifo_counter indicates the state of FIFO, full or empty if( rst ) fifo_counter <= 0; else if( (!buf_full && wr_en) && ( !buf_empty && rd_en ) ) fifo_counter <= fifo_counter; else if( !buf_full && wr_en ) fifo_counter <= fifo_counter + 1; else if( !buf_empty && rd_en ) fifo_counter <= fifo_counter - 1; else fifo_counter <= fifo_counter;endassign buf_out=(!buf_empty&& !rst)?buf_mem[rd_ptr] :'h0; //read out,next output data, combination logicalways @(posedge clk)begin //write in data if( wr_en && !buf_full ) buf_mem[ wr_ptr ] <= buf_in; else buf_mem[ wr_ptr ] <= buf_mem[ wr_ptr ];endalways@(posedge clk or posedge rst)begin //modify the pointer of read and write if( rst ) begin wr_ptr <= 0; rd_ptr <= 0; end else begin if( !buf_full && wr_en ) wr_ptr <= wr_ptr + 1; else wr_ptr <= wr_ptr; if( !buf_empty && rd_en ) rd_ptr <= rd_ptr + 1; else rd_ptr <= rd_ptr; endend
0 0
- FIFO的两种输出:时序输出与组合逻辑输出
- 组合数的输出
- 组合数据的输出
- 1144: 组合的输出
- 数的组合输出
- 【4005】组合的输出
- 组合的输出
- 组合的输出
- 组合的输出
- 输出组合
- 组合输出
- NOJ 1430 组合的输出 (组合数的排列,两种方法)
- 字符串的排列输出 和组合输出
- 组合逻辑与时序逻辑
- 有名管道FIFO的一个客户端输出
- POJ输出状态的逻辑。
- 输出1234的所有组合
- 组合的输出 解题报告
- 【Arduino】开发入门教程【一】什么是Arduino
- Python实现堆栈和队列<转>
- uva 442(线性表)
- Windows下cocos2dx-v3.1 Android开发环境的配置和项目编译
- java工程从SVN上down下来的问题解决
- FIFO的两种输出:时序输出与组合逻辑输出
- SVN签入
- 豪华版飞机大战系列(四)
- jQuery的选择器中的通配符[id^='code']
- Btrfs文件系统使用说明 .
- 我的苹果5S丢了关机了还能定位找回吗
- [Python]面向对象编程之描述符(Descriptors)
- 求二进制数中1的个数
- UVA 1252 Twenty Questions | dp_状态压缩