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

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

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

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

image

编写top文件:

`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:

`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

仿真分析:

image

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

image

分别写入36,129并读出。

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

工程文件:https://download.youkuaiyun.com/download/fantasygwh2015/92276755

【博士论文复现】【阻抗建模、验证扫频法】光伏并网逆变器扫频与稳定性分析(包含锁相环电流环)(Simulink仿真实现)内容概要:本文档是一份关于“光伏并网逆变器扫频与稳定性分析”的Simulink仿真实现资源,重点复现博士论文中的阻抗建模与扫频法验证过程,涵盖锁相环和电流环等关键控制环节。通过构建详细的逆变器模型,采用小信号扰动方法进行频域扫描,获取系统输出阻抗特性,并结合奈奎斯特稳定判据分析并网系统的稳定性,帮助深入理解光伏发电系统在弱电网条件下的动态行为与失稳机理。; 适合人群:具备电力电子、自动控制理论基础,熟悉Simulink仿真环境,从事新能源发电、微电网或电力系统稳定性研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握光伏并网逆变器的阻抗建模方法;②学习基于扫频法的系统稳定性分析流程;③复现高水平学术论文中的关键技术环节,支撑科研项目或学位论文工作;④为实际工程中并网逆变器的稳定性问题提供仿真分析手段。; 阅读建议:建议读者结合相关理论教材与原始论文,逐步运行并调试提供的Simulink模型,重点关注锁相环与电流控制器参数对系统阻抗特性的影响,通过改变电网强度等条件观察系统稳定性变化,深化对阻抗分析法的理解与应用能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值