轉載自某處~~~忘了,致謝一下。做了一些小修改。模塊讀寫是分開的,配合串口的收發是最合適不過的。經驗證的串口收發見下載,普通情況下使用足夠。
/*---------------------rx fifo 8*32 -------------------------------- */
reg [7:0]reg_fifo_out;reg rx_reg_fifo_empty,rx_reg_fifo_full;
reg [4:0]rx_read_ptr,rx_write_ptr,rx_counter;
reg [7:0]rx_ram[31:0]; //32 * 8bit
always @ ( posedge clk or negedge rstn )
if( !rstn )
begin
reg_fifo_out <= 8'd0;
rx_read_ptr <=1'd0;
rx_write_ptr <=1'd0;
rx_counter <=1'd0;
end
else
case({read,isRXDone})
2'b00:
rx_counter <= rx_counter;
2'b01:
begin
rx_ram[rx_write_ptr] <= rData;
rx_write_ptr <= (rx_write_ptr==5'd31)?0:(rx_write_ptr+1'd1);
rx_counter <= rx_counter+1'd1;
end
2'b10:
begin
reg_fifo_out <= rx_ram[rx_read_ptr];
rx_counter <= rx_counter-1'd1;
rx_read_ptr<= (rx_read_ptr==5'd31)?0:(rx_read_ptr+1'd1);
end
2'b11:
begin
if(rx_counter==0)
reg_fifo_out <= rData;
else
begin
rx_ram[rx_write_ptr] <= rData;
rx_write_ptr <= (rx_write_ptr==5'd31)?0:(rx_write_ptr+1'd1);
reg_fifo_out <= rx_ram[rx_read_ptr];
rx_read_ptr<= (rx_read_ptr==5'd31)?0:(rx_read_ptr+1'd1);
end
end
endcase
assign rx_fifo_empty = (rx_counter==1'd0);
assign rx_fifo_full = (rx_counter==5'd15);
assign fifo_out = reg_fifo_out;