几个问题:
Q1:ISE设计HDL完毕并导入至XPS作为IP核之后,再在XPS中打开并修改HDL代码后,XPS不会自动检测相应的改动,无法更新BitStream。
A1:XPS不会自动检测改动,那么就手动来吧,具体操作如下:
菜单栏依次选择 Hardware –> Clean Hardware,清除XPS生成的过程文件之后,再选择Generate BitStream重新生成BitStream就可以了。
Q2:在SDK中编写的程序使用到一些数学函数,如round()、pow(),编译时出现 undefined reference ‘round’(pow) 错误。
分析:在使用到round()函数的文件中已经包含了math.h文件,但没有作用,估计是编译或者链接过程出现了问题。
A2:查看makefile相关文件,修改gcc链接参数,添加 –lm 指令。
PS:-l + x 指令用于指定 x库,-lm是链接数学库的意思。
小经验:
1、使用Xilinx的仿真软件ISim时,当ISim打开的情况下,在ISE再次运行“Simulate Behavioral Model”,有可能出现错误。可以关闭ISim,运行“Behavioral Check Syntax”之后,再运行“Simulate Behavioral Model”,应该就不会出问题了。
2、关于代码风格
前几天有个同事遇到一个让人头疼的问题:“手头有一份源码且注释很少,除此之外几乎没有任何资料,在配置串口时不知道如何使能校验…”
我去找他闲聊的时候,说到这个,我就大致看了一下程序,看到一个名为PAREN的符号(姑且让我这么叫吧),我就信誓旦旦的说:“这个不就是校验使能吗?”他说“你又不懂这个操作系统,我见到一份资料上说这是用来使能 停止位 的”,我也不好说什么,因为我确实不懂,不过还是劝他试一下,结果问题解决了,他直接凌乱了……
校验的英文单词是parity,后面的en我不知道是不是enable的意思,但是从命名上可以看出PAREN和校验是有关系的。
这个事得到教训如下:i)学好英语 ii)对变量、函数的命名最好具有自明性 iii)可移植性好的程序应该有良好的注释。
3、实例化底层元件时,修改相应的参数值,语法如下:
被引用模块名 # (参数1,参数2,…)例化模块名(端口列表);
举例:我设计了一个显示时序控制模块,用到了vesa标准中很多参数,如同步头像素个数,前肩像素个数等,为了方便移植,使用了参数,生成不同分辨率的时序时只需要对照vesa标准修改相关参数就可以了。
timing_sig #(
.H_RIGHT(0),
.H_FRONT(24),
.H_SYNC(136),
.H_BACK(160),
.H_LEFT(0),
.H_ACT(1024),
.H_TOTAL(1344),
.V_BOTTOM(0),
.V_FRONT(3),
.V_SYNC(6),
.V_BACK(29),
.V_TOP(0),
.V_ACT(768),
.V_TOTAL(806)
)
timing(
.iClk(clk40M),.iRst_n(Rst_n),
.oHsync(oHsync),.oVsync(oVsync),
// .oHact(oHact),.oVact(oVact),
// .oDe(oDe),.oClk(oClk),
.oX(X),.oY(Y)
);
最后记录一下调用PLL时出现的一些错误
Q3.1:综合时的错误 “ERROR:Xst:2035 - Port has illegal connections. This port is connected to an input buffer and other components. Input Buffer:
网上搜到解决方法如下:
XILINX对上述错误的解决方法是:
----------------------------------------------------------------------------------------------------------------
XST - "ERROR:Xst:2035 - Port has illegal connection. Port is connected to input buffer and following ports Port of instance with type "
问答编号#
22658
型号
XST General
最后更新日期
2007-04-11 00:00:00.0
记录状态
Active
关键词
XST, IBUF, OBUF, netlist
疑问描述
Keywords: XST, IBUF, OBUF, netlist
When attempting to instantiate a netlist, the following error occurs in XST:
"ERROR:Xst:2035 - Port has illegal connection. Port is connected to input buffer and following ports:
Port of instance with type FDCEC"
解决方案
This error will occur if the instantiated netlist contains I/O ports. There are two ways to fix this error:
1. Generate the instantiated netlist without I/O ports.
2. Instruct XST not to add I/O Buffers.
Please refer to the XST User Guide on how to disable the automatic I/O Buffer insertion.
---------------------------分割线----------------------------------------------------------------------------
于是我找到XST User Guide文档,按照文档所说的禁掉自动I/O Buffer insertion 功能。具体做法
选中synthesize,然后process->properties->Xilinx Specific Options,把add I/O buffer 的勾去掉。
去掉勾后,synthesize通过。
综合错误是解决了,但是实现时(Implement)出现新的错误:
Q3.2:ERROR:NgdBuild:924 - input pad net 'clk' is driving non-buffer primitives
出现上述错误的原因:
字面意思是说输入信号clk未经buffer就用来驱动其他primitives了,这个primitives估计指的是我们用做输出的pad。字面意思不难理解,可是怎么修改呢。
在我们的这个例子中,clk有两个load,一个是直接到输出端的test pin,另一个是到内部PLL作为源时钟来产生系统内部时钟。连接PLL时,输入信号先要连接到内部buffer以产生较强的驱动能力,从而保证时钟的时序质量。但是由于输入信号的另一分支不经过任何电路就直接连接到了输出pad,所以存在一种可能,即连接buffer的分支会被短路,从而失去预期的效果。正因为如此,ISE给出了错误警告。
理解这一点以后,解决办法就有了。比如选择CLK经过PLL后无相位差的时钟输出作为test pin,可以达到同样效果,当然会有1个clock的延迟,但是对于时钟信号,这是观察不到的。
另外,如果CLK没有驱动PLL,只有输出到test pin这一个load,那么上述的错误警告就应该不会产生了。
If multiple IBUF (and OBUF) type components are connected in series, NGDBuild reports the errors as listed above. Examples of IBUF-type components that should not be connected together include the following
即具有输入缓存(或输出缓存)的组件,不能够连接在一起。否则NGDBuild将报错。
关于这个问题我还没有理解的很透彻,感觉问题稀里糊涂的就被解决了,由于最近有点忙,所以先记录一下,以便下次碰到同样问题查阅。