作为实现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,rst,wren,rden; input[Bit_Width-1:0] din; output full,empty; output reg[Bit_Width-1:0] dout; output reg[2:0] counter; reg[3:0] addr_wr,addr_rd; reg[Bit_Width-1:0] buf_mem[0:Addr_Width-1]; parameter s0=2‘b00,s1=2‘b01,s2=2‘b10,s3=2‘b11; always @(posedge clk or negedge rst) begin if(!rst) begin dout<=0; counter<=0; addr_wr<=0; addr_rd<=0; end else begin case({rden,wren}) s1:begin if(!full) begin buf_mem[addr_wr]<=din; addr_wr<=addr_wr+1; counter<=counter+1; end end s2:begin if(!empty) begin dout<=buf_mem[addr_rd]; addr_rd<=addr_rd+1; counter<=counter-1; end end s3:begin if(!empty) begin dout<=buf_mem[addr_rd]; addr_rd<=addr_rd+1; if(full) counter<=counter-1; end if(!full) begin buf_mem[addr_wr]<=din; addr_wr<=addr_wr+1; if(empty) counter<=counter+1; end end endcase end end assign full=({~addr_wr[3],addr_wr[2:0]}==addr_rd[3:0])?1:0; assign empty=(addr_rd[3:0]==addr_wr[3:0])?1:0; endmodule
主要思想是通过两个输入对读写进行控制,创建一个数组向量,存储每次写入的值,采用先进先出(即FIFO)的思想,当写满时,发送满指令,读空时发送空指令。
此法与网络上能够搜到的其他方法大同小异,纯属记录coding的结果,还没有优化与重构,各位看官见谅!
以上,互相学习!!!
原文地址:https://www.cnblogs.com/lightmonster/p/10198233.html
时间: 2024-10-15 06:10:12