广告

原创 Vivado 调试工具的使用 (1)

2017-9-18 20:24 375 0 分类: FPGA/CPLD

(一)调试的方法

   对FPGA的测试,是一个反复迭代,直到满足设计功能和设计时序的过程。对FPGA复杂的系统调试,就是把它分解成一个个很小的部分。有以下方法进行调试:RTL级的设计仿真;实现后的设计仿真;系统内调试。下面将介绍系统内的调试方法。


(1)系统内的逻辑设计调试

       Vivado 包括逻辑分析特性,使得设计者可以对一个实现后的FPGA器件进行系统内的调试。在系统内对设计进行调试的好处包括在真正的系统环境下,以系统要求的速度,调试设计的时序准确性和实现后的设计。系统内调试的局限性包括:与使用仿真模型相比,稍微降低了调试信号的可视性,潜在的延长了设计、实现、调试迭代的时间,这个时间取决于设计的规模和复杂度。

(2)系统内串行IO调试

   为了实现系统内对串行IO验证和调试,vivado包括了一个串行的IO分析特性,这样设计者就可以在基于FPGA的系统中,测量并且优化高速串行IO连接。这个特性可以解决大范围的系统内调试和验证问题,从简单的时钟和连接问题,到复杂的松弛分析和通道优化问题。使用vivado内的串行IO分析仪比外部测量仪器的优势在于:设计者可以测量接收器对接收信号进行均衡后的信号质量。这样就可以在TXRX通道的最优点进行测量。因此可以确保得到真实和准确的数据。

   系统内的调试包括三个重要的阶段:(1)探测阶段,用于标识需要对设计中进行探测的信号,以及探测的方法;(2)实现阶段,实现设计,包括将额外的调试IP连接到被标识为探测的网络;(3)分析阶段,通过与设计中的调试IP进行交互,调试和验证功能。

  探测阶段主要分为两个步骤:(1)识别需要探测的信号或者网络;(2)确认将调试核添加到设计中的方法。

很多时候,设计者决定需要探测的信号,以及探测的方法,他们之间相互影响。通过设计者手动添加的调试IP元件,将其例化到源代码中(称为HDL例化探测流程),或者设计者让vivado工具自动地插入调试核到综合后的网表(称为网表插入到探测流程)。下表为不同调试方法的特点



(二)创建FIFO调试工程

 1、 新建一个名为 fifo_test的工程,vivado 主界面点击 IP Catalog,然后搜索 fifo,打开FIFO Generator,按如下配置





2、新建顶层设计文件top.v

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2017/09/17 16:00:43
// Design Name:
// Module Name: top
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////

module top(
    input rd_trig,
    input rst,
    input clk,
    input wr_trig,
   
    output [7:0]dout,
    output empty,
    output full
    );
reg [7:0] data_in [15:0];
initial begin
    data_in[15]=8'h0f;data_in[14]=8'h0e;data_in[13]=8'h0d;data_in[12]=8'h0c;
    data_in[11]=8'h0b;data_in[10]=8'h0a;data_in[9]=8'h09;data_in[8]=8'h08;
    data_in[7]=8'h07;data_in[6]=8'h06;data_in[5]=8'h05;data_in[4]=8'h04;
    data_in[3]=8'h03;data_in[2]=8'h02;data_in[1]=8'h01;data_in[0]=8'h00;
 
end    
   
reg [1:0] next_state;
parameter ini=2'b00, wr_fifo=2'b01, ready=2'b11, rd_fifo=2'b10;
reg wr_en;
reg rd_en;
reg [7:0] din;
reg [3:0] j;
   
   
fifo_generator_0  fifo_inst (
  .clk(clk),      // input wire clk
  .srst(rst),    // input wire srst
  .din(din),      // input wire [7 : 0] din
  .wr_en(wr_en),  // input wire wr_en
  .rd_en(rd_en),  // input wire rd_en
  .dout(dout),    // output wire [7 : 0] dout
  .full(full),    // output wire full
  .empty(empty)  // output wire empty
);    

always @(posedge clk or negedge rst)begin
    if(rst)begin
       next_state <= ini;
       j <= 0;
       rd_en <= 1'b0;
       wr_en <= 1'b0;
       
    end
    else begin
       
       case(next_state)
       
            ini:begin
               j <= 0;
               rd_en <= 1'b0;
               if(wr_trig==1'b1)
                    next_state <= wr_fifo;
            end
           
            wr_fifo:begin
               din <= data_in[j];
               if(j==15)
                    next_state <= ready;
               else begin
                    j <= j+1;
                    wr_en <= 1'b1;
                    next_state <= wr_fifo;
               end
               
            end
           
            ready:begin
               j <= 0;
               wr_en <= 1'b0;
               if(rd_trig==1'b1)
                    next_state <= rd_fifo;
               else
                    next_state <= ready;
            end
           
            rd_fifo:begin
               if(j==15)
                    next_state <= ini;
               else begin
                    j <= j+1;
                    rd_en <= 1'b1;
                    next_state <= rd_fifo;
               end
            end
       
       
       endcase
       
    end
   
   
end  
   
endmodule

3、添加约束文件

根据 zedboard 的原理图配置相关的引脚



将配置信息另存为 fifo.xdc

set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports {dout[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dout[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dout[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dout[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dout[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dout[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dout[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dout[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports empty]
set_property IOSTANDARD LVCMOS33 [get_ports full]
set_property IOSTANDARD LVCMOS33 [get_ports rd_trig]
set_property IOSTANDARD LVCMOS33 [get_ports rst]
set_property IOSTANDARD LVCMOS33 [get_ports wr_trig]
set_property PACKAGE_PIN Y9 [get_ports clk]
set_property PACKAGE_PIN T22 [get_ports {dout[0]}]
set_property PACKAGE_PIN T21 [get_ports {dout[1]}]
set_property PACKAGE_PIN U22 [get_ports {dout[2]}]
set_property PACKAGE_PIN U21 [get_ports {dout[3]}]
set_property PACKAGE_PIN V22 [get_ports {dout[4]}]
set_property PACKAGE_PIN W22 [get_ports {dout[5]}]
set_property PACKAGE_PIN U19 [get_ports {dout[6]}]
set_property PACKAGE_PIN U14 [get_ports {dout[7]}]
set_property PACKAGE_PIN R16 [get_ports rst]
set_property PACKAGE_PIN Y11 [get_ports empty]
set_property PACKAGE_PIN AA11 [get_ports full]
set_property PACKAGE_PIN F22 [get_ports rd_trig]
set_property PACKAGE_PIN G22 [get_ports wr_trig]









广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
LoneSurvivor 2018-02-25 08:26
C++输入/输出流(2)
1. get()函数#include<iostream>using namespace std;int main(){    char s1[80], s2[...
LoneSurvivor 2018-02-23 12:19
C++输入/输出流(1)
1. 输入/输出流类层次 C++的输入/输出流类库是用派生方法建立起的,它有2个平行的基类,streambuf和ios。其他的流类都是从这两个基类直接或间接派生的。1.1  ...
LoneSurvivor 2018-02-19 11:36
C++多态(4)——特殊运算符重载和类类型转换
1.“++”和“--”的重载     运算符“++”和“--”的重载要区分前置和后置两种形式。如果不区分前置和后置,则使用operator++()或operator—()即可...
LoneSurvivor 2018-02-12 11:15
C++多态(3)——运算符重载
1.     运算符重载的定义     运算符重载也是实现多态的一个重要手段。运算符重载实现的是编译时的多态,即静态多态性。C++预...
LoneSurvivor 2018-02-12 10:31
C++多态(2)——纯虚函数与抽象类
   抽象类是一种特殊的类,它提供了统一的操作界面。建立抽象类是为了多态地使用抽象类的成员函数。抽象类是包含纯虚函数的类。 1.    ...
LoneSurvivor 2018-02-11 16:24
C++多态(1)
1.     多态      多态是人类思维方式的一种直接模拟,多态性是指不同对象接收到相同的消息时,根据对象类的不同而产...
我要评论
0
0
广告
关闭 热点推荐上一条 /1 下一条