• Lattice库联合ModelSim仿真FIFO


    前言

    本实验FPGA基于LFE5U—25F一6BG256C,软件Lattice Diamond 3.10 (64-bit)ModelSim SE-64 10.5
    掌握基本使用方法后,调用FIFO的IP核,用Lattice联合ModelSim仿真。


    一、添加IP

    1.项目器件设置
    具体参考02_LATTICE入门篇之新建项目
    在这里插入图片描述


    2.IP核配置
    具体参考05_LATTICE入门篇之IP核
    在这里插入图片描述



    二、库文件添加

    (一)方式一:添加器件库到ModelSim

    此处参考Modelsim添加Lattice库
    1.在modelsimF:\modeltech64_10.5目录下,新建一个文件夹,比如lattice,并进入此文件夹
    2.新建一个名为sim.tcl的文本文件,输入如下脚本:

    set DIAMOND_PATH F:/lscc/diamond/3.10_x64/cae_library/simulation/verilog
    
    vlib work
    vlib ec
    vlib ecp
    vlib ecp2
    vlib ecp3
    vlib ecp5u
    vlib lptm
    vlib lptm2
    vlib machxo
    vlib machxo2
    vlib machxo3l
    vlib pmi
    vlib sc
    vlib scm
    vlib xp
    vlib xp2
    
    vlog -work ec       $DIAMOND_PATH/ec/*.v
    vlog -work ecp      $DIAMOND_PATH/ecp/*.v
    vlog -work ecp2     $DIAMOND_PATH/ecp2/*.v
    vlog -work ecp3     $DIAMOND_PATH/ecp3/*.v
    vlog -work ecp5u    $DIAMOND_PATH/ecp5u/*.v
    vlog -work lptm     $DIAMOND_PATH/lptm/*.v
    vlog -work lptm2    $DIAMOND_PATH/lptm2/*.v
    vlog -work machxo   $DIAMOND_PATH/machxo/*.v
    vlog -work machxo2  $DIAMOND_PATH/machxo2/*.v
    vlog -work machxo3l $DIAMOND_PATH/machxo3l/*.v
    vlog -work pmi      $DIAMOND_PATH/pmi/*.v
    vlog -work sc       $DIAMOND_PATH/sc/*.v
    vlog -work scm      $DIAMOND_PATH/scm/*.v
    vlog -work xp       $DIAMOND_PATH/xp/*.v
    vlog -work xp2      $DIAMOND_PATH/xp2/*.v
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    3.运行脚本
    打开命令提示符进入sim.tcl 所在F:\modeltech64_10.5\lattice目录下
    运行脚本

    vsim -do sim.tcl
    
    • 1

    4.回到modesim主目录:F:\modeltech64_10.5,找到modelsim.ini文件,右键->将“只读”属性去掉。
    在这里插入图片描述


    5.然后再打开modelsim.ini,在[Library]这个标签后,添加如下:

    ec       = $MODEL_TECH/../lattice/ec       
    ecp      = $MODEL_TECH/../lattice/ecp      
    ecp2     = $MODEL_TECH/../lattice/ecp2     
    ecp3     = $MODEL_TECH/../lattice/ecp3     
    ecp5u    = $MODEL_TECH/../lattice/ecp5u    
    lptm     = $MODEL_TECH/../lattice/lptm     
    lptm2    = $MODEL_TECH/../lattice/lptm2    
    machxo   = $MODEL_TECH/../lattice/machxo   
    machxo2  = $MODEL_TECH/../lattice/machxo2  
    machxo3l = $MODEL_TECH/../lattice/machxo3l 
    pmi      = $MODEL_TECH/../lattice/pmi      
    sc       = $MODEL_TECH/../lattice/sc       
    scm      = $MODEL_TECH/../lattice/scm      
    xp       = $MODEL_TECH/../lattice/xp       
    xp2      = $MODEL_TECH/../lattice/xp2      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    6.保存modelsim.ini,然后关闭刚modelsim重启,看到库的情况如下:
    在这里插入图片描述


    7.回到modesim主目录:F:\modeltech64_10.5,找到modelsim.ini文件,右键->增加“只读”属性。

    :这个方法添加了器件库后,编译没有问题,但是新建库仿真跑波形又会报错提示找不到对应的库对应.v了,很奇怪。猜测可能是添加的库文件.v和需要仿真的.v不在同一个Libray中,也可能是其他.所以用了下面的方法,解决。


    (二)方法二:直接添加器件库到Libray,和tb.v在同一个目录下仿真

    此处参考Lattice Diamond与modelsim联合仿真环境设置

    1… 选中空库(work))

    2.点击modelsim的菜单栏中选择Compile >> Compile
    3.找到F:\lscc\diamond\3.10_x64\cae_library\simulation\verilog目录下对应器件库ecp5u下的所有.vCtrl+A全选点击Complie,编译完成点击Done

    在这里插入图片描述


    5.完成后可以看见库文件和tb文件全在同一个Library下了,再仿真,没有报错了。
    在这里插入图片描述
    在这里插入图片描述

    除了找仿真文件tb.v的时候有点麻烦,其他的没什么问题。


    三、仿真

    下面是利用脚本进行仿真

    (一)仿真文件

    1.再添加ip时,Diamond会自动添加仿真文件,只需略微修改即可或者不修改也行。
    在这里插入图片描述


    2.tb文件,放到项目仿真目录下
    在这里插入图片描述

    `timescale 1 ns / 1 ps
        module tb;
            GSR GSR_INST (.GSR(1'b1));
            PUR PUR_INST (.PUR(1'b1));
        
            reg [7:0] Data = 8'b0;
            reg WrClock = 0;
            reg RdClock = 0;
            reg WrEn = 0;
            reg RdEn = 0;
            reg Reset = 0;
            reg RPReset = 0;
            wire [7:0] Q;
            wire Empty;
            wire Full;
        
            integer i0 = 0, i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0;
        
        
            fifo u1 (.Data(Data), .WrClock(WrClock), .RdClock(RdClock), .WrEn(WrEn), 
                .RdEn(RdEn), .Reset(Reset), .RPReset(RPReset), .Q(Q), .Empty(Empty), 
                .Full(Full)
            );
        
            initial
            begin
               Data <= 0;
              #100;
              @(Reset == 1'b0);
              for (i1 = 0; i1 < 515; i1 = i1 + 1) begin
                @(posedge WrClock);
                  Data <= Data + 1'b1;
                @(posedge WrClock);
              end
            end
            always
            #5.00 WrClock <= ~ WrClock;
        
            always
            #5.00 RdClock <= ~ RdClock;
        
            initial
            begin
               WrEn <= 1'b0;
              #100;
              @(Reset == 1'b0);
              for (i4 = 0; i4 < 515; i4 = i4 + 1) begin
                @(posedge WrClock);
                #1  WrEn <= 1'b1;
                 @(posedge WrClock);
                #1  WrEn <= 1'b0;
              end
               WrEn <= 1'b0;
               #200;
               $stop;
            end
            initial
            begin
               RdEn <= 1'b0;
              @(Reset == 1'b0);
              @(WrEn == 1'b1);
              @(WrEn == 1'b0);
              for (i5 = 0; i5 < 515; i5 = i5 + 1) begin
                @(posedge RdClock);
                #1  RdEn <= 1'b1;
                @(posedge RdClock);
                #1  RdEn <= 1'b0;
              end
               RdEn <= 1'b0;
               #200;
               $stop;
              
              
            end
            initial
            begin
               Reset <= 1'b1;
              #100;
               Reset <= 1'b0;
            end
            initial
            begin
               RPReset <= 1'b1;
              #100;
               RPReset <= 1'b0;
        end
    endmodule
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90

    3.脚本文件top.do

    vlib work
    vmap work work
    
    
    #编译testbench文件
    vlog ../sim/tb.v
    
    #编译 	设计文件
    vlog ../ip/Clarity/fifo/fifo.v
    
    #添加库文件
    
    #指定仿真顶层
    vsim -novopt work.tb
    #添加信号到波形窗 	
    add wave -position insertpoint sim:/tb//*
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    (二)仿真结果

    对照参考Lattice系列内存时序
    六、双端口FIFO(FIFO_DC) – 基于 EBR 或 LUT

    1.写入第一个数据
    WrEn=1:Wrclock上升沿写入第一个数据Data=8’d1

    在这里插入图片描述


    2.读出数据
    RrEn=1:Rrclock上升沿写入第一个数据Q=8’d1

    在这里插入图片描述

    
    
    • 1

    3,关于empty
    empty延迟了两个周期生效

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    ResultSetMetaData.getColumnName踩坑记
    Zookeeper系列——概述
    Vue----webStorage浏览器本地存储、localStorage、sessionStorage
    【VUE】微商城(十一)----购物车下订单,选择收货地址,商品详情页立即购买,取消订单,查看订单详情
    对终端的读写进行设置(2)
    英特尔神经网络计算棒
    【漏洞复现-uwsgi-目录穿越】vulfocus/uwsgi-cve_2018_7490
    Python项目移到Linux环境下出现ModuleNotFoundError: No module named ‘xxx‘解决方案
    3-2 中阶API示范
    Flume环境搭建
  • 原文地址:https://blog.csdn.net/weixin_56102526/article/details/128149073