FPGA教程系列-Vivado中FIFO的简单仿真分析

FPGA教程系列-Vivado中FIFO的简单仿真分析

本着看十遍不如操作一遍的原则,对FIFO进行一个简单的仿真,加深一下印象。

生成一个IP核:(8位,16深度,其他默认)

编写top文件:

verilog 复制代码
`timescale 1ns / 1ps
module fifo_top(
 input i_clk,
 input i_rst,
 input[7:0] i_din,
 input        i_wr_en,
  input       i_rd_en,
 output      o_full,
 output      o_empty,
 output[7:0] o_dout  
);
fifo_generator_0 fifo_generator_u (
  .clk      (i_clk),      // input wire clk
  .srst     (i_rst),    // input wire srst
  .din      (i_din),      // input wire [7 : 0] din
  .wr_en    (i_wr_en),  // input wire wr_en
  .rd_en    (i_rd_en),  // input wire rd_en
  .dout     (o_dout),    // output wire [7 : 0] dout
  .full     (o_full),    // output wire full
  .empty    (o_empty)  // output wire empty
);
endmodule    

编写testbench:

verilog 复制代码
`timescale 1ns / 1ps

module tb_fifo_top;

/* ---------------- 接口 ---------------- */
logic        clk;
logic        rst;
logic [7:0]  din;
logic        wr_en;
logic        rd_en;
logic        full;
logic        empty;
logic [7:0]  dout;

/* ---------------- 时钟 ---------------- */
initial begin
    clk = 0;
    forever #10 clk = ~clk;
end

/* ---------------- 激励 ---------------- */
initial begin
    rst   = 1;
    wr_en = 0;
    rd_en = 0;
    din   = '0;
    repeat(5) @(posedge clk);
    rst = 0;
    @(posedge clk);

    // 1. 写满 16 字节
    $display("\n[%.2f ns] Write 16 bytes", $time);
    for (int i = 0; i < 16; i++) begin
        @(posedge clk);
        wr_en = 1;
        din   = i;
    end
    wr_en = 0;
    @(posedge clk);
    $display("[%.2f ns] full = %b", $time, full);

    // 2. 读出 16 字节
    $display("\n[%.2f ns] Read 16 bytes", $time);
    for (int i = 0; i < 16; i++) begin
        @(posedge clk);
        rd_en = 1;
    end
    rd_en = 0;
    @(posedge clk);
    $display("[%.2f ns] empty = %b", $time, empty);

    // 3. 交替写读 3 次
    $display("\n[%.2f ns] Alternating write/read", $time);
    repeat(3) begin
        @(posedge clk);
        wr_en = 1; din = $random; rd_en = 0;
        @(posedge clk);
        wr_en = 0; rd_en = 1;
    end
    rd_en = 0;
    @(posedge clk);

    #200;
    $display("\n[%.2f ns] Done", $time);
    $finish;
end

/* ---------------- 打印读出数据 ---------------- */
always @(posedge clk) begin
    if (rd_en & ~empty)
        $display("[%.2f ns] dout = %0d", $time, dout);
end

/* ---------------- 例化 DUT ---------------- */
fifo_top dut (
    .i_clk   (clk),
    .i_rst   (rst),
    .i_din   (din),
    .i_wr_en (wr_en),
    .i_rd_en (rd_en),
    .o_full  (full),
    .o_empty (empty),
    .o_dout  (dout)
);
endmodule

仿真分析:

写入0-14数据,读出0-14.

分别写入36,129并读出。

有心力的可以试试异步的fifo等等。。

工程文件:https://download.csdn.net/download/fantasygwh2015/92276755

相关推荐
Altair澳汰尔4 天前
成功案例丨平衡性能与安全的仿真:Altair助力 STARD 优化赛车空间车架设计
大数据·人工智能·仿真·fea·有限元分析·cae
Wishell20156 天前
FPGA教程系列-Vivado中实现简单正弦波
仿真
Altair澳汰尔7 天前
新闻速递丨Altair RapidMiner 数据分析和 AI 平台助力企业加速智能升级:扩展智能体 AI 及分析生态系统
人工智能·ai·数据分析·仿真·cae·rapidminer·数据自动化
Wishell20158 天前
FPGA教程系列-Vivado中串行FIR设计(非FIR核)
仿真
brave and determined8 天前
可编程逻辑器件学习(day3):FPGA设计方法、开发流程与基于FPGA的SOC设计详解
嵌入式硬件·fpga开发·soc·仿真·电路·时序·可编程逻辑器件
Wishell20159 天前
FPGA教程系列-Vivado IP核之乘法器解析
仿真
材料科学研究12 天前
先到先得!深度学习有限元仿真!
深度学习·cnn·abaqus·仿真·有限元
沐欣工作室_lvyiyi20 天前
用于电动汽车的永磁同步电机调速系统建模与仿真(论文+)
matlab·仿真·永磁同步电机·无传感器
康谋自动驾驶20 天前
如何闭环自动驾驶仿真场景,实现从“重建”到“可用”?
自动驾驶·仿真·建模·3dgs