同步FIFO的设计

 1 module scfifo #(
 2     parameter    ND    = 16,
 3     parameter    DW    = 16 ) (
 4     input                clk,
 5     input                rst_n,
 6     input                wren,
 7     input                rden,
 8     input    [DW-1:0]    din,
 9     output    [DW-1:0]    dout,
10     output                full,
11     output                empty
12 );
13
14 localparam    AW    =    $clog2(ND);
15
16 // Memory Registers
17 reg        [DW-1:0]    mem[ND-1:0];
18 reg        [AW-1:0]    wadr, radr;
19 reg                    wr_full;
20 reg                    rd_empty;
21
22 // Write Memory Data
23 always@(posedge clk)
24     if(wren & ~wr_full) mem[wadr] <= din;
25
26 // Write Pointer
27 always@(posedge clk, negedge rst_n)
28 begin
29     if(~rst_n)
30         wadr <= ‘d0;
31     else begin
32         if(wren & ~wr_full)
33             wadr <= wadr + 1‘d1;
34     end
35 end
36
37 // Read Pointer
38 always@(posedge clk, negedge rst_n)
39 begin
40     if(~rst_n)
41         radr <= ‘d0;
42     else begin
43         if(rden & ~rd_empty)
44             radr <= radr + 1‘d1;
45     end
46 end
47
48 // Write Full Status
49 always@(posedge clk, negedge rst_n)
50 begin
51     if(~rst_n)
52         wr_full <= 1‘b0;
53     else begin
54         if(~rden & wren && (wadr == radr - 1‘d1) || (~|radr && &wadr))
55             wr_full <= 1‘b1;
56         else if(rden & wr_full)
57             wr_full <= 1‘b0;
58     end
59 end
60
61 // Read Empty Status
62 always@(posedge clk, negedge rst_n)
63 begin
64     if(~rst_n)
65         rd_empty <= 1‘b0;
66     else begin
67         if(rden & ~wren && (radr == wadr - 1‘d1) || (~|wadr && &radr))
68             rd_empty <= 1‘b1;
69         else if(wren & rd_empty)
70             rd_empty <= 1‘b0;
71     end
72 end
73
74 // Read Data and FIFO Status
75 assign    dout    =    mem[radr];
76 assign    full    =    wr_full;
77 assign    empty    =    rd_empty;
78
79 endmodule

原文地址:https://www.cnblogs.com/lyuyangly/p/8547043.html

时间: 2024-10-12 07:34:16

同步FIFO的设计的相关文章

【设计开发】 典型同步电路设计- 同步FIFO

一.前言 FIFO (First-In-First-Out) 是一种先进先出的数据交互方式,在数字ASIC设计中常常被使用.FIFO按工作时钟域的不同又可以分为:同步FIFO和异步FIFO. 同步FIFO的写时钟和读时钟为同一个时钟,FIFO内部所有逻辑都是同步逻辑,常常用于交互数据缓冲.异步FIFO的写时钟和读时钟为异步时钟,FIFO内部的写逻辑和读逻辑的交互需要异步处理,异步FIFO常用于跨时钟域交互. 本文介绍同步FIFO的典型设计方法. 二.原理 典型同步FIFO有三部分组成: (1)

同步fifo的verilogHDL设计实例

原创 设计一个fifo,输入16bit,输出16bit的data,寻址宽度5bit,有空满标志. top 层如下所示: 1 /* 2 date : 2014/10/14 3 version : modelsim 10.1e-altera 4 design : pengxiaoen 5 function : 同步fifo设计 6 */ 7 module test2 ( 8 clock , 9 reset, 10 in_data , 11 12 ou_data , 13 wr_full , 14 r

同步FIFO设计Spec

为什么要写Spec文档: 记得刚进公司实习的时候,导师安排我写一个SM4算法AHB接口模块,要求写代码前 写出详细的设计文档,详细到什么程度呢,看着文档就能把代码写好,作为一个只 在学校写过数字钟的小白来说有点不太理解,后面看的Spec多了,好的Spec的确能够看 着Spec把代码给敲了,能够方便别人理解你的设计思路,特别是当你遇到一份注释不太 清楚,逻辑难懂的代码时,是多么渴望来一份Spec帮助理解. 网页上编辑图和格式不是很方便,就写的简单点吧 1.同步FIFO(First In First

同步FIFO的verilog描述

1 /****************************************************** 2 A fifo controller verilog description. 3 ******************************************************/ 4 module fifo(datain, rd, wr, rst, clk, dataout, full, empty); 5 input [7:0] datain; 6 input

Verilog学习笔记简单功能实现(八)...............同步FIFO

Part 1,功能定义: 用16*8 RAM实现一个同步先进先出(FIFO)队列设计.由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出.写入和读出的操作(高电平有效)由时钟的上升沿触发.当FIFO的数据满和空的时候分别设置相应的高电平加以指示.FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,它与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成

同步FIFO design and IP level verification

一.前言 应聘IC前端相关岗位时,FIFO是最常考也是最基本的题目.FIFO经常用于数据缓存.位宽转换.异步时钟域处理.随着芯片规模的快速增长,灵活的system verilog成为设计/验证人员的基本功.本文从简易版的同步FIFO开始,熟悉IP设计与验证的基础技能. 二.IP设计 FIFO这一IP核已经相当成熟,因此网上资料也是一抓一大把.其中笔者认为较好的一个在文末附录中,需要详细了解FIFO工作原理的朋友可以仔细看看.这里简单介绍下本文设计FIFO的原理与结构.FIFO的内部存储单元是常见

同步FIFO学习笔录--

同步FIFO学习 1.撰写缘由 这几天在初步学习verilog,学习到了同步FIFO,写点东西记录一下,写写心得体会和大家一起交流学习,中间有不对的地方希望大家能多多包涵,欢迎指正,共同进步.学习时主要参考:https://www.cnblogs.com/SYoong/p/6108780.html,感谢大神的分享.本文与参考有些不同,其中我自己认为有些需要改动的地方,若不对,多多指正.其实同步FIFO在实际中应用很少,应用多的还是异步FIFO,不过作为一个新手拿来练习练习感觉是很不错的. 2.什

Verilog实现同步FIFO

作为实现RS232串行通信的Verilog实现的预备工作,使用Verilog实现了同步FIFO的功能,其代码段如下 //this program segment realize the function of fifo IPcore //synchronous fifo module fifo_ip #( parameter Addr_Width=8,Bit_Width=8 ) (clk,rst,wren,rden,full,empty,din,dout,counter); input clk,

Java中的闪光点:ThreadLocal是线程Thead的局部变量,可替代同步机制的设计,值得学习和研究

线程局部变量ThreadLocal,是Java支持的一种线程安全机制,目的是解决多线程的并发问题. 具体来讲,就是多个线程访问该实例对象的变量时,该实例对象将其存储为键值对的形式,保证各个线程(键)分别对应一份该变量值(值),从而保证多线程变量值得安全访问. ThreadLocal与同步机制比较 同步机制:用锁机制保证同一时间只有一个线程访问变量(用时间换空间),变量是多线程共享的,设计时要缜密分析什么时候读写?什么时候锁定?什么时候释放? ThreadLocal:提供每个线程一个独立的变量副本