⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 async_fifo.v.bak

📁 ddr ram controller vhdl code
💻 BAK
字号:
//========================================== 2 // Function : Asynchronous FIFO (w/ 2 asynchronous clocks). 3 // Coder    : Alex Claros F. 4 // Date     : 15/May/2005. 5 // Notes    : This implementation is based on the article  6 //            'Asynchronous FIFO in Virtex-II FPGAs' 7 //            writen by Peter Alfke. This TechXclusive  8 //            article can be downloaded from the 9 //            Xilinx website. It has some minor modifications. 10 //========================================= 11  12 `timescale 1ns / 1ps 13  14 module async_fifo 15   #(parameter    DATA_WIDTH    = 8, 16                  ADDRESS_WIDTH = 4, 17                  FIFO_DEPTH    = (1 << ADDRESS_WIDTH)) 18      //Reading port 19     (output wire [DATA_WIDTH-1:0]        Data_out,  20      output reg                          Empty_out, 21      input wire                          ReadEn_in, 22      input wire                          RClk,         23      //Writing port.      24      input wire  [DATA_WIDTH-1:0]        Data_in,   25      output reg                          Full_out, 26      input wire                          WriteEn_in, 27      input wire                          WClk, 28           29      input wire                          Clear_in); 30  31     /////Internal connections & variables////// 32     reg   [DATA_WIDTH-1:0]              Mem [FIFO_DEPTH-1:0]; 33     wire  [ADDRESS_WIDTH-1:0]           pNextWordToWrite, pNextWordToRead; 34     wire                                EqualAddresses; 35     wire                                NextWriteAddressEn, NextReadAddressEn; 36     wire                                Set_Status, Rst_Status; 37     reg                                 Status; 38     wire                                PresetFull, PresetEmpty; 39      40     //////////////Code/////////////// 41     //Data ports logic: 42     //(Uses a dual-port RAM). 43     //'Data_out' logic: 44     assign  Data_out = Mem[pNextWordToRead]; 45 //    always @ (posedge RClk) 46 //        if (!PresetEmpty) 47 //            Data_out <= Mem[pNextWordToRead]; 48 //        if (ReadEn_in & !Empty_out) 49              50     //'Data_in' logic: 51     always @ (posedge WClk) 52         if (WriteEn_in & !Full_out) 53             Mem[pNextWordToWrite] <= Data_in; 54  55     //Fifo addresses support logic:  56     //'Next Addresses' enable logic: 57     assign NextWriteAddressEn = WriteEn_in & ~Full_out; 58     assign NextReadAddressEn  = ReadEn_in  & ~Empty_out; 59             60     //Addreses (Gray counters) logic: 61     GrayCounter #( 62                 .COUNTER_WIDTH( ADDRESS_WIDTH ) 63     ) GrayCounter_pWr ( 64         .GrayCount_out(pNextWordToWrite), 65         .Enable_in(NextWriteAddressEn), 66         .Clear_in(Clear_in), 67          68         .Clk(WClk) 69        ); 70         71     GrayCounter #( 72                 .COUNTER_WIDTH( ADDRESS_WIDTH ) 73     ) GrayCounter_pRd ( 74         .GrayCount_out(pNextWordToRead), 75         .Enable_in(NextReadAddressEn), 76         .Clear_in(Clear_in), 77         .Clk(RClk) 78        ); 79       80  81     //'EqualAddresses' logic: 82     assign EqualAddresses = (pNextWordToWrite == pNextWordToRead); 83  84     //'Quadrant selectors' logic: 85     assign Set_Status = (pNextWordToWrite[ADDRESS_WIDTH-2] ~^ pNextWordToRead[ADDRESS_WIDTH-1]) & 86                          (pNextWordToWrite[ADDRESS_WIDTH-1] ^  pNextWordToRead[ADDRESS_WIDTH-2]); 87                              88     assign Rst_Status = (pNextWordToWrite[ADDRESS_WIDTH-2] ^  pNextWordToRead[ADDRESS_WIDTH-1]) & 89                          (pNextWordToWrite[ADDRESS_WIDTH-1] ~^ pNextWordToRead[ADDRESS_WIDTH-2]); 90                           91     //'Status' latch logic: 92     always @ (Set_Status, Rst_Status, Clear_in) //D Latch w/ Asynchronous Clear & Preset. 93         if (Rst_Status | Clear_in) 94             Status = 0;  //Going 'Empty'. 95         else if (Set_Status) 96             Status = 1;  //Going 'Full'. 97              98     //'Full_out' logic for the writing port: 99     assign PresetFull = Status & EqualAddresses;  //'Full' Fifo. 100      101     always @ (posedge WClk, posedge PresetFull) //D Flip-Flop w/ Asynchronous Preset. 102         if (PresetFull) 103             Full_out <= 1; 104         else 105             Full_out <= 0; 106              107     //'Empty_out' logic for the reading port: 108     assign PresetEmpty = ~Status & EqualAddresses;  //'Empty' Fifo. 109      110     always @ (posedge RClk, posedge PresetEmpty)  //D Flip-Flop w/ Asynchronous Preset. 111         if (PresetEmpty) 112             Empty_out <= 1; 113         else 114             Empty_out <= 0; 115              116 endmodule 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -