(一)调试的方法
对FPGA的测试,是一个反复迭代,直到满足设计功能和设计时序的过程。对FPGA复杂的系统调试,就是把它分解成一个个很小的部分。有以下方法进行调试:RTL级的设计仿真;实现后的设计仿真;系统内调试。下面将介绍系统内的调试方法。
(1)系统内的逻辑设计调试
Vivado 包括逻辑分析特性,使得设计者可以对一个实现后的FPGA器件进行系统内的调试。在系统内对设计进行调试的好处包括在真正的系统环境下,以系统要求的速度,调试设计的时序准确性和实现后的设计。系统内调试的局限性包括:与使用仿真模型相比,稍微降低了调试信号的可视性,潜在的延长了设计、实现、调试迭代的时间,这个时间取决于设计的规模和复杂度。
(2)系统内串行IO调试
为了实现系统内对串行IO验证和调试,vivado包括了一个串行的IO分析特性,这样设计者就可以在基于FPGA的系统中,测量并且优化高速串行IO连接。这个特性可以解决大范围的系统内调试和验证问题,从简单的时钟和连接问题,到复杂的松弛分析和通道优化问题。使用vivado内的串行IO分析仪比外部测量仪器的优势在于:设计者可以测量接收器对接收信号进行均衡后的信号质量。这样就可以在TX到RX通道的最优点进行测量。因此可以确保得到真实和准确的数据。
系统内的调试包括三个重要的阶段:(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条评论)
登录后参与讨论