UNICORNLI 发表于 2016-12-4 18:24

Verilog语言实现异步FIFO

本帖最后由 UNICORNLI 于 2016-12-4 18:27 编辑

               这个月做项目,使用了Verilog写程序,这里分享一下异步FIFO,这是基本的,可以根据项目需要做修改。不对的地方请大家指正。
module fifo_interface(
      inputclk1,
      inputclk2,
      input in_data,
      inputaddr,
      inputrst,
      output out_data,
      outputfull,
      outputempty
      );

      reg[ bite_Size-1:0]Buff ;//FIFO的存储空间
      regcur_Wr_Pt,next_Wr_Pt;
      regcur_Rd_Pt,next_Rd_Pt;
      regfull_Flag,empty_Flag;
      regfifoWR, fifoRD;
      parameterdeep_Size = 256, addr_Size = 8, bite_Size = 8 ,couter_Size = 8;

      initial
               begin
                full = 0;
                empty = 1;
                wr_Addr_Bin = 0;
                rd_Addr_Bin = 0;
               couter =0;
                cur_Wr_Pt = 0;
                cur_Rd_Pt = 0;
                next_Wr_Pt = 1;
                next_Rd_Pt = 1;
               end

      always @(addr)
      begin
      case (addr)
            2'b01:   fifoWR = 1;
            2'b10:   fifoRD = 1;
            default:
                begin
                      fifoWR = 0;
                      fifoRD= 0;
                end
      endcase
      end      

      reg couter;
      always @(cur_Wr_Pt )
               begin
                if(cur_Wr_Pt>0)
                  empty_Flag = 0;
               end

      always @(posedgeclk)
            begin
                if(full_Flag==1 ||couter_Rst==1)
                     couter <= 0 ;
                if (full_Flag!=1 &&??)
                  couter<= couter+1;
             end      

      always @(posedgeclk1)
         begin
                if (rst == 1)
                  begin
                        Buff <= 0;
                cur_Wr_Pt = 0;               
                next_Wr_Pt = 1;
                  end
               if ((full_Flag!=1)&&(fifoWR==1))
                      begin
                  Buff <= in_Data;
                                     if (next_Wr_Pt< deep_Size-1)
                        begin
                           cur_Wr_Pt<= next_Wr_Pt;
                           next_Wr_Pt <=cur_Wr_Pt+1;
                        end
                   else
                        begin
                            full_Flag<=1;
                            cur_Wr_Pt = 0;
                            next_Wr_Pt = 1;
                         end

                      end

      always @(posedgeclk2)
      begin
             if (rst == 1)
                  begin
                        Buff <= 0;               
                cur_Wr_Pt = 1;
                next_Rd_Pt = 1;
                  end
               if ((empty_Flag!=1)&&(fifoRD==1))
                     begin
               out_data <= Buff;
               if (next_Wr_Pt< deep_Size-1)
                begin
                     cur_Wr_Pt<= next_Wr_Pt;
                     next_Wr_Pt <=cur_Wr_Pt+1;
                end
               else
                begin
                   empty_Flag<=1;
                   cur_Rd_Pt = 0;
                   next_Rd_Pt = 1;
               end
      end
endmodule


深蓝浅 发表于 2016-12-4 19:41

刚学verilog,受不了begin和end

psx1lin 发表于 2016-12-4 19:52

Verilog是一種用於描述、設計電子系統(特別是數位電路)的硬體描述語言
沒聽過

UNICORNLI 发表于 2016-12-5 09:16

深蓝浅 发表于 2016-12-4 19:41
刚学verilog,受不了begin和end

把它当做其他语言中的大括号{:301_996:}

UNICORNLI 发表于 2016-12-5 09:16

蓝家骑士 发表于 2016-12-4 23:25
好东西,谢谢分享

谢谢回帖

UNICORNLI 发表于 2016-12-5 09:17

psx1lin 发表于 2016-12-4 19:52
Verilog是一種用於描述、設計電子系統(特別是數位電路)的硬體描述語言
沒聽過

嗯,还有类似的语言是古老的VHDL

深蓝浅 发表于 2016-12-5 09:55

UNICORNLI 发表于 2016-12-5 09:16
把它当做其他语言中的大括号

对啊,为什么不用大括号,代码写起来和看起来都好麻烦

UNICORNLI 发表于 2016-12-5 11:16

因为它里面的大括号有其他作用了,再用会让编译器懵逼

UNICORNLI 发表于 2016-12-5 11:18

深蓝浅 发表于 2016-12-5 09:55
对啊,为什么不用大括号,代码写起来和看起来都好麻烦

因为大括号有其他作用了,用它做多种作用会让编译器懵逼,也许以后会改呢

深蓝浅 发表于 2016-12-5 11:47

UNICORNLI 发表于 2016-12-5 11:18
因为大括号有其他作用了,用它做多种作用会让编译器懵逼,也许以后会改呢

{:1_893:}原来如此
页: [1] 2
查看完整版本: Verilog语言实现异步FIFO