微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > xilinx FIFO IP核前仿和后仿读数据少了3个,真奇怪!

xilinx FIFO IP核前仿和后仿读数据少了3个,真奇怪!

时间:10-02 整理:3721RD 点击:
xilinx ise12.3 FIFO generator 6.2
independent clk syn standard fifo.120x32bit.
仿真时先写入1,2,3……,然后读出来
前仿真完全正确,后仿真时读出数据则从4开始。不知为什么?非常奇怪!
有人说xilinx的ip fifo需要free running 时钟,testbech里面使用了啊,问题依旧。
这个我在硬件上实现了,和后仿结果一致。【xc5vsx50t ff665-2】ise10.1。









`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date:    21:14:31 12/31/2010
// Design Name:
// Module Name:    FIFOwei
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module FIFOwei(
    input rst,
input wr_clk,
input rd_clk,
input [31 : 0] din,
input wr_en,
input rd_en,
output [31 : 0] dout,
output full,
output empty,
output prog_full
    );
FIFO_120x32 YourInstanceName (
.rst(rst),
.wr_clk(wr_clk),
.rd_clk(rd_clk),
.din(din), // Bus [31 : 0]
.wr_en(wr_en),
.rd_en(rd_en),
.dout(dout), // Bus [31 : 0]
.full(full),
.empty(empty),
.prog_full(prog_full));
endmodule
、、-----------------------------------------------
test bench
`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date:   20:22:07 12/31/2010
// Design Name:   FIFO_120x32
// Module Name:   D:/08MyFpga/Virtex5FIFO/testFIFO.v
// Project Name:  Virtex5FIFO
// Target Device:  
// Tool versions:  
// Description:
//
// Verilog Test Fixture created by ISE for module: FIFO_120x32
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
////////////////////////////////////////////////////////////////////////////////
module testFIFO;
// Inputs
reg rst;
reg wr_clk;
reg rd_clk;
reg [31:0] din;
reg wr_en;
reg rd_en;
// Outputs
wire [31:0] dout;
wire full;
wire empty;
wire prog_full;
// Instantiate the Unit Under Test (UUT)
FIFOwei uut (
  .rst(rst),
  .wr_clk(wr_clk),
  .rd_clk(rd_clk),
  .din(din),
  .wr_en(wr_en),
  .rd_en(rd_en),
  .dout(dout),
  .full(full),
  .empty(empty),
  .prog_full(prog_full)
);
initial
forever
begin
rd_clk = 0;
#5;rd_clk=1;
#5;
end
/*
initial begin
forever
wr_clk = 0;
#20;wr_clk=1;
#20;
end
*/
initial begin
  // Initialize Inputs
  rst = 0;
  wr_clk = 0;
  din = 0;
  wr_en = 0;
  rd_en = 0;
  // Wait 100 ns for global reset to finish
  #500;
      wr_en=1;
  
  #50;din=1;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=2;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=3;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=4;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=5;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=6;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=7;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=8;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=9;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=10;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=11;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=12;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=13;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=14;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=15;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=16;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=1;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=2;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=3;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=4;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=5;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=6;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=7;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=8;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=9;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=10;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=11;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=12;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=13;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=14;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=15;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=16;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=1;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=2;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=3;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=4;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=5;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=6;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=7;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=8;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=9;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=10;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=11;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=12;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=13;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=14;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=15;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=16;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=1;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=2;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=3;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=4;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=5;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=6;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=7;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=8;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=9;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=10;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=11;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=12;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=13;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=14;
  
  
  wr_en=0;
  
  
  
  
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=15;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=16;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=1;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=2;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=3;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=4;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=5;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=6;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=7;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=8;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=9;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=10;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=11;
      #50;wr_clk=1;
      #50;wr_clk=0;rd_en=1;
      #50;din=12;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=13;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=14;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=15;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=16;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=1;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=2;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=3;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=4;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=5;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=6;rd_en=0;
  
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=7;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=8;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=9;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=10;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=11;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=12;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=13;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=14;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=15;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=16;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=1;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=2;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=3;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=4;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=5;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=6;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=7;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=8;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=9;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=10;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=11;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=12;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=13;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=14;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=15;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=16;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=1;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=2;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=3;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=4;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=5;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=6;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=7;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=8;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=9;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=10;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=11;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=12;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=13;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=14;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=15;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=16;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=1;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=2;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=3;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=4;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=5;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=6;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=7;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=8;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=9;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=10;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=11;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=12;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=13;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=14;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=15;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=16;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=1;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=2;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=3;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=4;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=5;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=6;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=7;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=8;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=9;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=10;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=11;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=12;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=13;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=14;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=15;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=16;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=1;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=2;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=3;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=4;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=5;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=6;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=7;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=8;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=9;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=10;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=11;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=12;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=13;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=14;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=15;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=16;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=1;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=2;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=3;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=4;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=5;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=6;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=7;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=8;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=9;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=10;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=11;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=12;
      #50;wr_clk=1;
      #50;wr_clk=0;
  #50;din=13;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=14;
  
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=15;
      #50;wr_clk=1;
      #50;wr_clk=0;
      #50;din=16;
      #50;wr_clk=1;
      #50;wr_clk=0;

/*
  #50;wr_en=0;
      #500;
  
      #52;rd_en=1;
  #1500;rd_en=0;
  */
  #1000;
  
  // Add stimulus here
end
      
endmodule

modelsim使用6.5
硬件实现的时候约束仅仅对管脚进行了位置约束,其余没有。
上面的仿真后仿时管脚使用软件的自动配置,即本人未使用ucf文件。
谢谢大侠相助!

看你的写时钟和数据就对不上啊。写时钟不是周期?异步的话出问题也正常啊,testbench写的也太诡异了吧。为什么不产生一个时钟,就写always产生din呢?testbench中时钟也不像你那样产生吧。

ug175里有写复位是有3个周期左右的延迟
关键是你这个在写之前都没有时钟,因为到内部逻辑的复位信号都是同步到读写时钟的,而你在复位时却没有时钟,很难保证仿真模型的行为描述是否会产生异常。

谢谢gg9132qq
谢谢小编:)
“关键是你这个在写之前都没有时钟”
我在wr_en前又加了若干个wr_clk
后仿真正常了,谢谢了:)
=======================
gg9132qq
说的问题,其实写时钟为了正好处于数据有效的中间,如下图

_____________________________________
----------<==========><==============>---------

学习了,谢谢~

看波形是没写进去,不过你后边自已解决了.呵呵,我也学习了.谢谢.

非常感谢诸位的帮助!
这个问题的原因确实就是wr_en之前没有wr_clk的原因造成的。
本人编制的程序对写fifo不期望使用free running clk。因为数据采集是一批一批的,来一批写一次fifo。
最终处理的时序略图如下:
信号名称从上到下依次为:wr_en,wr_clk,wr_data.wr_clk在wr_en有效值1前后各加了6各clk。
使用一切正常,已经下载到fpga验证正确。
___________________________
_~_~_~_~_~_______________________________________~_~_~_
-----------------------<=======><=======><========><=======><=======>-------------
再次对小编和各位热心的仁兄表示感谢!
本人的电路板基于tms320c6455+Virtex5sx50T+1Gnet+24ADC+2HiDAC+4LoDAC+2RS232+2RS422+SRIO.
欢迎大家交流:)

为啥不用free running clk?对功耗要求很严格?

也在学习,希望有用




请教:为什么我的fifo在复位后(rest_fifo)后,empty和full都为1,并且wr_ack一直为0?谢谢

自己解决了,原来在生成fifo时,有个reset后full flag的值是1还是0的选项,改成0就可以了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top