zoukankan      html  css  js  c++  java
  • Quartus使用笔记

    Quartus

    使能DEV_CLRn等特殊引脚功能

    在bdf文件中检索网络net

    选中网络,Ctrl+F,可以查找所需的net!

    LogicLock操作步骤

    参考

     

    create new region

    创建区域

    1. 打开逻辑锁区域Logic Regions窗口 [Alt+L]

       2、添加逻辑区域

    3、定位逻辑锁在Chip Planner的区域:

    4、将设计模块适配到新建的Region

    5、关闭Optimize I/O 选项

    6、编译设计

    7、反标注节点位置[未找到]


    Altera建议使用增量式编译方式而不是使用逻辑锁,来保持当前的综合和适配结果!

    Incremental Compilation操作步骤

    参考

    ModelSim路径

    关闭网络连接

    生成TestBench模版

    执行结果:

    TestBench样例:

    //This is a simple modelSim simulation flow demo

    //Function: simple testbench of pll_tb.v

    //2004-12-2 Westor

     

    `timescale 1ns/100ps

     

    module pll_ram_tb ();

     

    reg        clk_in;    //50MHz

    reg   rst;       //asynchronous reset, low-effect

    reg  [7:0] data_in;   //data to ram

    reg        wr_en;      //wirte enable

    reg        rd_en;      //read enable

    reg  [4:0] rd_addr;     //read addrress

     

    wire       clk_out;      //clock output, 100MHz

    wire       lock;         //pll lock indicator

    wire       package_full; //indicate the ram is full     

    wire [7:0] data_out;    //data to ram

     

    initial

         begin

             clk_in = 0;

             rst    = 0;

             data_in = 8'h55;

             rd_en   = 1'bz;

             wr_en   = 1'bz;

             rd_addr = 5'b0;

            

             # 500

             rst     =1;

            

             # 1500

             rst     =0;

            

             # 1700

             rst     =1;

            

             repeat (9)

             write_ram;

            

             repeat (5)

             read_ram;

            

             repeat (8)

             begin     

             # 100

             write_ram;

            

             # 5

             read_ram;

             end

             # 8000

             $stop;

         end

     

    always # 10 clk_in =~clk_in;

     

    task write_ram;

         begin

         # 5

         wr_en = 1;

         data_in = data_in + 1;

        

         # 20

         wr_en = 1'bz;

         end      

    endtask

     

     

    task read_ram;

         begin

         # 5

         rd_en = 1;

         rd_addr = rd_addr + 1;

        

         # 20

         rd_en = 1'bz;

         end

    endtask

     

     

    pll_ram pll_ram_u1(clk_in, rst,

                    data_in,

                    wr_en, rd_en, rd_addr,               

                    clk_out, lock,

                    package_full,

                    data_out

                    );

     

    endmodule

    将测试文件添加到工程设置:

    重要-注意名称填写来自上一步骤生成的vt文件。

    波形VWF文件仿真

    Virtual Pin设置

     

    Quartus II Support for Verilog 2001

    编译结果查看:

    需要选中fitter中的summary,才能看到最终的结果:

    查看内部寄存器在ModelSim仿真的值:

    f1.Maintain Hierachy 设置为 “on”

    f2.使用层次化调用的方法即”.”,添加wire信号到要观测的寄存器

      样例:wire name = 模块名.子实例名…端口定义名或寄存器名(一定不能用实例化的实参名)

    特殊情况:SISR0寄存器虽然定义为reg[15:0]但由于某些位没有驱动,实际生成的网表是按SISR0_0、SISR0_1…来定义的,可以右击->view declaration在.vo文件查看。

    PLL模块的输入时钟一定要和设置的实际输入时钟一致否则没有输出信号:

    根据`timescale 1ns/10ps定义来计算时钟输入inclk0。

    (1ns是时间单位,10ps是仿真精度)

    充分使用模版功能查看verilog运算符功能,以及systemverilog语法:

    使用verilog2001构建可定制参数的v文件:

    1.使用了generate语法,但是还不属于systemverilog,systemverilog是verilog的扩展,语法更简洁更灵活。使用systemverilog可以更改文件后缀名为.sv或者在verilog HDL input选项选择SystemVerilog

    2.一开始编译不成功是因为使用了`include语句,直接通过Add Files添加到工程即可。否则报错…not support synthesizing nested module declaration!这个问题困惑了很久,一只以为设置宏parameter参数的格式不对。

    3.Genenrate语法一共3种:

       Generate语法要求必须有begin,且begin后面必须有name(实例化使用);genvar变量在一个文件中通用不能重复定义,变量名称不能一样,begin后面的name名称也是一样。

       1)If:

       2)Case:

       2)For:

    4、verilog2001的在quartus2的支持:借助自带的help文档,这个功能是需要单独安装的在13.0sp1版本quartus.

       Quartus/13.0sp1/quartus/common/help/webhelp/master.htm#mergedProjects/quartus/gl_quartus_welcome.htm

    5、systemverilog 在 quartus2的支持:

         同4.

    //-----------------------------------------------------------------------------
    wire FANA_flag;
    wire FANB_flag;
    //`include "fan_det.v"//Wrong:can not add this words,case to false:Not support synthesizing nested module declaration.
    fan_det  #(2) fan_det_inst
       (
             .clk(clk),//40mHz
    			.rst(rst2_n),
             .in({FANB_STUS,FANA_STUS}),//fan pin
    			.out({FANB_flag,FANA_flag}) //state out 
       );
    //---------------------------------------------------------------------------------------------
    /*
     Detect the fan state.
    */
    module fan_det
    #(parameter N=1)//the number of the fan.
    (
             input clk,//40mHz
    		input rst,
             input [N-1:0] in,//fan pin
    		output reg [N-1:0] out //state out 
    );
    reg            clk_div;                   //0x1A286分频输出
    reg     [15:0] clk_count;                 //分频计数器
    reg     [15:0] min;                       //一分钟寄存器
    //
    reg        [N-1:0]    FAN_D1;      //用于FAN_STUS输入同步,且转为单CLK脉冲
    reg        [N-1:0]    FAN_D2; 
    wire       [N-1:0]   FAN_trigger;         //风扇单CLK脉冲输入
    //
    reg    [15:0]  FAN_count[0:N-1];           //风扇转速脉冲计数器     
    //
    assign    FAN_trigger =  (FAN_D1)  & (~FAN_D2);//bit &
    always@(posedge clk or negedge rst) //同步
       begin
         if(~rst)
           begin
             FAN_D1 <= {N{1'b0}};
             FAN_D2 <= {N{1'b0}};
           end
         else
           begin
             FAN_D1 <= in;
             FAN_D2 <= FAN_D1;
           end
       end    
    //SystemVerilog
    /*
    ACTION: 	Set the Verilog Input Version for the file to SystemVerilog_2005 
    or save the file as a SystemVerilog Design File (.sv).
    */
    genvar i;
    genvar j;
    generate
      for(i=0;i<=N;i=i+1)
       begin:fan_cnt//name
    		always@(posedge clk or negedge rst)
    		  begin
    			 if(!rst)
    				FAN_count[i]<=16'h00;
    			 else
    				begin
    if(( min >= 16'h0BEB ) && ( FAN_trigger[i] ))//上电5秒后开始计数,FANA_STUS为高
    					 FAN_count[i] <= FAN_count[i] + 16'h01;
    				  if( min == 16'h5372 )    //计数35秒后,清零
    					 FAN_count[i] <= 16'h00;
    				end
    		  end
       end
    endgenerate
    //
    generate
      for(j=0;j<=N;j=j+1)
       begin:fan_cout//name
    		always@(posedge clk or negedge rst)
    		  begin
    			 if(!rst)
    				out[j] <= 1'b0;
    			 else
    				if( ( min >= 16'h5370 ) && ( min<=16'h5372 ) )
    				  begin
    			 if(FAN_count[j] >= 12'h3E8) //半分钟分扇发出的脉冲大于1000个
    						begin
    						  out[j] <= 1'b0;
    					 end
    					else
    						begin
    						  out[j] <= 1'b1;  //小于风扇转速过低标志位置高
    						end
    					end
    		  end
    	end
    endgenerate
    endmodule 
    

    UDP使用:

    不可忽略的警告:

    1、使用第三方EDA工具仿真PLL需要1ps的时间单位:

    • Warning (202000): An incorrect timescale is selected for the Verilog Output (.VO) file of this PLL design. It's required that the timescale should be 1 ps when simulating a PLL design in a third party EDA tool.

    2、unsafe behavior 暗指毛刺glitch:

    3、Modelsim Altera performance:

    辅助编辑器Notepad++quartus自带的编辑器功能有限,唯一特色就是具有Template功能

    1、分栏功能使用:

    左击文件的标签页不放拖到空白处,放开后选择“复制到另一视图”

    右击分页线选择旋转可以改变分栏方向

    2、更改文本的编码,在quartus中显示中文:

    3、层次折叠及快捷键:

    折叠快捷键推荐”ALT+2”

    4、快速打开文件所在的文件夹:

    5、带颜色代码粘贴功能:

    先选中要粘贴的代码,再选择”插件->NppExport->Copy RTF tp clipboard”

    6、值得推荐的自带Template功能:

    芯片验证UVM方法:

    仿真分类:

    Testbench参考模板:

    光标定位设置:

    add wave语法:

    add wave -hex -group CONTROL

    /AILC_vlg_tst/i1/inst3/inst2/CONTROL_15

    /AILC_vlg_tst/i1/inst3/inst2/CONTROL_14

    /AILC_vlg_tst/i1/inst3/inst2/CONTROL_13

    /AILC_vlg_tst/i1/inst3/inst2/CONTROL_12

    /AILC_vlg_tst/i1/inst3/inst2/CONTROL_11

    /AILC_vlg_tst/i1/inst3/inst2/CONTROL_10

    /AILC_vlg_tst/i1/inst3/inst2/CONTROL_9

    /AILC_vlg_tst/i1/inst3/inst2/CONTROL_8

    /AILC_vlg_tst/i1/inst3/inst2/CONTROL_7

    /AILC_vlg_tst/i1/inst3/inst2/CONTROL_6

    /AILC_vlg_tst/i1/inst3/inst2/CONTROL_5

    /AILC_vlg_tst/i1/inst3/inst2/CONTROL_4

    /AILC_vlg_tst/i1/inst3/inst2/CONTROL_3

    /AILC_vlg_tst/i1/inst3/inst2/CONTROL_2

    /AILC_vlg_tst/i1/inst3/inst2/CONTROL_1

    /AILC_vlg_tst/i1/inst3/inst2/CONTROL_0

     

    force语句:

    在两个仿真器中,force保持一个值直到它被release,而一个deposited值保持其值仅到信号更新。在Verilog-XL中, force命令使force节点减速,但可以在一个表达式和一个信号之间创建一个连续关系。它可以为一个位或部分赋值,而$deposit只能影响整个线网或寄存器。

    使用相对NativeLink路径:

       使用这种方式路径比较干净易于查看,没有特殊符号产生。

     

    自定义仿真脚本

      先使用自动生成,拷贝修改后改为自定义,可以保留自己需要的波形及仿真操作:

    同时关闭自动sim脚本生成功能,否则脚本回循环不能定位到上图指定的脚本:

    关于路径空格报错:

     有3种解决方式:

    1、

    2、在空格前加反斜杠

    3、使用花括号

    仿真文件:

    VCD

    Wlf文件

    do文件

     

    Task & event:

    $monitor:

    Toggle Leaf Names:

            

    ModelSim保存波形设置:

    synthesis preserve:

    这个命令不适用于端口,适用于内部逻辑,只要实际用到了该reg基本可以保留,

    一般找不到(在modelsim的列表里查找)是因为虽然定义了实际没有使用到,被优化掉了。

    引脚配置修改QSF文件:

    Quartus裁剪:

    Dsp builder 安装:

    32位 dsp builder 安装步骤 2018.11.25 wuhou

    先安装matlab,再重新安装dsp builder:

    1、合并两个license文件,并新建LM_LICENSE_FILE路径在用户和系统环境变量

    2、替换目录下的两个dll,原先的dll改为bk

    C:altera13.0sp1quartusdsp_builderin

    验证:找一个自带的demo,双击看是否可以编译及Export:

     

    Dsp builder  Path设置:

    查看引脚配置类型:

    FIR IP核使用测试:

    简介:

    在时域中,FIR滤波器的输入/输出就是一个输入信号与单位脉冲相应的卷积。离散方程为y(n)=x(n)*h(n)=∑x(k)h(n-k)=∑h(k)x(n-k),其中y(n)为滤波输出,x(n)为采样数据,h(n)为滤波抽头系数.设计FIR滤波器就是要找到N个系数N-1阶滤波器通常需要N个系数描述,通常需要N个乘法器和N-1个2输入加法器实现。根据FIR表达式,滤波器实质上就是进行乘累加运算,乘累加的次数由滤波器阶数决定。其串行结构如图:

      对于滤波器的因数也可以用Matlab的FDATool工具得到,一般可在DSP程序中使用,对于FPGA可直接使用自带的IP 核。

    实验参数:

      36阶,16位无符号数据输入,带通(2.5K~7.5K),采样频率设为20KHz,可以设置输入通道数,这里选择了1个作为测试,可视具体情况而定。

    Matlab仿真文件说明:

     一共四个文件,其中output.txt为执行之后的输出文件,主文件如下所示为fir_1_model.m直接运行即可看到滤波器效果。主要用来验证FIR滤波因数的正确性。

    重要使用说明:

    1、Quartus13.032位上可以使用FIR IP核,但64位电脑不行,对于64位电脑建议使用15.0版本。

    2、同时对应的IP核需要对应的破解文件,否则仿真会报错,license见附录。

    3、对于signal tap文件打开卡顿时由于你编译次数太多,保留了太多log,导致文件很大,建议删去。

    4、想要读取ram模块内容时建议先打开 ,把文件下载到FPGA,再打开 直接监控或者读取状态并设置自己想要的标志位。Ram模块可以读取也可以通过Jtag写入注意选择正确的更新图标,不要弄反了^_^

    5、大的工程尽量分开为几个小工程编译,否则时间太耗费了。

    6、IP核的目录在 ,和quartus是单独并列的一个文件夹,一共不到800MBits对于13.0,作为精简版如不需要可以去掉。实际单独拷贝过来,试过不能用(会卡在启动界面上),还是需要完成安装。

     

    EPCQ:

    时序分析:

    1、打开时序分析工具tools->TimeQuest Timing Analyzer

    2、建立时序网表Netlist->Create Timing Netlist

    3、新建sdc文件并编辑,插入Create Clock约束【告诉时序分析输入时钟的频率大小】,完全不需要手写任何代码

    关于高版本打开低版本产生的错误警告可以通过修改qsf文件屏蔽

    singal tap:

    改了出发条件的模式选项也需要重新编译:

     

  • 相关阅读:
    MySQL系列(四)--数据库结构优化、范式化与反范式化
    Java数据结构和算法(二)--队列
    Java数据结构和算法(一)--栈
    MySQL系列(三)--MySQL存储引擎
    Java集合(六)--ArrayList、LinkedList和Vector对比
    Java集合(五)--LinkedList源码解读
    Java集合(四)--基于JDK1.8的ArrayList源码解读
    P1048 采药(洛谷,动态规划递推,01背包原题)
    P1091 合唱队形题解(洛谷,动态规划LIS,单调队列)
    语法摔过的坑(用来给自己看的,粗糙,勿点)
  • 原文地址:https://www.cnblogs.com/time93/p/13246436.html
Copyright © 2011-2022 走看看