一个简单的FIFO例子

32 篇文章 0 订阅

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h> 
#include <sys/stat.h> 
#include <errno.h>


int safe_fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
    size_t ret = 0;

    do {
        clearerr(stream);
        ret += fread((char *)ptr + (ret * size), size, nmemb - ret, stream);
    } while (ret < nmemb && ferror(stream) && errno == EINTR);

    return ret;
}


int safe_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
{
    size_t ret = 0;

    do {
        clearerr(stream);
        ret += fwrite((char *)ptr + (ret * size), size, nmemb - ret, stream);
    } while (ret < nmemb && ferror(stream) && errno == EINTR);

    return ret;
}

 

///

write process

int main()
{
    FILE* fp;
    int i =0;
    char buff[20];
    printf("test/n");
   
   
    if (EEXIST == mkfifo("/home/jeff/test/fifo/tmp", S_IRWXU))
        printf("test/n");
   
    fp = fopen("/home/jeff/test/fifo/tmp", "w");
   
    for (i = 0; i < 10; i++)
    {
        sprintf(buff, "test : %d/n", i);
        safe_fwrite(buff, 1, strlen(buff), fp);
    }
   
   
    sleep(15);
    fclose(fp);
   
   
}

 

//

read process

int main()
{
    FILE* fp;
    int i=0;
    char buff[20];
    int len = 0;
    sprintf(buff, "test : %d/n", 1);
    len = strlen(buff);
   
    fp = fopen("/home/jeff/test/fifo/tmp", "r");
    if (fp)
        printf("open success/n");
   
    for (i = 0; i < 10; i++)
    {
        memset(buff, 0, 20);
        safe_fread(buff,1, len, fp);
        printf(buff);
    }
    fclose(fp);
   
   
}

Verilog是一种硬件描述语言,常用于数字系统的设计。下面是一个简单的Verilog代码示例,展示如何使用模块化的方式创建一个FIFO(Fixed-Size First-In-First-Out Queue): ```verilog module fifo( input wire clk, // 时钟信号 input wire rst_n, // 置零信号 input wire [31:0] din, // 数据输入 output reg [31:0] dout, // 数据输出 input wire w_en, // 写使能信号 input wire r_en, // 读使能信号 input wire empty, // 当队列为0时,此信号为高 input wire full // 当队列为最大值时,此信号为高 ); parameter WIDTH = 32; // FIFO宽度 parameterDEPTH = 8; // FIFO深度 reg [WIDTH-1:0] data [0:DEPTH-1]; // 存储数据的数组 wire [WIDTH-1:0] mem [0:DEPTH-1]; // 中间变量用于暂存写入的数据 integer i; // 写入部分 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin data <= {DEPTH{default}}; end else if (w_en) begin mem[i] = din; if (i == DEPTH - 1) begin data[0] <= mem[0]; mem <= {mem[1:DEPTH]}; i = 0; } else begin i = i + 1; data[i] <= mem[i]; end end end // 读取部分 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin dout <= default; end else if (r_en && !full) begin dout <= data[0]; data <= {data[1:DEPTH]}; end end assign empty = (i == 0); // 当队列为空时设置empty为1 assign full = (i == DEPTH - 1); // 当队列已满时设置full为1 endmodule ``` 这个例子中,`fifo`模块接收时钟、置零信号、数据输入、读写使能以及空/满信号,然后内部通过双缓冲区机制实现了FIFO的功能。请注意这只是一个简化的实现,实际应用中可能还需要考虑同步问题和其他详细控制逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值