背景介绍

我最近在学习FPGA开发技术,用杜勇老师的《Xinlinx FPGA数字信号处理设计》一书,按照书中的例子,对 CXD301 开发板进行ADC、DAC示例的调试,使用 ChipScope 软件进行在线逻辑分析。遇到了下面的问题,并给出了解决办法。

问题1:项目不能放在虚拟机外部

项目不能放在虚拟机外部,否则执行 Xilinx 的 chipscope 综合时,会报告错误,看具体原因是无法执行 mkdir 命令!导致mkdir失败的具体原因不明,可能和无法正常访问VirtualBox的共享目录有关。

可以从日志文件E:\projects\dsp_fpga\02_AD_DA\_ngo\cs_icon_pro\coregen.log中看到失败原因。

INFO:encore:314 - Created non-GUI application for batch mode execution.
Wrote CGP file for project 'coregen'.
INFO:sim:172 - Generating IP...
Resolving generic values...
Finished resolving generic values.
Generating IP...
Gathering HDL files for icon_pro root...
Creating XST project for icon_pro...
Creating XST script file for icon_pro...
Creating XST instantiation file for icon_pro...
Running XST for icon_pro...
XST: HDL Parsing
WARNING:coreutil - XST failed for icon_pro. ERROR:HDLCompiler:1091 - "Unknown"Line 0: Save failed due to mkdir failureERROR:HDLCompiler:1091 - "Unknown" Line 0: Save failed due to mkdir failureERROR:HDLCompiler:1091 - "Unknown" Line 0: Save failed due to mkdir failureERROR:HDLCompiler:1091 - "Unknown" Line 0: Save failed due to mkdir failureinvoked from within"runXST $ComponentName GenerationOptions $TopLevel"(procedure "deliverXSTNetlist" line 15)invoked from within"deliverXSTNetlist $ComponentName {} "root" $BaseIP "(procedure "components::icon_pro::generate" line 31)invoked from within"components::${ComponentName}::generate 1"(procedure "::xilinx::sim::generation::generatePsfCore" line 59)invoked from within"::xilinx::sim::generation::generatePsfCore {chipscope_icon_v1_06_a}{icon_pro} {ALL}"ERROR:sim - XST failed for icon_pro. ERROR:HDLCompiler:1091 - "Unknown" Line 0:Save failed due to mkdir failureERROR:sim - Error found during generation.
ERROR:sim - Failed to generate 'icon_pro'.  XST failed for icon_pro.ERROR:HDLCompiler:1091 - "Unknown" Line 0: Save failed due to mkdir failureERROR:sim:877 - Error found during execution of IP 'ICON (ChipScope Pro -Integrated Controller) v1.06.a'

解决方案:将项目目录从外部的共享目录下,整个拷贝到虚拟机本机磁盘上,重新打开项目进行综合即可。

问题2:不会配置"网络连接"(Net Connections)导致实现(Implement)失败

《Xinlinx FPGA数字信号处理设计》一书中没有详细说明如何将“通道(Channel)”与"网络(Net)"相连。如果将通道直接和"线(wire)"相连,则会出现警告,并且后续的实现过程会失败。

解决方案:
Channel 必须和寄存器、BUF相连才可以。下面的连接方式才能成功。

不能直接将 CH0 和 clk 信号相连。原因如下:
在配置 Chipscope 的时候,通常需要将各个模块的信号连接到 Chipscope 的输入端口,以便进行调试和分析。在连接的时候,需要将信号通过一个寄存器来缓冲,然后再将缓冲后的信号连接到 Chipscope 的输入端口。

这是因为 FPGA 中的信号具有时序特性,而 Chipscope 是一个异步的调试工具,它的输入端口也需要满足时序要求。如果将 channel 直接连接到 wire 端口,可能会存在时序不稳定的问题,导致 Chipscope 无法正确地读取信号。

因此,为了保证信号的时序稳定性,连接到 Chipscope 输入端口的信号通常需要通过寄存器进行缓冲。这样可以确保信号的时序满足要求,同时还可以避免信号冲突和干扰,提高调试的准确性和可靠性。

书中 ADC_DAC 示例程序的 ChipScope Net Connection 配置如下所示。

