2015年1月3日 星期六

FIFO程式

使用在Verilog及MCU上用的。
在verilog中Buffer管理以2的指數為大小比較好管理。因為運算上方便,只需要用AND取得餘數。
在MCU上則是用在中斷及主程式之間的管理。
程式如下:

#define BUF_SIZE    0x8
#define SIZE_MASK   (BUF_SIZE-1)

int buffer[BUF_SIZE];

unsigned char fifo_wr_count, fifo_rd_count;

int fifo_reset(void)
{
    fifo_wr_count = 0;
    fifo_rd_count = 0;
    return -1;
}


int fifo_write(int data)
{
    unsigned int dist;

    dist = (unsigned char)(fifo_wr_count - fifo_rd_count);
    if ( dist >= BUF_SIZE)
    {
        return 0;
    }
    else
    {
        buffer[(fifo_wr_count&SIZE_MASK)] = data;
        fifo_wr_count++;
        return -1;
    }
}

int fifo_read(int *data)
{
    if ( fifo_rd_count == fifo_wr_count )
    {
        return 0;
    }
    else
    {
        *data = buffer[(fifo_rd_count&SIZE_MASK)];
        fifo_rd_count++;
        return -1;
    }
}

沒有留言:

張貼留言