Xilinx FPGA:vivado关于同步fifo的两个小实验

发布于:2024-07-06 ⋅ 阅读:(63) ⋅ 点赞:(0)

一、实验一:在同步fifo里写一个读一个(写入是8个位宽,读出是16个位宽)

程序:

`timescale 1ns / 1ps
//要求写一个读一个
//读写时钟一致,写是8个位宽,读是16个位宽
module sync_fifo_test(
     input                 sys_clk    ,
     input                 rst_n      
    );
     wire [15 : 0]   dout         ;                    
     wire full                    ;
     wire wr_ack                  ;
     wire empty                   ;
     wire valid                   ;
     wire [4 : 0] rd_data_count   ;
     wire [5 : 0] wr_data_count   ;
     
     reg [7 : 0] din  ;
     reg wr_en        ;
     reg rd_en        ;
     
     always@(posedge sys_clk )
          if(!rst_n)
             din <= 0 ;
          else
             din <= din +1 ;
     
     always@(posedge sys_clk )
          if(!rst_n)
             wr_en <= 0 ;
          else if (full)
             wr_en <= 0 ;
          else
             wr_en <= 1 ;

            

//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
sync_fifo_generator your_instance_name (
  .clk(sys_clk),                      // input wire clk
  .srst(~rst_n),                    // input wire srst
  .din(din),                      // input wire [7 : 0] din
  .wr_en(wr_en),                  // input wire wr_en
  .rd_en(wr_ack),                  // input wire rd_en
  .dout(dout),                    // output wire [15 : 0] dout
  .full(full),                    // output wire full
  .wr_ack(wr_ack),                // output wire wr_ack
  .empty(empty),                  // output wire empty
  .valid(valid),                  // output wire valid
  .rd_data_count(rd_data_count),  // output wire [4 : 0] rd_data_count
  .wr_data_count(wr_data_count)  // output wire [5 : 0] wr_data_count
);
// INST_TAG_END ------ End INSTANTIATION Template ---------

endmodule

仿真程序:

`timescale 1ns / 1ps
module test_sync_fifo( );

     reg                 sys_clk    ;
     reg                 rst_n      ;
     
     initial
            begin
                 sys_clk = 0 ;
                 rst_n   = 0 ;
                 #10
                 rst_n   = 1 ;
            end
    always #1 sys_clk = ~sys_clk ;     
     


sync_fifo_test  sync_fifo_test_1(
     .         sys_clk  ( sys_clk)  ,
     .         rst_n    ( rst_n  )  
    );



endmodule

实验结果:

TIPS:

二、实验二:在实验一的基础上完成“写完再读”

程序:

`timescale 1ns / 1ps
module sync_fifo_2(
    input               sys_clk   ,
    input               rst_n     
    );
    reg   [7 : 0] din             ;
    reg   wr_en                   ;
    reg   rd_en                   ;
    wire [15 : 0] dout            ;
    wire full                     ;
    wire wr_ack                   ;
    wire empty                    ;
    wire valid                    ;
    wire [4 : 0] rd_data_count    ;
    wire [5 : 0] wr_data_count    ;
    
    always@(posedge sys_clk )
         if(!rst_n)
            wr_en <= 0 ;
         else if (full)
            wr_en <= 0 ;
         else if (rd_en)
            wr_en <= 0 ;
         else
            wr_en <= 1 ;
    
    always@(posedge sys_clk )
         if(!rst_n)
            din <= 0 ;
         else
            din <= din +1 ;
    
    always@(posedge sys_clk )
         if(!rst_n)
            rd_en <= 0 ;
         else if (full)   //写满了 
            rd_en <= 1 ;
         else if (empty)   // 读空了
            rd_en <= 0 ;
         else
            rd_en <= rd_en ;
    

//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
sync_fifo_generator your_instance_name (
  .clk(sys_clk ),                      // input wire clk
  .srst(~rst_n),                    // input wire srst
  .din(din),                      // input wire [7 : 0] din
  .wr_en(wr_en),                  // input wire wr_en
  .rd_en(rd_en),                  // input wire rd_en
  .dout(dout),                    // output wire [15 : 0] dout
  .full(full),                    // output wire full
  .wr_ack(wr_ack),                // output wire wr_ack
  .empty(empty),                  // output wire empty
  .valid(valid),                  // output wire valid
  .rd_data_count(rd_data_count),  // output wire [4 : 0] rd_data_count
  .wr_data_count(wr_data_count)  // output wire [5 : 0] wr_data_count
);
// INST_TAG_END ------ End INSTANTIATION Template ---------

endmodule

仿真程序:

`timescale 1ns / 1ps
module test_sync_fifo_2( );

    reg               sys_clk   ;
    reg               rst_n     ;
    
    initial
           begin
                sys_clk = 0 ;
                rst_n   = 0 ;
                #10
                rst_n   = 1 ;
           end
    always #1 sys_clk = ~sys_clk ;

   sync_fifo_2   sync_fifo_2_1(
                          .    sys_clk  (sys_clk) ,
                          .    rst_n    (rst_n  ) 
    ); 

endmodule

仿真结果: