其实和ASIC的RTL代码检测用具一样的,主要是lint的检查
nlint, spyglass什么的都可以做RTL的lint检查
B. 学习FPGA,在没有开发板的情况下用哪些软件
ModelSim要学会编写testbench
然后测试时族郑序
这个主要是verilog方面
实际使用中FPGA还设计到电路设计
以及FPGA里面的IP核使用(PLL,DSP,CPU,等)
还有FPGA与外部芯片的接口(I2C,RS232,SDRAM,FLASH等)
这些东西我觉得要实际操作的,即需要实验兆咐颂板的
如果你对这方面感兴趣
学校里有老师用单片机做事的话,就去找他们
因简答为你想学(免学费和开发板),老师要人做事情(免工资),
对于这种双赢关系,老师没道理拒绝的
C. 天奥fpga用什么软件
天奥fpga可以用ModelSimSE版本软件。
学习FPGA关键不是什么软件,而是语言。关于ModelSim 虽然这些开发软件都有自带的仿真工具,但是我们推荐使用独立激活的ModelSimSE版本,该版本功能强大,操作起来更加得心应手,是众多FPGA开发工程师的不二选择。
关于文本编辑器,之所以拿大敬使用第三方代码编辑器是因为软件自带的代码消慎编辑器在某些功能上做的并仿笑不是很好,为了加快开发效率,我们习惯选择。
D. 怎样利用quartus 2 进行FPGA的烧写测试
要在硬件上验证的话,必须的写燃灶一个可以渣皮综合的激励文件给待测模块的输入端口,编如段差译的时候带了stp的工程产生的sof,不管通过什么下载都可以用signaltap去监视信号。signaltap只是一种比较简单的方法,还可以通过串口把数据都写到上位机,直接在pc上看数据,不过这些都需要写程序去实现,相对比较复杂
E. FPGA是什么,有用吗
FPGA是在PAL、GAL等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
FPGA设计不是简单的芯片研究,主要是利用 FPGA 的模式进行其他行业产品的设裤贺岁计。 与 ASIC 不同,FPGA在通信行业的应用比较广泛。通过对全球FPGA产品市场以及相关供应商的分析,结合当前我拍掘国的实际情况以及国内领先的FPGA产品可以发现相关技术在未来的发展方向,对我国科技水平的全面提高具有非常重要的推动作用。
(5)fpga测试工具扩展阅读:
FPGA 器件属于专用集成电路中的一种半定制电路,是可编程的逻辑列阵,能够有效的解决原有的器件门电路数较少的问题。FPGA 的基本结构包括可编程输入输出单元,可配置逻辑块,数字时钟管理模块,嵌入式块RAM,布线资源,内嵌专用硬核,底层内嵌功能单元。
由于FPGA具有布线资源丰富,可重复编程和集成度高,投资较低的特点,在数字电路设计领域得到了广泛的应用。FPGA的设计流程包括算法设计、代码仿真以及设计、板机调试,设计者以及实际需求建立算法架构,利用EDA建立设计方案或HD编写设计代码,通过代码仿真保证设计方案符合实际要求,最后进行板级调胡睁试,利用配置电路将相关文件下载至FPGA芯片中,验证实际运行效果。
F. 基于FPGA的信号发生器 的TESTBENCH(测试文本)程序怎么编
1.激励的设置
相应于被测试模块的输入激励设置为reg型,输出相应设置为wire类型,双向端口inout在测试中需要进行处理。
方法1:为双向端口设置中间变量inout_reg作为该inout的输出寄存,inout口在testbench中要定义为wire型变量,然后用输出使能控制传输方向。
eg:
inout [0:0] bi_dir_port;
wire [0:0] bi_dir_port;
reg [0:0] bi_dir_port_reg;
reg bi_dir_port_oe;
assign bi_dir_port=bi_dir_port_oe?bi_dir_port_reg:1'bz;
用bi_dir_port_oe控制端口数据方向,并利用中间变量寄存器改变其值。等于两个模块之间用inout双向口互连。往端口写(就是往模块里面输入)
方法2:使用force和release语句,这种方法不能准确反映双向端口的信号变化,但这种方法可以反映块内信号的变化。具体如示:
mole test();
wire data_inout;
reg data_reg;
reg link;
#xx; //延时
force data_inout=1'bx; //强制作为输入端口
...............
#xx;
release data_inout; //释放输入端口
endmole
从文本文件中读取和写入向量
1)读取文本文件:用 $readmemb系统任务从文本文件中读取二进制向量(可以包含输入激励和输出期望值)。$readmemh 用于读取十六进制文件。清段例如:
reg [7:0] mem[1:256] // a 8-bit, 256-word 定义存储器mem
initial $readmemh ( "mem.data", mem ) // 将.dat文件读入寄存器mem中
initial $readmemh ( "mem.data", mem, 128, 1 ) // 参数为寄存器加载数据的地址始终
2)输出文本文件:打开输出文件用?$fopen 例如:
integer out_file; // out_file 是一个文件描述,需要定义为 integer类型
out_file = $fopen ( " cpu.data " ); // cpu.data 是需要打开的文件,也就是最终的输出文本
设计中的信号值可以通过$fmonitor, $fdisplay,
2. Verilog和Ncverilog命令答锋誉使用库文件或库目录
ex). ncverilog -f run.f -v lib/lib.v -y lib2 +libext+.v //一般编译文件在run.f中, 库文件在lib.v中,lib2目录中的.v文件系统自动搜索
使用库文件或库目录,只编译需要的模块而不必全部编译
3.Verilog Testbench信号记录的系统任务基辩:
1). SHM数据库可以记录在设计仿真过程中信号的变化. 它只在probes有效的时间内记录你set probe on的信号的变化.
ex). $shm_open("waves.shm"); //打开波形数据库
$shm_probe(top, "AS"); // set probe on "top",
第二个参数: A -- signals of the specific scrope
S -- Ports of the specified scope and below, excluding library cells
C -- Ports of the specified scope and below, including library cells
AS -- Signals of the specified scope and below, excluding library cells
AC -- Signals of the specified scope and below, including library cells
还有一个 M ,表示当前scope的memories, 可以跟上面的结合使用, "AM" "AMS" "AMC"
什么都不加表示当前scope的ports;
$shm_close //关闭数据库
2). VCD数据库也可以记录在设计仿真过程中信号的变化. 它只记录你选择的信号的变化.
ex). $mpfile("filename"); //打开数据库
$mpvars(1, top.u1); //scope = top.u1, depth = 1
第一个参数表示深度, 为0时记录所有深度; 第二个参数表示scope,省略时表当前的scope.
$mpvars; //depth = all scope = all
$mpvars(0); //depth = all scope = current
$mpvars(1, top.u1); //depth = 1 scope = top.u1
$mpoff //暂停记录数据改变,信号变化不写入库文件中
$mpon //重新恢复记录
3). Debussy fsdb数据库也可以记录信号的变化,它的优势是可以跟debussy结合,方便调试.
如果要在ncverilog仿真时,记录信号, 首先要设置debussy:
a. setenv LD_LIBRARY_PATH :$LD_LIBRARY_PATH
(path for debpli.so file (/share/PLI/nc_xl//nc_loadpli1))
b. while invoking ncverilog use the +ncloadpli1 option.
ncverilog -f run.f +debug +ncloadpli1=debpli:deb_PLIPtr
fsdb数据库文件的记录方法,是使用$fsdbDumpfile和$fsdbDumpvars系统函数,使用方法参见VCD
注意: 在用ncverilog的时候,为了正确地记录波形,要使用参数: "+access+rw", 否则没有读写权限
在记录信号或者波形时需要指出被记录信号的路径,如:tb.mole.u1.clk.
………………………………………………………………………………………………………
关于信号记录的系统任务的说明:
在testbench中使用信号记录的系统任务,就可以将自己需要的部分的结果以及波形文件记录下来(可采用sigalscan工具查看),适用于对较大的系统进行仿真,速度快,优于全局仿真。使用简单,在testbench中添加:initial begin
$shm_open("waves.shm");
$shm_probe("要记录信号的路径“,”AS“);
#10000
$shm_close; 即可。
4. ncverilog编译的顺序: ncverilog file1 file2 ....
有时候这些文件存在依存关系,如在file2中要用到在file1中定义的变量,这时候就要注意其编译的顺序是
从后到前,就先编译file2然后才是file2.
5. 信号的强制赋值force
首先, force语句只能在过程语句中出现,即要在initial 或者 always 中间. 去除force 用 release 语句.
initial begin force sig1 = 1'b1; ... ; release sig1; end
force可以对wire赋值,这时整个net都被赋值; 也可以对reg赋值.
6.加载测试向量时,避免在时钟的上下沿变化
为了模拟真实器件的行为,加载测试向量时,避免在时钟的上下沿变化,而是在时钟的上升沿延时一个时间单位后,加载的测试向量发生变化。如:
assign #5 c=a^b
……
@(posedge clk) #(0.1*`cycle) A=1;
******************************************************************************
//testbench的波形输出
mole top;
...
initial
begin
$mpfile("./top.vcd"); //存储波形的文件名和路径,一般是.vcd格式.
$mpvars(1,top); //存储top这一层的所有信号数据
$mpvars(2,top.u1); //存储top.u1之下两层的所有数据信号(包含top.u1这一层)
$mpvars(3,top.u2); //存储top.u2之下三层的所有数据信号(包含top.u2这一层)
$mpvars(0,top.u3); //存储top.u3之下所有层的所有数据信号
end
endmole
//产生随机数,seed是种子
$random(seed);
ex: din <= $random(20);
//仿真时间,为unsigned型的64位数据
$time
ex:
...
time condition_happen_time;
...
condition_happen_time = $time;
...
$monitor($time,"data output = %d", dout);
...
//参数
parameter para1 = 10,
para2 = 20,
para3 = 30;
//显示任务
$display();
//监视任务
$monitor();
//延迟模型
specify
...
//describ pin-to-pin delay
endspecify
ex:
mole nand_or(Y,A,B,C);
input A,B,C;
output Y;
AND2 #0.2 (N,A,B);
OR2 #0.1 (Y,C,N);
specify
(A*->Y) = 0.2;
(B*->Y) = 0.3;
(C*->Y) = 0.1;
endspecify
endmole
//时间刻度
`timescale 单位时间/时间精确度
//文件I/O
1.打开文件
integer file_id;
file_id = fopen("file_path/file_name");
2.写入文件
//$fmonitor只要有变化就一直记录
$fmonitor(file_id, "%format_char", parameter);
eg:$fmonitor(file_id, "%m: %t in1=%d o1=%h", $time, in1, o1);
//$fwrite需要触发条件才记录
$fwrite(file_id, "%format_char", parameter);
//$fdisplay需要触发条件才记录
$fdisplay(file_id, "%format_char", parameter);
$fstrobe();
3.读取文件
integer file_id;
file_id = $fread("file_path/file_name", "r");
4.关闭文件
$fclose(fjile_id);
5.由文件设定存储器初值
$readmemh("file_name", memory_name"); //初始化数据为十六进制
$readmemb("file_name", memory_name"); //初始化数据为二进制
//仿真控制
$finish(parameter); //parameter = 0,1,2
$stop(parameter);
//读入SDF文件
$sdf_annotate("sdf_file_name", mole_instance, "scale_factors");
//mole_instance: sdf文件所对应的instance名.
//scale_factors:针对timming delay中的最小延时min,典型延迟typ,最大延时max调整延迟参数
//generate语句,在Verilog-2001中定义.用于表达重复性动作
//必须事先声明genvar类型变量作为generate循环的指标
eg:
genvar i;
generate for(i = 0; i < 4; i = i + 1)
begin
assign = din[i] = i % 2;
end
endgenerate
//资源共享
always @(A or B or C or D)
sum = sel ? (A+B):(C+D);
//上面例子使用两个加法器和一个MUX,面积大
//下面例子使用一个加法器和两个MUX,面积小
always @(A or B or C or D)
begin
tmp1 = sel ? A:C;
tmp2 = sel ? B:D;
end
always @(tmp1 or tmp2)
sum = tmp1 + tmp2;
******************************************************************************
模板:
mole testbench; //定义一个没有输入输出的mole
reg …… //将DUT的输入定义为reg类型
……
wire…… //将DUT的输出定义为wire类型
……
//在这里例化DUT
initial
begin
…… //在这里添加激励(可以有多个这样的结构)
end
always…… //通常在这里定义时钟信号
initial
//在这里添加比较语句(可选)
end
initial
//在这里添加输出语句(在屏幕上显示仿真结果)
end
endmole
一下介绍一些书写Testbench的技巧:
1.如果激励中有一些重复的项目,可以考虑将这些语句编写成一个task,这样会给书写和仿真带来很大方便。例如,一个存储器的testbench的激励可以包含write,read等task。
2.如果DUT中包含双向信号(inout),在编写testbench时要注意。需要一个reg变量来表示其输入,还需要一个wire变量表示其输出
G. 有没有DSP与FPGA通信的硬件测试软件
一般搞dsp+fpga的方案会遇到这种问题
看你fgpa和dsp是通过什么连上的
如果fpga挂在dsp的emif上就可以定义一段地址空间给fpga,并在fpga内部例化若干blockram
以供dsp访问,dsp对这段地址空间进行写-读验证就可以了
其他的原腔明理也类似
例如spi接口,i2c接口,uart等等,都可以租纯的
一般没有现成的软件给你用,自己写一个就可以,弊圆咐不会太难
H. 如何简化FPGA测试和调试
获得FPGA内部信号有限、FPGA封装和印刷电路板电气噪声,这一切使得设计调试和检验变成设计周期中最困难的流程。此外,几乎当前所有的像CPU、DSP、ASIC等高速芯片的总线,除了提供高速并行总线接口外,正迅速向高速串行接口的方向发展。FPGA也不例外,每一条物理链路的速度从600Mbps到高达10Gbps,高速IO的测试和验证更成为传统专注于FPGA内部逻辑设计的设计人员面临的巨大挑战。这些挑战使设计人员会把绝大部分设计周期时间放在调试和检验设计上。设计阶段即应考虑测试问题在FPGA系统设计完成前,有两个不同的阶段:设计阶段、调试和检验阶段。设计阶段的主要任务是输入、仿真和实现;调试和检验阶段的主要任务是检验设计,校正发现的任何错误。在设计阶段不仅要设计,而且要使用仿真工具开始调试。实践证明,正确使用仿真技术为找到和校正设计错误提供了一条有效的途径。但是,不应依赖仿真作为调试FPGA设计的唯一工具,有许多问题仅仅通过仿真是无能为力的。此外,还需要提前考虑调试和检验阶段,规划怎样在线快速调试FPGA,这可以定义整体调试方法,帮助识别要求的任何测试测量工具,确定选择的调试方法对电路板设计带来的影响。针对可能选用的FPGA存在的高速总线,除了考虑逻辑时序的测试和验证外,应该充分考虑后面可能面临的信号完整性测试和分析难题。在调试阶段,必需找到仿真没有找到的棘手问题。怎样以省时省力的方式完成这一工作是一个挑战。嵌入式逻辑分析仪只能进行状态分析在设计阶段需要作出的关键选择是使用哪种FPGA调试方法。在理想情况下,希望有一种方法可以移植到所有FPGA设计中,能够洞察FPGA内部运行和系统运行过程,为确定和分析棘手的问题提供相应的处理能力。基本在线FPGA调试方法有两种:使用嵌入式逻辑分析仪以及使用外部逻辑分析仪。选择使用哪种方法取决于项目的调试需求。主要FPGA厂商针对器件的在线调试都提供了嵌入式逻辑分析仪内核。这些知识产权模块插入FPGA设计中,同时提供触发功能和存储功能。它们使用FPGA逻辑资源实现触发电路,使用FPGA存储模块实现存储功能。它们使用JTAG配置内核操作,并用来把捕获的数据传送到PC上进行查看。由于嵌入式逻辑分析仪使用内部FPGA资配盯源,因此其通常用于大型FPGA,这些大型FPGA可以更好地消化插入内核带来的开销。一般来说,用户希望内核占用的FPGA逻辑资源不超过可用资源的5%。与任何调试方法一样,还要知道这种方法存在的部分矛盾。在针脚与内部资源上,嵌入逻辑分析仪内核不使用额外的测试针脚,因为它通过现有的JTAG针脚访问内核。这意昧着即使设计受到FPGA针脚限制,您也可以使用这种方法。矛盾在于,它使用的内部FPGA逻辑资源和存储模块可以用来实现设计。此外,由于使用片内内存存储捕获的数据,因此内存深度一般相对较浅。嵌入式逻辑分析仪核心的探测非常简单。它使用现有的JTAG针脚,因此不必担心怎样把外部逻辑分析仪连接到系统上。矛盾在于,尽管嵌入式逻辑分析仪可以查看FPGA操作,但没有一种方式把这些信息与电路板级或系统级信息时间关联起培神和来。而把FPGA内部的信号与FPGA外部的信号关联起来对解决最棘手的调试挑战至关重要。在分析方法上,嵌入式逻辑分析仪只能进行状态分析。从成本与灵活性上分析,大多数FPGA厂商提供了嵌入式逻辑分析仪内核,而其价格要低于全功能外部逻辑瞎慧分析仪。虽然用户希望更多的功能,但嵌入式逻辑分析仪内核的功能无论通用性、分析方式、触发能力,还是存储和分析能力都弱于全功能外部逻辑分析仪,而用户通常需要这些功能,来捕获和分析棘手的调试挑战。
I. 如何用JTAG测试FPGA的硬件
对于altera来说,先建立基本的工程,编写代码,编译正确以后,启动signaltapii,在其中选择触发时钟,触升或竖发条件,加上需要观察的内部网络(信号),把文件存储,退吵大出signaltapii的时候软件会自动提示是否把刚才建立的文件加入工程,选择是,回到原来的工程,再次编译,生成的加载文件通过jtag加载到fpga后就可以在signaltapii中团裂进行jtag调试了。
J. 如何对已经烧好的fpga进行测试
第一,在对应厂家的编译工具软件新建一个工程。
第二,将你的 VHDL文件加入工程败让中去。
第三,添加约束文件。
第四,编译。
第五,将编译文件通过JTAG接口下载到察猛局FPGA中。
如果一切OK,那到此为止。
如果ADC数据不正确。则:
第六,代码里面增加信号分析文件。
第七,重知空新编译加载。
第八,通过厂家分析工具,查看各信号是否正确。
如果找到问题,则OK。
如果没有找到问题,则抓取更多信号,重复第六,第七,第八,直到问题解决