在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2640|回复: 5

[转贴] Asynchronous FIFO Verilog Code

[复制链接]
发表于 2020-7-4 20:19:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
异步FIFO,写的规范。




  1. //==========================================
  2. // Function : Asynchronous FIFO (w/ 2 asynchronous clocks).
  3. // Coder    : <a href="http://www.asic-world.com/" style="text-decoration-line: none;">http://www.asic-world.com/</a>
  4. // Date     : 4/Jul/2020.
  5. //=========================================

  6. `timescale 1ns/1ps

  7. module aFifo
  8.   #(parameter    DATA_WIDTH    = 8,
  9.                  ADDRESS_WIDTH = 4,
  10.                  FIFO_DEPTH    = (1 << ADDRESS_WIDTH))
  11.      //Reading port
  12.     (output reg  [DATA_WIDTH-1:0]        Data_out,
  13.      output reg                          Empty_out,
  14.      input wire                          ReadEn_in,
  15.      input wire                          RClk,        
  16.      //Writing port.         
  17.      input wire  [DATA_WIDTH-1:0]        Data_in,  
  18.      output reg                          Full_out,
  19.      input wire                          WriteEn_in,
  20.      input wire                          WClk,
  21.          
  22.      input wire                          Clear_in);

  23.     /////Internal connections & variables//////
  24.     reg   [DATA_WIDTH-1:0]              Mem [FIFO_DEPTH-1:0];
  25.     wire  [ADDRESS_WIDTH-1:0]           pNextWordToWrite, pNextWordToRead;
  26.     wire                                EqualAddresses;
  27.     wire                                NextWriteAddressEn, NextReadAddressEn;
  28.     wire                                Set_Status, Rst_Status;
  29.     reg                                 Status;
  30.     wire                                PresetFull, PresetEmpty;
  31.    
  32.     //////////////Code///////////////
  33.     //Data ports logic:
  34.     //(Uses a dual-port RAM).
  35.     //'Data_out' logic:
  36.     always @ (posedge RClk)
  37.         if (ReadEn_in & !Empty_out)
  38.             Data_out <= Mem[pNextWordToRead];
  39.             
  40.     //'Data_in' logic:
  41.     always @ (posedge WClk)
  42.         if (WriteEn_in & !Full_out)
  43.             Mem[pNextWordToWrite] <= Data_in;

  44.     //Fifo addresses support logic:
  45.     //'Next Addresses' enable logic:
  46.     assign NextWriteAddressEn = WriteEn_in & ~Full_out;
  47.     assign NextReadAddressEn  = ReadEn_in  & ~Empty_out;
  48.            
  49.     //Addreses (Gray counters) logic:
  50.     GrayCounter GrayCounter_pWr
  51.        (.GrayCount_out(pNextWordToWrite),
  52.       
  53.         .Enable_in(NextWriteAddressEn),
  54.         .Clear_in(Clear_in),
  55.         
  56.         .Clk(WClk)
  57.        );
  58.       
  59.     GrayCounter GrayCounter_pRd
  60.        (.GrayCount_out(pNextWordToRead),
  61.         .Enable_in(NextReadAddressEn),
  62.         .Clear_in(Clear_in),
  63.         .Clk(RClk)
  64.        );
  65.      

  66.     //'EqualAddresses' logic:
  67.     assign EqualAddresses = (pNextWordToWrite == pNextWordToRead);

  68.     //'Quadrant selectors' logic:
  69.     assign Set_Status = (pNextWordToWrite[ADDRESS_WIDTH-2] ~^ pNextWordToRead[ADDRESS_WIDTH-1]) &
  70.                          (pNextWordToWrite[ADDRESS_WIDTH-1] ^  pNextWordToRead[ADDRESS_WIDTH-2]);
  71.                            
  72.     assign Rst_Status = (pNextWordToWrite[ADDRESS_WIDTH-2] ^  pNextWordToRead[ADDRESS_WIDTH-1]) &
  73.                          (pNextWordToWrite[ADDRESS_WIDTH-1] ~^ pNextWordToRead[ADDRESS_WIDTH-2]);
  74.                         
  75.     //'Status' latch logic:
  76.     always @ (Set_Status, Rst_Status, Clear_in) //D Latch w/ Asynchronous Clear & Preset.
  77.         if (Rst_Status | Clear_in)
  78.             Status = 0;  //Going 'Empty'.
  79.         else if (Set_Status)
  80.             Status = 1;  //Going 'Full'.
  81.             
  82.     //'Full_out' logic for the writing port:
  83.     assign PresetFull = Status & EqualAddresses;  //'Full' Fifo.
  84.    
  85.     always @ (posedge WClk, posedge PresetFull) //D Flip-Flop w/ Asynchronous Preset.
  86.         if (PresetFull)
  87.             Full_out <= 1;
  88.         else
  89.             Full_out <= 0;
  90.             
  91.     //'Empty_out' logic for the reading port:
  92.     assign PresetEmpty = ~Status & EqualAddresses;  //'Empty' Fifo.
  93.    
  94.     always @ (posedge RClk, posedge PresetEmpty)  //D Flip-Flop w/ Asynchronous Preset.
  95.         if (PresetEmpty)
  96.             Empty_out <= 1;
  97.         else
  98.             Empty_out <= 0;
  99.             
  100. endmodule


复制代码


发表于 2020-7-8 13:51:14 | 显示全部楼层
thanks for sharing
发表于 2020-7-9 09:14:13 | 显示全部楼层
再写个同步预期fifo, 异步预取fifo 吧
发表于 2021-12-3 17:57:15 | 显示全部楼层
thanks
发表于 2021-12-3 18:55:17 | 显示全部楼层
谢谢分享
发表于 2022-4-17 17:59:21 | 显示全部楼层
感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

X

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-6-21 21:24 , Processed in 0.019925 second(s), 7 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表