同步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                     rd_empty ,
15                     wr_en ,
16                     rd_en
17                     );
18
19
20 input  clock ,reset ;
21 input  [15:0] in_data ; // 写入的数据
22 input         wr_en  ; //写使能
23 input         rd_en  ; //读使能
24
25 output  [15:0] ou_data ; // 读出的数据
26 output         wr_full ;  //写满标志
27 output         rd_empty ;  //读空标志
28
29 wire [4:0]  add_head; //ram地址头,当读使能有效+1
30 wire [4:0]  add_end ; //ram地址尾,当写使能有效+1
31
32 //---------ram 模块,用来存储数据和输出数据--------------------------
33 data_memory  U1_mem(
34                             .clock (clock),
35                             .reset (reset),
36                             .wr_en  (wr_en),
37                             .rd_en  (rd_en),
38                             .add_head (add_head) ,
39                             .add_end (add_end),
40                             .in_data (in_data),
41                             .ou_data (ou_data)
42                             );
43
44 //------------地址产生器 + 标志产生器---------------------------------
45 fifo_control U2_cont(
46                             .clock (clock),
47                             .reset (reset),
48                             .wr_en (wr_en),
49                             .rd_en (rd_en),
50                             .wr_full (wr_full),
51                             .rd_empty (rd_empty),
52                             .add_head (add_head),
53                             .add_end (add_end)
54                             );
55
56
57 endmodule 
 1 module  data_memory (
 2                             clock ,reset ,
 3                             wr_en  ,  rd_en  ,
 4                             add_head ,add_end ,
 5                             in_data ,ou_data
 6                             );
 7   input           clock ,reset ; // system clock and system reset
 8   input           wr_en  ;     // write enable
 9   input           rd_en ;      // read enable
10   input   [4:0]   add_head ;  // memory address head
11   input   [4:0]   add_end ;   // memory address end
12   input     [15:0]in_data ;   // data input to memory
13   output    reg[15:0]ou_data ;   // data output
14
15   reg [15:0] mem [0:31]  ;   //define the memory
16   always @ (posedge clock )
17         if(!reset)
18                 begin
19                         ou_data  <=  16‘dx ;
20                 end
21         else
22                 begin
23                         case ({wr_en, rd_en})
24                             2‘b00  :  ou_data       <=  16‘dx ;
25                             2‘b01  :  ou_data       <=  mem[add_head] ;
26                             2‘b10  :  mem[add_end] <=  in_data ;
27                             2‘b11  :  begin
28                                                 ou_data       <=  mem[add_end] ;
29                                                 mem[add_head] <=  in_data ;
30                                          end
31                         endcase
32                 end
33
34 endmodule 
 1 module fifo_control (
 2                             clock ,reset ,
 3                             wr_en ,rd_en ,
 4                             wr_full ,rd_empty,
 5                             add_head,add_end
 6                             );
 7   input            clock ,reset ;   // system clock and system reset
 8   input            wr_en ;          // write enable
 9   input            rd_en  ;         // read  enable
10   output reg       wr_full ;        // fifo full flag
11   output reg       rd_empty ;       // fifo empty
12   output reg [4:0] add_head  ,add_end ;
13
14  reg  [4:0] head_temp , end_temp ;
15  //------地址产生块,依据读写使能进行相应地址递增,并保存原始的位置信息-----------------------
16   always @ (posedge clock)
17         if(!reset)
18                 begin
19                         head_temp <=   5‘d0  ;
20                         end_temp  <=   5‘d0  ;
21                         add_head  <=   5‘d0  ;
22                         add_end   <=   5‘d0  ;
23                 end
24
25         else
26                 begin
27                         case ({wr_en, rd_en})
28                                 2‘b00  :   begin
29                                                         head_temp  <=  add_head  ;
30                                                         end_temp   <=  add_end   ;
31                                               end
32                                 2‘b01  :   begin
33                                                         end_temp  <=   add_end ;
34                                                         add_head  <=   add_head + 5‘d1 ;
35                                               end
36                                 2‘b10  :   begin
37                                                         head_temp <=   add_head ;
38                                                         add_end   <=   add_end  + 5‘d1 ;
39                                               end
40                                 2‘b11  :   begin
41                                                         add_head  <=  add_head  +  5‘d1  ;
42                                                         add_end   <=  add_end   +  5‘d1  ;
43                                               end
44                         endcase
45                 end
46
47 //--------标志产生块-------------------
48   always @ (posedge clock)
49         if(!reset)
50                 begin
51                         wr_full   <=   1‘d0  ;
52                         rd_empty  <=   1‘d0  ;
53                 end
54         else
55                 begin
56                         case ({wr_en , rd_en})
57                                 2‘b00 :  begin
58                                                     rd_empty  <=  1‘d0 ;
59                                                     wr_full   <=  1‘d0 ;
60                                         end
61                                 2‘b01 :  begin
62                                                     wr_full  <=  1‘d0 ; //写标志复位
63                                                     if ((add_head +  5‘d1) == head_temp)
64                                                             rd_empty  <=  1‘d1 ; //只有切换到写使能才复位
65                                         end
66                                 2‘b10 :  begin
67                                                     rd_empty  <=  1‘d0 ; //读标志复位
68                                                     if ((add_end +  5‘d1) == end_temp)
69                                                             wr_full  <=  1‘d1 ; //只有切换到读使能才复位
70                                         end
71                                 2‘b11 : begin
72                                                     rd_empty  <=  1‘d0 ;
73                                                     wr_full   <=  1‘d0 ;
74                                         end
75                         endcase
76                 end
77
78
79 endmodule

下面附上测试代码

 1 `timescale  1ns/1ps
 2
 3 module test2_tb ;
 4 reg clock ,reset ;
 5 reg [15:0] in_data ;
 6 reg        wr_en ;
 7 reg        rd_en ;
 8
 9 wire [15:0] ou_data ;
10 wire        wr_full ;
11 wire        rd_empty ;
12
13
14 test2  U_top (
15                     .clock (clock),
16                     .reset (reset),
17                     .in_data (in_data),
18
19                     .ou_data (ou_data),
20                     .wr_full (wr_full),
21                     .rd_empty (rd_empty),
22                     .wr_en (wr_en),
23                     .rd_en (rd_en)
24                     );
25
26 integer i ;
27
28 always #10  clock = ~clock ;
29
30 initial
31     begin
32             clock =1‘d0 ;   reset = 1‘d0  ;   wr_en <= 1‘d0 ;  rd_en  <= 1‘d0 ;
33             in_data = 16‘d0 ;
34             #20 reset = 1‘d1 ; wr_en <= 1‘d1 ;
35           for (i=0;i<40;i=i+1) // 故意溢出
36                 #20 in_data  <=  in_data + 16‘d1 ;
37
38             rd_en  <=  1‘d1 ; wr_en <= 1‘d0 ;
39             #(40*20 ) // 让读空标志位触发
40             $stop   ;
41
42     end
43
44 endmodule 
时间: 2024-10-01 06:06:06

同步fifo的verilogHDL设计实例的相关文章

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

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

同步FIFO设计Spec

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

08-FPGA状态机设计实例——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线--普利斯队长精心奉献 ? 实验目的:1.学习状态机的相关概念 2.理解一段式.两段式以及三段式状态机的区别以及优缺点 实验平台:芯航线FPGA核心板 实验原理: 状态机全称是有限状态机(finite-state machine,缩写:FSM)是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型. 状态机分为摩尔(Moore)型有限状态机与米利(Mealy)型有限状态机.摩尔状态机输出是只由输入确定的有限状态机(不直接依赖于当前状态).米利有限状态机的输出不止与其输入有关还于它的

同步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的内部存储单元是常见

分立元件封装尺寸及PCB板材工艺与设计实例

分立元件封装尺寸 inch mm (L)mm (w)mm (t)mm (a)mm (b)mm 0201 0603 0.6±0.05 0.30±0.05 0.23±0.05 0.10±0.05 0.60±0.05 0402 1005 1.00±0.10 0.50±0.10 0.30±0.10 0.20±0.10 0.25±0.10 0603 1608 1.60±0.15 0.80±0.15 0.40±0.10 0.30±0.20 0.30±0.20 0805 2012 2.00±0.20 1.25

Objective-C - 类的设计实例

类的设计 1.类的设计: 1> 类名 * 类名的第一个字母必须是大写 * 不能有下划线 * 多个英文单词,用驼峰标识 2> 属性 3> 行为(功能) 2.植物大战僵尸的僵尸 * 类名:Zoombie * 属性:life.speed.gongjili * 行为:walk.bite.die 3.雷电的飞机 * 类名:Plane * 属性:life.gongjili.speed.bombCount * 行为:fly.bomb.shoot.die 4.电脑 * 类名:Computer * 属性:

同步FIFO学习笔录--

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