FIFO存储器代码

简介:
 
 
 
module fifo(clock,reset,read,write,fifo_in,fifo_out,fifo_empty,fifo_half,fifo_full);
input clock,reset,read,write;
input [7:0] fifo_in;
output [7:0] fifo_out;
output fifo_empty,fifo_half,fifo_full;  //表示存储单元使用情况的标志位

reg [7:0] fifo_out;
reg [2:0] read_ptr,write_ptr,counter;  //读,写指针及计数器
reg [7:0] ram [7:0];  //8个8位的存储单元
wire fifo_empty,fifo_half,fifo_full;

always@(posedge clock)   //复位信号有效时给系统复位
 if (reset)
    begin 
       read_ptr=0;
       write_ptr=0;
       counter=0;
       fifo_out=0;
    end
 else                        //做读(数据输出),写(数据输入)操作
     case({read,write})
      2'b00:         //没有读写指令
        counter=counter; 
        
      2'b01:    //写指令,数据输入FIFO
        begin
          ram[write_ptr]=fifo_in;   //将输入数据写入存储单元
          counter=counter+1;   //每写入一个数就让计数器加1
          write_ptr=(write_ptr==7)?0:write_ptr+1;
          
         /*写指针加1,若指针指向最后一个存储单元(write_ptr==7),则把指针指向第一个存储单元*/
        end   
        
      2'b10:  //读指令,数据从FIFO输出
         begin
           fifo_out=ram[read_ptr];  //将存储单元的数据输出
           counter=counter-1;     //每读出一个数就让计数器减1
           read_ptr=(read_ptr==7)?0:read_ptr+1; 
           /*读指针加1,若指针指向最后一个存储单元(read _ptr ==7),则把指针指向第一个存储单元*/
           
         end
         
       2'b11:    //读写指令,同时做数据输入和输出
          begin
            if(counter==0)    //存储单元是空的,所以当前输入数据可以直接输出
              fifo_out=fifo_in;
              else
                begin 
                   ram[write_ptr]=fifo_in;
                   fifo_out=ram[read_ptr];
                   write_ptr=(write_ptr==7)?0:write_ptr+1;
                   read_ptr=(read_ptr==7)?0:read_ptr+1;
                end
           end     
       endcase

assign fifo_empty=(counter==0);  //存储单元都是空的时候将标志位fifo_empty置1
   assign fifo_full=(counter==7);   //存储单元都满了的情况下将标志位fifo_full置1
   assign fifo_half=(counter==4);    //存储单元占用了一半的时候将标志位fifo_half置1

endmodule

 
目录
相关文章
|
3月前
|
存储 缓存 数据处理
计算机硬件存储器中的缓冲与缓存
【8月更文挑战第2天】
201 5
|
6月前
|
存储 缓存 程序员
MCS-51存储器的特点
MCS-51存储器的特点
151 1
|
6月前
|
程序员
内存操作数及寻址方式
内存操作数及寻址方式
83 0
|
6月前
环形队列+DMA空闲中断+接收串口数据
环形队列+DMA空闲中断+接收串口数据
143 0
|
6月前
|
存储 程序员
【汇编】内存的读写与地址空间、寄存器及数据存储
【汇编】内存的读写与地址空间、寄存器及数据存储
572 1
【汇编】内存的读写与地址空间、寄存器及数据存储
|
Linux Shell
内核调试之devmem直接读写寄存器
内核调试之devmem直接读写寄存器
|
存储 索引 Windows
驱动开发:内核物理内存寻址读写
在某些时候我们需要读写的进程可能存在虚拟内存保护机制,在该机制下用户的`CR3`以及`MDL`读写将直接失效,从而导致无法读取到正确的数据,本章我们将继续研究如何实现物理级别的寻址读写。首先,驱动中的物理页读写是指在驱动中直接读写物理内存页(而不是虚拟内存页)。这种方式的优点是它能够更快地访问内存,因为它避免了虚拟内存管理的开销,通过直接读写物理内存,驱动程序可以绕过虚拟内存的保护机制,获得对系统中内存的更高级别的访问权限。
7059 1
|
存储 缓存 移动开发
【软考学习6】计算机存储结构——局部性原理、Cache、主存地址单元、磁盘存取、总线和可靠性
【软考学习6】计算机存储结构——局部性原理、Cache、主存地址单元、磁盘存取、总线和可靠性
194 0
|
存储
寄存器寻址和寄存器间接寻址的区别
寄存器寻址和寄存器间接寻址的区别
226 0
KONGSBERG RCU502 设置和访问数字的存储器指令
KONGSBERG RCU502 设置和访问数字的存储器指令
94 0
KONGSBERG RCU502 设置和访问数字的存储器指令