打印

书上的一段FIFO的代码,越看越不对劲....

[复制链接]
2260|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tigris|  楼主 | 2009-5-7 10:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
module FIFO(clk, reset_n, data_in, read_n, write_n, data_out, full, empty);
    input             clk;
    input             reset_n;
    input  [7:0]     data_in;
    input             read_n;
    input             write_n;
    output [7:0]     data_out;
    output             full;
    output             empty;

    wire                clk;
     wire                reset_n;
     wire    [7:0]        data_in;
     wire                read_n;
     wire                write_n;
     wire                full;
     wire                empty;
     reg    [7:0]        data_out;

     reg[7:0]    fifo_mem[15:0];  //fifo存储体
     reg[3:0]    counter;        //计数器,表示fifo用了多少
     reg[3:0]   rd_pointer; //fifo读指针
     reg[3:0]   wr_pointer;    //写指针

     //满空状态标志
     assign #`del full=(counter==16)?1'b1:1'b0;
     assign #`del empty=(counter==0)?1'b1:1'b0;

     //复位操作
     always@(reset_n)
     begin
         if(~reset_n)
            begin
            #`del;
            assign rd_pointer=4'b0;
            assign wr_pointer=4'b0;
            end
        else
            begin
            #`del;
            deassign rd_pointer;
            deassign wr_pointer;
            deassign counter;
            end
    end

    //计数,读写功能
    always@(posedge clk)
    begin
    //读操作数,计数器递减
        if(write_n) ???这里为何只判断写使能无效就将计数器减1  
            begin
            counter<=#`del counter-1;
            end    
          data_out<=#`del fifo_mem[rd_pointer];
    //如果读指针指向末尾,则返回
        if(rd_pointer==14) ???rd_pointer等于15时才复位吧
             rd_pointer<=#`del 4'b0;
        else
            rd_pointer<=#del rd_pointer+1;

        if(~write_n)
            begin
            //检查是否溢出
            if(counter>=15)
                begin
                $display("\nerror at time %0t",$time);
                $display("fifo underflow\n");
                $stop
                end
            //写操作数,计数器加1
            if(read_n)  ???这里为何只判断读使能无效就将计数器加1  

                begin
                counter<=#`del counter+1;
                end

            fifo_mem[wr_pointer]<=#`del data_in;
            //如果写指针指向末尾,则返回
            if(wr_pointer==14)
                wr_pointer<=#`del 4'b0;
            else
                wr_pointer<=#`del wr_pointer+1;
        end

    end
endmodule

好不容易手动把代码敲到ISE里面。觉得代码的逻辑太怪了,在读写标志递增时的条件判断感觉不对劲。

相关帖子

沙发
钻研的鱼| | 2009-5-7 22:01 | 只看该作者

尽信书则不如无书

altera公司有同步逻辑fifo的代码,且开放。

使用特权

评论回复
板凳
tigris|  楼主 | 2009-5-8 08:53 | 只看该作者

哦,谢谢楼上

去altera公司网站去下载吗

使用特权

评论回复
地板
Fourier00| | 2009-5-8 19:40 | 只看该作者

我的妈啊 这种fifo代码

我的妈啊 这种fifo代码

使用特权

评论回复
5
wujing198| | 2009-5-8 20:27 | 只看该作者

……

建议楼主曝光书名……
代码风格太差了,误导新人。

使用特权

评论回复
6
tigris|  楼主 | 2009-5-13 15:34 | 只看该作者

中国电力出版社。袁文波。图书馆借的书

使用特权

评论回复
7
vteaflf| | 2009-5-16 21:43 | 只看该作者

回家打算买一本!

使用特权

评论回复
8
wujing198| | 2009-5-17 21:04 | 只看该作者

╮(╯▽╰)╭

……

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

76

主题

175

帖子

0

粉丝