<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
转载自:http://hi.baidu.com/dezochen/blog/item/e42c23caa1487b8cc91768db.html
1、问:xilinx 下载错误,请高手指点,谢谢 ERROR:iMPACT:583 - '1': The idcode read from the device does not match the idcode in the bsdl File. INFO:iMPACT:629-'1': Device IDCODE : 000000010000000000000000
00000011 INFO:iMPACT:630-'1':Expected IDCODE: 00101001010100000010000010010011 PROGRESS_END - End Operation. Elapsed time = 2 sec.
答: A)我以前碰到过,可能有两方面的原因: 1。在xilinx 早期的coolrunner 器件中,由于是别的厂家代工,芯片里面的IDCODE 本来就不对,这种情况,你需要修改库里的相应型号的bsdl 文件。就可以了。 2。大多数情况下,估计是你的下载电缆信号完整性不好,读出的IDCODE 不对。在这方面想想办法! B)主要还是看看你的下载线吧!!! C)搞定了,下载板的问题,有一个电容太大了,换掉就OK 了 D)电缆检测到的信号和器件的型号不匹配碰到这种问题最烦了,只好试了 1。换一个原装电缆 2。改一下并口的模式 3。TMS,TDI,TCK 加一下上拉 E)主要是检查下载电缆,我原来也是这样的错误
2、问:JTAG
答:关于在JTAG 方式下,使用impact 发生的各种问题(初始化JTAG 链找不到器件,出现很多unknow 设备,正确识别但下载不成功)原因,偶发表个人的粗浅认识如下:问题原因分析: 1)FPGA JTAG 链的设计错误; 2)线缆问题(过长)或者自行设计的下载电路问题(设计错误、元器件上板的焊接参数不对...); 3)器件质量问题(下载电缆或者下载电路、FPGA 等元器件的质量问题~); 4)其它电路设计问题(供电情况:FPGA 供电、下载电路的数字芯片的供电等等是否正常?设计情况:自行设计的下载电路如果用到CPLD,其中的设计是否正常?等等....)排查建议: 1)通常情况下,1)和2)产生问题的可能性比较大;3)和 4)产生问题可能性相对少些,在排除1)和2)后,可以转入3)和4)的检查; 2)如果下载线缆是购买的,质量一般可以保证; 3)如果有替代品(下载线缆、下载电路、其他带有FPGA 或者CPLD 的板子),也使用排列组合快速推断问题的部位; 4)如果有条件的话,使用记忆示波器,跟踪检测那几根JTAG 信号。关于JTAG 链的理解,请参考xilinx 相关文档资料~
3、问:MOM1M2 接高电平的时候 是应该接5V 还是接VCCO 啊?
答:看你所用芯片的datasheet。3.3 是io 口电压vcco,2.5 是核电压vccint。 4、问:为何不能识别下载电缆?答:有长度限制,原装下载线都有1 米多,自己做的最好不要超过50cm,长的话校验的时候老出错,或者不报错,但实际逻辑并没下进去
5、问:chipscope 怎么使用啊?
答: A)chipscope 说白了(不专业点)就是一种在你综合的网表中插入观测信号的模块!利用你没有使用的所剩的blockram 来把采集到的信号放如ram 中!最后从插入的模块中输出! 不能输入信号!只能看! 要看什么 和看深度的多少由你的FPGA 中剩下的ram 决定!至于采样的信号所需要满足得条件为触发条件一般用默认就可以了。 如果用高级或者看 信号沿之类的就看看手册! B)首先chipscope 不如altra 的signalTAP 来的方便,我觉得这个是xilinx 所不应该的。其实使用很方便,chipscope 的mannual 讲的很详细,我这里可以重复一下: 1,在你的设计里add new source 2,选择chipscope definition and connection 3,打开你所建立的新文件,cdc 格式,就可以在里面进行信号的添加了,很简单,你只需要next 然后稍微改些东西就可以了。 4,分成三步:a),加入trig 信号;b),加入获取设置;c),加入所需察看的信号在modify connections 的右边有net connections,其中包括了clk,trig 和data 信号,这里的clk 不是什么信号都可以的,必须是bufg 的才行。data 也有要求,不是所有的都可以拿出来看的,具体哪些可以看,哪些不可以看,我也不太清楚,每次都是试,望高手指教!所有的insertor 配置完成后,就可以选inserter 将其插入到你的设计里,然后回到ise,run 一下implement 就可以了,记住下载不能用cclk,必须用jtag 下载,否则不能工作。生成jtag 的下载文件,就可以用chipscope 观看了,电开后先打开cable,然后从device 将逻辑下载进去,在设置好了trig 信号后,就可以run 了,等你的硬件逻辑trig 信号满足条件,就可以将rom 里的数据通过cable 发送上来。心得:总之,有比没有好,调试时还是非常方便的,可惜很不好用,远不如 altra 的signalTAP 方便,比如,不支持bus 的自动分配,每次查看bus 时,都是手动分配,累死了,而signalTAP 会自动帮你完成这些工作,还有就是信号没有名字,只有标号,害得每次都是自己取名字。还有很多不爽的,就不说了,毕竟xilinx 是大公司,我们小人物就不多说了。其他的你们自己都体会吧! C)其实很容易用的啦。比如在ISE6.3 或7.1 中.进ISE,打开你现有的ISE 工程(布线完成的工程)。选菜单新建一个文件,选CHIPSCOPE 类型,然后就可以在PROCESS 列表中双击该CHIPSCOPE 小图标进入,开始连探头的线了。跟上面12 楼的朋友说的过程差不多。我上回只用10 分钟就教会一个新同事用CHIPSCOPE。信号标号的问题,是根据EDIF 网表中的名字命名。具体EDIF 中的信号命名是有综合器决定的,如果你的综合器没有改信号名,就和代码中的名字一样的。连BUS 的问题,如果你的EDIF 是BUS 展开成单个信号的,需要自己combine BUS。还好了,只用连一次,及时保存下来就可以。
6、问:请问用XST 综合怎样指定某个信号不使用全局时钟资源?
答: ISE 中好像不能约束,用SynplifyPro 可以实现约束,但是ISE 自动指定其为全局时钟,可能的确因为该信号load 的太多了,有必要考虑用全局时钟,片子的全局时钟有4 个的嘛,如果不是很紧张,有必要连接到全局时钟上。而一般的问题是,这个信号并没有连接到全局时钟脚上,这个解决办法就是:使用一个iBuf library unisim; using unisim。compand。all (具体记不清楚了,用ISE 的向导生成的文件前面这一段代码是注释的)然后用port map 将你的这个信号的输入脚映射到ibuf 的I 脚上,然后ibuf 的O 脚就可以从内部链接到全局时钟上,这是经验哦,^_^,在xilinx 的官方网站的问题回答中我见过非常简洁的描述:“使用一个ibuf 把信号引回到全局时钟网络上去”。就是这样做的。
7、问:对于每一款FPGA 芯片,都有一个速度等级的要求。例如,-5,-6 等等这代表着什么意思呀?
答: A)-5, -6 代表速度不同。XILINX 的话6 比5 快,ALTERA 则相反。速度不同体现在: 1,同样的模块可达到运行频率不同;2,内部MEMORY 资源读写速度不同;3,引脚输入输出TIMING 不同 ( Tsu, Th, Tco 等) 。具体的要比较DATASHEET,当然更快的芯片价格也高。 B)对于完全相同的代码,理论上上片以后速度-7>-6>-5。但是价格-6 都是-5 的2 倍了~总体上说其实,速度差距不会太大,大约在10%-20%以内。实际就是 XILINX 生产出来后检测速度快的就标志为-7 哈~~~~以此类推对于实际使用,如果不是特别严格,还是用-5 的好`~~因为价格差距太大。
8、问:如何提高算术运算的速度?
答: A)加了流水,跑到120MHz,继续加跑到了180MHz; B)如何在virtexII 里面实现计算: addr(17:0) = v(9:0) * 200 + h(9:0) / 4 在这个案例中: 1. 乘法是10bit 输入,乘固定数。这个可以优化。200 是 11001000 可能不用专用乘法器的综合结果可以更快。 2. 除法是/4,所以直接取高8bit,不用算,也不用占任何资源。 3.加法实际上是 18bit+8bit 简单的把加法和乘法分成3 个时钟周期来做, 尝试不使用专用乘法器,先x3, 再加,再加,估计就可以达到140Mhz. 你在综合器选项中记得 : a. 不选resource sharing, b. 打开retiming, c.检查所有上面提到的变量都是寄存器。 d.所有寄存器都要同步复位. e.不加也不看I/O 约束, f. 把时钟约束到150Mhz g. fsm explore , fsm optimize 打开 h. 不需要自动插入I/O pad 另外 . 在布线器中也要选择不自动插入I/O pad,按速度优化,努力程度高!如果你要挑战性能极限,可以把整个计算过程拆成更多拍>3,10bit*3 还可以再拆成多拍。 :p
9、问:关于simprim 库
答: simprim 是个仿真库,不能用于综合。所以通常在比较规范的编码规范中,为了把在综合时期和仿真时期使用同一套代码,都会在simprim 的引用语句前面加上 'Systhesis Translate off/on’ 或同等功效的语句,使对simprim 的引用在布线时期被忽略。
10、问:FPGA 能够实现固定延时吗?
答: A) 使用同步设计,用寄存器+计数器应该可以做到。寄存器保存信号值,计数器计算延迟时间。 B)长远考虑还是用计数器+寄存器做。 C) 可以使用FIFO 或者SHIFT REGISTER LOOK UP TABLET 11、问:timing analyzer 显示频率能达到我的要求,为什么还是有问题?答:要分离一下是 外部接口的问题,还是内部逻辑的问题。如果Timing 覆盖全面, Timing Analyser 的信息还是比较可靠的。建议分析I/O 以及外围芯片的TIMING 是否满足时序要求。
12、问: Number of RPM macros: 8
答:留意 “ Number of RPM macros: 8 ” 也就是说你使用的IPCORE 在生成的时候时带有 相对定位宏信息的。建议取消相对定位宏试一试。你可以: 1. 在生成core 的时候选无RPM 2. 或者,在布线选项中选择 忽略 RPM 信息
13、问:如何实现复杂算术表达式的计算?
答:个人认为你应该先确定用什么硬件资源来存储两个矩阵和中间结果,还有你计划用多少个运算部件。 然后设计整个控制流程,分划流水线。这样整个构架就一步一步细化。
14、问:如何计算门数
答: FPGA 等效门数的计算方法有两种,一是把FPGA 基本单元(如LUT+FF,ESB/BRAM)和实现相同功能的标准门阵列比较,门阵列中包含的门数即为该FPGA 基本单元的等效门数,然后乘以基本单元的数目就可以得到FPGA 门数估计值;二是分别用FPGA 和标准门阵列实现相同的功能,从中统计出FPGA 的等效门数,这种方法比较多的依赖于经验数据。对于第一种方法,FPGA 包括LUT/FF/RAM 等资源,分析各种资源等效门数时,总原则是等效原则,就是实现相同的功能,在标准门阵列中需要的门数就是FPGA 该资源等效门数,例如实现一个带寄存器输出的4 输入XOR,在FPGA 中需要用一个LUT 和1 个FF 实现,在标准门阵列中一般要用21 个与非门实现,于是1 个LUT+1 个FF 等效于21 个门。对ESB(BRAM),由于用标准门阵列实现1bit 的RAM 时一般需要4 个门,因此ESB/BARM 做RAM 使用时,1bit 等效4 个门,对 Altera FPGA 中一个2048bit 的ESB,等效门数为8K。光靠这些数据还不能比较准确地计算出FPGA 的等效门数。因为这只是一种简单情况,实际情况要复杂很多。例如,如果实现的是带寄存器输出地2 输入XOR,FPGA 也要用1 个LUT+ FF,而标准门阵列只需要8 个NAND,于是1 个LUT+1 个FF 只等效于8 个门。同时特定功能的实现,在不同的标准门阵列系列中需要的门数也不一样,因此等效门的计算只能是个大概的数值。也就是说对于某一具体型号FPGA 的门数估计,与FPGA 资源的用途有密切关系。LUT 用于实现2 输入XOR 和4 输入XOR 等效门数不一样(分别为1 和13);FF 不带异步清零、复位、时钟使能和带这些端口的等效门数不同(分别为8 和13);ESB(BRAM)做RAM 使用时,1bit 等效4 个门, 1 个2048bit 的BRAM 等效8K 门,但是做查找表使用时可能只相当于不到200 门。因此估计FPGA 的等效门数需要做更细致的分析。 图1 显示了EP20K 系列的等效门数等参数,下面以EP20K1000E 为例详细说明FPGA 等效门数的估计方法。(1)计算逻辑阵列的等效门数:估算EP20K1000E 的门数时,把FPGA 特定资源和LCA300K 标准逻辑阵列的门数(LSI LCA300K Data Book)比较,可以对 FPGA 等效门做出估计。FPGA 一个LUT+FF 等效门数计算如图2 所示 即LUT+FF 等效于8~21 个门,上限和下限分别由实现简单函数、复杂函数分别界定。 APEX20K 的等效门数也可以根据经验数据获得,把超过100 个针对4 输入LUT 的设计用FPGA 实现,同时用LCA300K gate arrays 和Design Compiler 实现,比较相同的设计FPGA 所用的LE 数目和LCA300K 所用的门数可知,每个LE 相当于 12 个门。EP20K1000E 有38400 个LE,于是相当于46 万门。(2)计算ESB 的等效门数 RAM 中一个bit 所需要的门数与RAM 的体系结构、工艺、厂商等有关,一般而言,1bit 相当于4 个门,Altera 也采用这个标准,这样可以方便地估计ESB 等效门数。 计算ESB 等效门数也可以采用和LSI LCA300K 比较的方法,即通过与实现相同容量RAM 在LCA300K 所用的门数相比较,从而得到ESB 的每一bit 相当于多少门,从而计算出ESB 的等效门数,参考图3。从上表可见,4gates/bit 是一个比较合适的估计,于是EP20K1000E 的ESB 等效门数为160 ESBs X 2,048 bits per ESB X 4 gates per bit = 1,310,720 gates,即约为130 万门。总而言之,对EP20K1000E,LUT+FF 等效门数约为46 万(经验数值),ESB 全用作RAM 时等效门数约为130 万,所以最大系统门数为170 万。结论:FPGA 等效门数估计方法可以是把FPGA 资源基本单元(如LUT+FF, ESB)和实现相同功能的标准门阵列相比得到FPGA 基本单元等效的门数,然后乘以单元的个数得到整个FPGA 等效门数。也可以是实现很多设计,和用标准门阵列相比,从中统计出等效门数。FPGA 的等效门数估计一般分为LUT+FF 和ESB (BRAM)两部分,LUT+FF 等效于8~21 个门,典型值为12;ESB 做RAM 使用时,一般相当于4 门/bit,此时估计出的门数最多,如果ESB 做乘积项/LUT 则等效门数大大减小,例如对EP20K1000E,前者为130 万,后者为2 万
15、问:当ise 调用ip 核时,用synplify 是不是不能综合ip 核阿
答:对于 IP 的综合,因为是加密,所以综合器都是认为是黑盒子。对于综合器而言,它只用知道端口定义和名称就行了。所以,你在第三方综合工具,不能看到底层的结构,综合器没有对此综合。在下一步适配和布线,软件才将IP 解析为硬件源语,形成硬件结构。在Matlab 中使用VHDL 或Verilog 也是同样的。实际中,我们关心的只是输入什么样的值,就能产生什么样的结果。也是一种知识产权的保护措施。 XILINX 中,能直接调用用的三方工具。在Altera 设备中,需要在第三方工具中,生成网表文件edf 再到Quartus 中进行适配布线。设计流程是这样的。
16、问:ddrsdram 控制器
答:坦白说, DDR SDRAM 的设计,最好使用原厂的全套代码, 以及用原长的PCB 和原理图作为参考,能抄就抄.原因是,我们中小型用户通常在测试仪器和PCB Layout 的信号完整性仿真方面,设备和经验都 不够强. Memory 接口的DEBUG 有比较麻烦.通常出现的问题是信号完整性的问题和TIMING 的问题. 如果是象我同事现在做Virtex-4 的200Mhz DDR SDRAM MEMORY 接口,尽量参考 ML461 demo 板的全套东西.高速内存接口,自己做代价太大,调试和验证经验需要很高的水平. 建议你review 设计,看看以下因素: 1. PCB 布线方面通常要求端配,要求DQ 和对应DQS 要走等长,过孔数目要少. 一驱多的时候需要考虑拓扑关系. 阻抗匹配和阻抗连续是必须保证的,最好参考 ML461 演示板. 2. 片扩展部分,可以参考内存条模块的布线. 如果条件允许,使用内存条比自己做片扩展要容易. 3.通常尽量只作字扩展,不作深度扩展,保证DQ,DQS 这样的双向信号是一对一驱动. 4. 在TIMING 问题上,调试时要分离是读方向的问题还是写方向的问题,刚开始调试时不要加仲裁器和FIFO 模块,只调硬件接口 5. 必须完全遵照 数据手册上的状态转换和 Timing 要求,刚开始调试不可以走捷径.先保证PCB layout 是好的,再调内部逻辑. 6. 调试情况不理想,需要做试验的时候,可以用到DCM 的移相功能. 7. 开始调试的时候可以把时钟速度设定在100Mhz,调好了再向上走. 8. 最好有高档示波器和高档探头做一下PCB 上的TIMING 测量. 9. 如果测量发现多个DQS 时序有较大差异,可以需要考虑利用直接布线的方法, 实现 direct data capture & recapture 技术.
17、问:各位大哥,除以3 怎么作啊答: A)IP CORE; B)做个计数器,每次加三
18、问:请问如何用FPGA 来驱动LCD 显示
答: A)我觉得主要还是你用的什么LCD,你明白了LCD 的时序,那你就可以按LCD 需要的时序来发送数据了。LCD 当然有自己的字库了,但是一般厂商都给出来了简单的英文加点标志的字库了。 B)LCD 是个慢速器件,用FPGA 直接控制时注意一下时序匹配 C)一般16*2 的LCD 要求没那么高了,我以前用,单片机控制过,时钟才 11.0592MHz,单片机一条指令执行要12 个时钟周期,送一个命令还要几条指令呢!LCD 器件本身的Tmax, Tmin 当然是重要的了。用的是xilinx 的Virtex-II Pro 的开发板,上面说了的啦,里面有powerpc405,也要自己做一个挂在OPB 总线上面的设备,这个我还不会,因为看不懂那些vhd 代码(偶没搞过FPGA),也不晓得具体流程了。不过你只是做驱动,没必要这么做了,自己由硬件描述来搭建应该就可以了,用什么器件都不重要,而且那篇文 章主要介绍如何做挂在OPB 上面的外围设备的。如果你要做驱动,还是找LCD 芯片的资料看看啦。
19、问:FPGA CPLD 的选择
答: A)组合逻辑比较的多的用CPLD,时序电路比较多的用FPGA B)FPGA 资源比较多,做一些协议的实现,算法实现,完整控制器比较合适。CPLD 相对资源比较少一些,相对用在扩展IO 的场合、合并分立元件的场合比较多。另外,一般FPGA 是易失性的,掉电后里面内容丢失,所以一般要配一个ROM。要考虑这个成本。 C)我认为如果要做一个有运算功能的则用FPGA 比较合适,而简单的应用可用 CPLD,CPLD 可用的余量较小
20、终于自己解决了仿真中testbench 的问题!
在前一个帖子中,我提出了如下问题,希望得到大家的解决“仿真的时候 ModelSim 老是提出虚拟内存太小”。有一些网友回了贴,不管是错是对,都感谢他们的支持和意见。经过仔细对每条语句分析,终于debug 了我的testbench。其中经验分享给大家,希望大家以后吸取我的教训。我在testbench 里面写了这么一句话(目的是产生自累加记数): initial begin adc_Data <= 0; end always begin #(1000/100/2) adc_Data <= adc_Data + 1; end 错就错在那个该死的non-blocking 符号上面!为什么出现如下的问题呢?原因是"<="符号在赋值的时候采用的是绝对时间赋值,分析如下的语句即可以分析出原因: initial begin data <= 4'd0; (在t=0 时刻,将data 变为0) data <= #23 4'd8; (在t=23 时刻,将data 变为8) data <= #43 4'd15; (在t=43 时刻,将data 变为15) end 此时的时间是绝对时间(应该是绝对时刻,比较准确一些),然而还有一个中写法,是采用blocking 赋值的方法,即采用"="赋值,此时仿真器采用的是相对时间,具体如下: initial begin data = 4'd0; (在t=0 时刻,将data 变为0) data = #23 4'd8; (经过23 个单位时间,将data 变为8,此时为t=23 时刻) data = #43 4'd15; (再经过43 个单位时间,将data 变为15,此时为t=66 时刻) end 这下大家明白我上面的语句为什么ModelSim 老是提示内存空间不够了吧! initial begin adc_Data <= 0; // 在t=0 时刻adc_Data 被赋值为0 end always begin #(1000/100/2) adc_Data <= adc_Data + 1; end 这个always 语句中的"adc_Data <= adc_Data + 1"就不对了!它的意思是说在时刻(1000/100/2)的时候将adc_Data+1 后再赋值给adc_Data,此时adc_Data 得到新值。该adc_Data 值的变化重新触发always 语句,使得里面的内容重新被启动。值得注意的是,第二次对adc_Data 赋值的时候,还是在时刻(1000/100/2)!因为我用的是绝对时间!那这就出现了相当困难的问题:即需要在(1000/100/2) 时刻将adc_Data 自累加1 无数次!这在任何理论和实验中都是不可能办到的!(哪怕是Big-Bang 也要那么一点点时间啊!!瀑布汗....)将上述语句改为下述语句,轻松解决问题: initial begin adc_Data = 0; end always begin #(1000/100/2) adc_Data = adc_Data + 1; end
21、inout 在test 里如何赋值
答: A) 简单的仿真时,当inout 端口做输出时,给这个端口赋确定的信号值;inout 端口做输入时,给它赋"Z"值。 B)我以前也遇到过这样的问题,就是它的赋值问题.在综合的时候,一般是这样写的语句: inout [N-1 : 0] biDirIO; // bi-directional port input dirCtrl; // direction control reg [N-1 : 0] inReg, outReg; always@* begin if(dirCtrl) inReg = biDirIO; end assign biDirIO = dirCtrl ? {N{1'bz}} : outReg; 这样的话,在你的testbench 里面需要将该端口设置为wire 类型(切不可为 reg!)。然后在另外一方的接口处同样将biDirIO 申明成双向口,同时用dirCtrl 来控制数据的流向。我就是这样设计SDRAM 控制器和testbench 的。
22、问:买回来一根下载电缆 应该如何检查他的好坏啊
答: 1. jtag 链的界面,点右键,auto connect,可以检测线缆的好坏。 2. 或许你的下载线太长了。驱动能力不够。
23、问:关于microblaze 的中断不知道那位大侠调试过没有?
答: A)先从demo 程序开始跑,跑通后,再一点点修改。我用ml403 跑microblaze 得中断跑通了,建议你看看终端控制器的PDF 手册。 B)采用Altera PCI Megacore OpenCore plus 特性,能下载到采用Cyclone 1C6 1C12。初次配置,直接下载到配置芯片,不影响正常工作。重新关机,启动识别到设备。该PCI 包含 Master 、Target 方式,都是状态控制器在工作,产生PCI 时间关系。需要设计的为两种方式下的接口控制状态器,同样也是状态机。 对于异常的处理,都是产生于目标设备。为简单和有效,设计没有异常发生。对于外部的逻辑接口,设计为通用的RAM 时间关系。双口RAM 能很好的解决时间和数据的同步关系。对于PCI 中断,实际中验证,就是外部的低电平中断。计算机在响应到中断后,再清除该中断。在RAM 中保留中断寄存器。类似9054 的中断操作。查询该寄存器,清除该中断。
24、在Modelsim 中自动编译仿真库的方法!----非常方便,可靠!
这两天的发贴来信询问关于ModelSim 仿真的问题很多,其中很多都是因为没有正确在Modelsim 中编译仿真库造成的。为了方便大家,我改写了一个ModelSim 的宏,运行它可以自动在ModelSim 中编译Xilinx 的仿真库,可编译VHDL 和 Verilog 语言的所有常用仿真库。具体运行方法如下: 1。启动Modelsim,运行Macro 菜单的“Execute Macro...”命令,指定我所编写的tcl 文件。 2。根据自己的版本选择ISE4.x 还是ISE5.x,然后选择Verilog 还是VHDL,单击“compile”即可。关于信息和帮助信息请参考"EDACN"和"help"
25、问:高手关于两个定点数乘法的问题.
答:定点数有一个隐含的小数点,你用0010 表示1,那么小数点就在1 和最后一个0 之间,定点格式为3.1(三位整数,一位小数),经过乘法变为6.2 格式,小数部分变成了两位。所以结果的100 还是表示1。你要想跟前面保持一致,自己右移1 位。
26、DLL 应用(VHDL) library IEEE; use IEEE.std_logic_1164.all; entity CLOCK_TEST is port( ACLK : in std_logic; DIN : in std_logic_vector(1 downto 0); RESET : in std_logic; QOUT : out std_logic_vector (1 downto 0) ); end CLOCK_TEST; architecture RTL of CLOCK_TEST is component IBUFG port ( I : in std_logic; O : out std_logic); end component; component BUFG port ( I : in std_logic; O : out std_logic); end component; component CLKDLL port ( CLKIN : in std_logic; CLKFB : in std_logic; RST : in std_logic; CLK0 : out std_logic; CLK90 : out std_logic; CLK180 : out std_logic; CLK270 : out std_logic; CLKDV : out std_logic; CLK2X : out std_logic; LOCKED : out std_logic); end component; -- Glock signals signal ACLK_ibufg,high,low : std_logic; signal div_2, div_2_design : std_logic; signal ACLK0, ACLK0bufg : std_logic; attribute CLKDV_DIVIDE: string; attribute CLKDV_DIVIDE of ACLK_dll : label is "4"; begin ACLK_ibufginst : IBUFG port map ( I =>ACLK, O => ACLK_ibufg ); ACLK_bufg: BUFG port map ( I =>ACLK0, O =>ACLK0bufg); DIV_bufg: BUFG port map ( I =>div_2, O =>div_2_design); ACLK_dll : CLKDLL port map ( CLKIN =>ACLK_ibufg, CLKFB =>ACLK0bufg, RST =>low, CLK2X =>OPEN, CLK0 =>ACLK0, CLK90 =>OPEN, CLK180 =>OPEN, CLK270 =>OPEN, CLKDV =>div_2, LOCKED =>OPEN ); low<= '0' ; process (div_2_design, RESET) begin if RESET = '1' then QOUT <= "00"; elsif div_2_design'event and div_2_design = '1' then QOUT <= DIN; end if; end process; END RTL;
26、问:PFGA 验证问题
答: A)功能仿真对,时序仿真不对,或者说功能仿真和时序仿真都对但是当下去的结果就是不对的事情是很多的,这时候就要找找问题是板子的问题还是程序的问题。如果是程序的问题,首先就是换换code styel 试试,优化一下设计,去掉冗余设计。还是不行的话,就只好从系统设计上考虑了。 B)一步一步调,先调电源->加载->复位->接口->主数据通路->全功能->全面验证和优化。不要着急的说。 C)如果仿真正确,约束正确,还遇到这种情况,一般是出在程序本身!我最近也在用FPGA 做验证,也碰到类似的问题,最终确定还是程序的问题。
27、问:process 的敏感信号列表是不是要将process 中所有的输入信号都列出来,还是只列出来clock,reset,enable 就足够了,列得太多是否会出现时序混乱?
答:时序逻辑clk、rst 就够了。组合逻辑,全部要加。
28、问:ise 的工程是怎样再导入xps 的?
答:在xps 中将工程设置为子模块,options-->project options-->hierarchy and flow 再将设计导出,tools-->export, 在ise 中设计完,再在xps 中,tools-->import,
29、问:bmm 文件ise 有生成吗?还是需要自己写?
答:添加的bmm 文件在你的edk 工程目录\implementation 中找,ise 工程用的就是这个edk 工程的bmm 文件。
30、问:"在代码中例化一个IBUF+BUFG 的形式"这个具体怎么弄啊?
答:就是调用原语啊!可以参考ISE 自带的语言模板中的例子~
31、问:XILINX 的ISE 和EDK 有什么联系和区别?分别做什么用的?
答: 1、Xilinx 的FPGA 开发使用ISE,EDK 是针对FPGA 内嵌入式处理器的开发工具,包括硬的PowerPC 和软的MicroBlaze,PicoBlaze 等,其中硬的处理器只在V2Pro 中使用,但是软的处理器可以在Spartan 等低端器件中实现。 2、做FPGA 内嵌入式CPU 的开发,一样需要ISE。 3、CPU 和Logic 是协同的功能,也就是一般控制部分用CPU,复杂的运算用Logic,而不是同样的部分既要用CPU,又要用Logic 去实现。Logic 的设计肯定用ISE, EDK 负责软件部分的设计和编译,然后将目标码插入到Logic 部分生成的bit 位流中,最后再下载到FPGA 中,调试软件的时候可以利用XMD。现在EDK 中可以直接调用ISE,具体你可以看EDK 的用户文档,在Xilinx 的网站或者数据光盘中应该可以找到。
32、问:怎么在片内配置一个存储器RAM 啊?大概2KB 大小
答: A)如果用ise,较方便的方法是使用core generator 产生。另外,也可以直接调用元件原语,通过元件例化产生。core generator 很容易上手的,产生core 时,看看对应core 的datasheet。 B)用HDL 写一个出来,然后用synplify 综合。当然要写成同步的,这样综合器会使用block ram 来生成。不然的话,会占用很多slice 资源 33、问:使用ise&chipscop,版本均为7.1i03,verilog 语言,综合用xst。分别生成一个含两个36 位port 的icon,以及ila,vio。vio 只有输出没有输入?答: XST 给出的那两项警告不会对设计造成影响。请仔细检查你例化VIO 模块的时候端口匹配中连接control 的信号名称是否跟ICON 上完全对应上了,检查一下XST 报告中是否有“does not match port size”的警告信息,检查一下跟VIO 有关的信号有没有出现“assigned but never used” 或者“used but never assigned”的警告。
33、问:modelsim 下的xilinx 库
答: A)1.运行modelsim,在library 窗口右击,选NEW,选library,在对话框中选择a map to an existing library , 选择存放xilinxcorelib 的目录(\E:\Xilinx\vhdl\src\xilinxcorelib),加入此库就行了。 2.在modelsim6.0 下可能找不到此库,原因可能是这个文件架下面没有一个叫做 _info 的文件,没有这个文件,这个库就不能用,所以你可以找找别人把这个文件拷到这个目录下就行 B)ise6.2 下面直接就可以把调用的库文件编译到modesim 的仿真库当中,不用在modesim 中手动建库了吧,在ise6.2中,只要先点击你的器件名,下面有一个筐中回出现compile HDL simulation libraries ,选中它,点击右键选中property, 在选择simulator target: modesim SE , 确定之后,双击compile HDL simulation libraries,它就自动编译了.
34、问:ISE 中是否可以把自己代码封装成一个IPcore?
答:使用PlanAhead 中的将你的设计转换为PBlock,然后加上约束条件再export 就可以了。以后你要用的话,只需要import 这个PBlock 就可以了。这样做的核是硬核。当然咯,你也可以使用.edif + .ncf 这样就是固核,如果你要求灵活性最高的话,就使用RTL + constraint 这样就是软核了。
35、问:请教vhd 语言中如何插入clock buffer or DCM?格式是什么?
答: A)生成一个dcm,用component 语句加进来就可以了 B)先使用 ISE 自带的 core generator 产生 DCM(数字时钟管理单元)core。然后 进行元件例化。ISE 的设计模板中有一些参考代码~ 也可以看看~
36、问:Synplify 和ISE 怎么结合?
答: "If you keep the *.ncf file in the same directory as wherethe *.edf file is, Xilinx ISE would automatically pick it up during P&R. You could also include it like a UCF file into the project, when you add the edif file into the project."
37、问:我怎么定义FPGA 的管脚啊?怎么把顶层文件定义的输入输出和FPGA 管脚对应起来?
答: A)调用ISE 里的PACE 编辑器可以实现引脚的指配。 B)加入ucf 文件了,進行對pin 和管腳拖放就可以了,最好自己慢慢摸吧。
38、问:输入的频率为40M,输出为32M.占空比为1:1. ?
答: A)40/32=5/4=1.25=(5/2)/2;先得到2.5 分频 然后得到1.25 分频的其他的小数分频自己想办法 B)例如想要把40M CLK1 分频得到 7M CLK2 的时钟 5< 40/7 < 6 所以 m + n = 7 5m + 6n = 40 得到M=2,N=5, 在clk1 的40 个周期内,有2 个5 分频和5 个6 分频,得到clk2. 上面的例子恰好在一帧(40 个周期)内得到m,n 的整数解,如果得到m,n 的解为小数,可以增加帧数目使m,n 为整数。
39、请教外部5V 对Spartan-3(VCCO=3.3V)进行输入时怎样与5V 器件连接啊?
答:两种简单的方案: 1、可以用1K 和2K 电阻分压,适合输入信号较少的情况 2、用SN74LVC245 进行接口电压转换,适合输入信号较多的情况,如7、8 个信号或更多。SN74LVC245 进行电压转换的原理是其容忍+5V 输入。
40、问:我发现在ISE 中好像没有"编译"这个概念?
答:综合的时候,会进行语法检查。
41、问:Verilog 中reg[XXX] mem [max]; max 最大是多少啊?
答: A)没有啊,只是在TestBench 里用从文件读数据,设的小了,没问题。大了,就读不完整。 B)查了Verilog2001,标准中说这个范围可以有限制,但是必须大于2 的24 次方(16777216)。
42、问:我的ISE 是6.2,modelsim 是6.0,刚才练习用project navigator 生成测试激励模板,生成以后,点击processes for source 下的modelsim 连结,启动modelsim,当modelsim 正在启动并且编译一些文件后,突然关掉了,但是如果编译中出了错的话,modelsim 反倒会给我提示是什么错误,不知道是为什么呢?
答: modelsim 启动后会自动关闭有可能是下面一个原因:当前project 下的波形文件有错。你可以打开当前project 下.do(用文本编辑或者ultra)文件,看看第一行是否有这样的提示:current error,resume。如果出现error 字样的话,把那一行删除就可以了。
43、问:如果要在一个设计中使用到这两种语言,怎么实现混合调用呢?
答:按正常的写法,假如你是在verilog 里面调用VHDL 编写的模块,只需要按 verilog 的例化方式进行就可以了,当然要把它们都放在同一个工程里面。VHDL 里面调用verilog 也是一样的。仿真就要看你的仿真器是否支持混合语言仿真。 modelsim se 是支持混合仿真的。
44、问:时钟抖动和漂移的区别?
答: A)简单的说,如果把实际时钟和理想时钟做一个CYCLE TO CYCLE 的比对,可以分离出来两种误差,一种时长期的漂移(WANDER),一种是短时的各周期之间的抖动(jitter)。造成wander 的原因通常是温飘,电压漂移等固有的或者缓慢变化的因素。造成JITTER 的原因通常是CROSS TALK,HEAT NOISE 等原因,这些因素会附加在每个时钟周期上造成相邻的周期之间都会有随机偏差。 B)应该说抖动和飘移可以从时间的角度上来分别吧,抖动时短时间的角度上来说的,漂移是从一个比较大的时间尺度上来说的
文章评论(0条评论)
登录后参与讨论