我是如何找到这些 Net 的呢?是看 RTL 电路图发现的,verilog 模块中的信号命并不一定在 Net 中都有,而且要找到信号连接的BUF模块的端口,用他们分配给ChipScope的Channel才可以。

ChipScope 中 Data same as Trigger 选项的作用

在 Chipscope 工具的 Parameters 选项卡下,有一个 Data same as Trigger 选项,它是一种触发器设置模式,它可以让用户选择在何时触发信号捕获和采样,以便进行调试和分析。也是将 Trigger Ports 作为 Data Ports 的意思。

在 Data as Trigger 模式下,用户可以选择一个数据信号作为触发器,当该信号发生特定的条件时,Chipscope 将自动触发信号的捕获和采样。例如,用户可以选择一个特定的数据值、一个数据范围、或者一个特定的时钟周期作为触发条件,这样当触发条件满足时,Chipscope 将自动捕获和采样信号。

Data as Trigger 的主要作用是帮助用户在复杂的电路中快速定位和分析问题,通过触发器的设置,可以精确定位信号的采样位置,从而更快地找到问题所在,加快调试和分析的速度。同时,Data as Trigger 也可以避免由于信号的随机性和不可预测性导致的调试困难,提高调试的准确性和可靠性。

配置 Channel 和 Net 的小技巧

批量对应法:

用 ChipScope 显示捕获到的信号波形

附上 AD_DA verilog 程序

module ad_da(input clk,input rst,output ad_clk,input [7:0] ad_din,output da1_clk,output [7:0] da1_out,output da2_clk,output reg [7:0] da2_out);// 准备一个25MHz的时钟信号
reg clk25m;
always@(posedge clk)clk25m<=!clk25m;// 8位计数器,不断累加,得到频率为 50M/256 = ?Hz 的三角波
reg [7:0] cn;
always@(posedge clk)if(rst)cn<=0;elsecn<=cn+1;
// 输出到da1,dac1 会转换为模拟信号,然后馈送到 adc 芯片,于是 ad_in 会有信号
assign da1_out = cn;assign ad_clk = clk25m;
assign da1_clk = clk25m;
assign da2_clk = clk25m;reg signed [7:0] data;  // 存放数据的寄存器
// 将 AD 得到的无符号数据转换有符号数据,供 FFT 等信号处理模块使用
always@(posedge clk25m)data <= ad_din - 128;// 将有符号数转换为无符号数
always@(posedge clk25m)if(data[7])da2_out <= data-128;    // 不理解,不应该总是+128吗?不是的,因为负数是以补码形式存储,所以需要分正负处理。当是负数时,补码的二进制// 形式去掉符号位后,刚好是原值的‘补数’,所以 -128刚好对应0,也就是 1000_0000 将符号位1变为0后,就是负数的补数,正好是从小到大的排列形式,// 正好可以对应[0,127]elseda2_out <= data+128;
endmodule

如何用 modelsim 仿真带有回环的模块?

也就是像实物板卡那样,将 da 输出信号再连接到 adc 输入信号端口,进行功能仿真。
目前没有实验成功。

补充知识

如何将 8bit 的有符号数变为(准确讲是映射为)无符号数,也就是将 [-128, 127] 范围的 int8 整数转为 [0, 255] 范围的 uint8 整数。
方法是:

a  = 带符号 int8
ua = 无符号 int8if(a<0) {ua = a - 128;
} else {ua = a + 128;
}

因为 -128 的补码形式是 “1000 0000”,如果 a = -128 那么 a 的二进制补码(也就是硬件中存储的二进制数)是 “1000 0000”,
那么 -128 + (-128) = “1000 0000” + “1000 0000” = “0000 0000”,刚好就映射到 0 了。

总结规律就是:负数的MSB(最高位)变为0;正数的MSB变为1,就可以将带符号int 映射 为无符号整数了。

ChipScope 使用问题和解决方案相关推荐

  1. Chipscope信号无法找到的解决方案

    为了调试逻辑,现在很少再将FPGA中的信号引出,通过示波器或者逻辑分析仪来观察,更多的是在工程中生成stp或者cdc文件,通过signalTAP或者chipscope这两个工具来调试. 但我们发现, ...

  2. mysql并发更新数据,多用户并发修改数据解决方案。

    mysql并发更新数据,多用户并发修改数据解决方案. 在系统中,有一些如余额.资产.积分的数据,是要保证数据一致性的.如,一个人使用两个设备同时进行消费操作,如何保证数据一致性的问题. 我们一起来思考 ...

  3. Chrome不支持showModalDialog的解决方案

    Chrome不支持showModalDialog的解决方案 昨天在使用showModalDialog的时候,遇到如下问题: 如果子窗口被刷新过,那么父窗口就接受不到子窗口的返回值. 为了解决这个问题, ...

  4. GCC 链接 xxx:No such file or directory 及运行可执行文件 error while loading shared libraries: xxx.so 解决方案

    关于 GCC 提示找不到指定库文件的这个问题,通常出现在以下 2 个场景中: 利用静态库或者动态库文件实现链接操作(生成可执行文件)时,·GCC 可能会提示 xxx:No such file or d ...

  5. Docker使用遇到问题Got permission denied while trying to connect to the Docker daemon socket解决方案

    Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker. ...

  6. 【VS实践】VS解决方案中出现无法生成DLL文件

    前言: 这几天在学习牛腩新闻发布系统,突然发现标准的过程原来是从D层倒着往U层敲,在敲的过程中,遇到了一个问题:D层生成的DLL文件,在B层和U层中使用不了! 从早上10:00~15:30,自己弄了好 ...

  7. Tomcat 1099端口占用重启无效,查不到进程,改换端口无效解决方案

    不知道怎么的,突然Tomcat报错1099端口被占用 以下总结了网上可能有效的三种解决方案: 方案一对我来说无效,根本查找不到1099的进程 方案二对我来说也无效 方案三有效,关闭了hyper-v服务 ...

  8. 华为公有云架构解决方案

    华为公有云架构解决方案 华为公有云架构 华为公有云的主要服务如弹性云服务器(ECS).弹性伸缩服务(AS).云硬盘 (EVS).云硬盘备份(VBS).对象存储服务(OBS) .虚拟私有云(VPC).弹 ...

  9. 半导体与智能汽车行业解决方案

    半导体与智能汽车行业解决方案 EDA芯片仿真.IC验证.在线电路仿真:Cadence/Synopsys/Mentor软件加速. IC设计公司 帮助芯片代工厂进行Synopsys VCS,Synopsy ...

最新文章

  1. python pandas常用函数_Python pandas常用函数详解
  2. 数据结构之二叉搜索树/二叉查找数/有序二叉树/排序二叉树
  3. 用 Flask 来写个轻博客 (7) — (M)VC_models 的关系(many to many)
  4. 海思3559移植yolov3
  5. 如何规划自己的博士五年生活?
  6. STL源代码分析(ch2 内存分配)概述
  7. 如何使用ABP进行软件开发之基础概览
  8. .NET的未来包含一个开源的Mono
  9. java类验证和装载顺序_java中类的加载顺序介绍(ClassLoader)
  10. 质量故事(5)---猴子、香蕉与培训
  11. 使用 ASP.NET Core Razor 页、Web API 和实体框架进行分页和排序
  12. python从网页提取文本_从网页中提取文本
  13. Oracle用户管理命令
  14. Windows软件之——RocketDock之无法拖放图标到dock栏
  15. 【Lucene】挖掘相关搜索词
  16. 属性动画Android动画,Android动画(三)属性动画Animator与Interpolator
  17. SpringCloud—笔记(一)零基础篇
  18. 沁恒CH552G实现最小系统[沁恒8位机MCU最小系统]
  19. 如果iPhone被标记被盗或丢失 苹果将拒绝维修
  20. tensorflow.python.framework.errors_impl.InvalidArgumentError exception str() failed解决办法

热门文章

  1. flannel 实战与源码分析(五)
  2. 如何用Octave工具包
  3. t-sql语句创建表(基础)
  4. 海岛纪元如何在电脑上玩 海岛纪元模拟器玩法教程
  5. VR全景图的制作步骤
  6. Text 1 Do We Need Extra Vitamins?
  7. 百度地图多点路线规划_AI行业企业头条 |百度地图背后的路线时长预估模型!...
  8. 【1】Docker---Windows系统上安装Boot2Docker以及安装的一些问题
  9. 一支口红用了5年_经常使用的这5支口红
  10. 《致命愿望》:与魔鬼签订契约