完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
你好,我实际上是通过阅读一本书来学习VHDL,到目前为止一直都很好。
我一直在搞乱modelsim,以模拟书中的一些例子。 现在我想在我的Spartan 3-AN开发板上开始尝试更实用的东西。我设法使用一些板载开关和LED成功编译并成功运行简单的组合逻辑门。当我尝试合成一些顺序时,问题就开始了。 电路。 以下是在modelsim中完美运行的行为描述:[code] library ieee;使用ieee.std_logic_1164.all;实体模块isPort(CLK_OUT:out STD_LOGIC);结束模块;架构模块的行为i***eginprocessvariable dummy_var:STD_LOGIC:='0 '; beginwait 10 ns; dummy_var:= not dummy_var; CLK_OUT end process; end Behavioral; [/ code]试图让ISE合成上面的内容我得到以下错误信息:Pack:198 - NCD没有生成。 所有逻辑都从设计中删除。 这通常是由于没有输入或输出PAD连接......好吧,这里发生了什么?顺便说一句,我试图合成的代码缺少等待线路,我认为FPGA会在那里引入Delta延迟 ,因为时钟频率当然不是无限的。我看到FPGA内部的DCM是处理时钟的,但据我所知,我不需要做任何配置。 我需要修改板上的CLKIN信号(调理,乘以ecc ..),在我的情况下应该是50MHz。我是否需要对时钟进行某种配置? 我是否必须在我的VHDL源代码中声明一些相关内容?我知道在互联网上有很多关于此的信息,但此刻我真的迷失了。任何提示都会非常感激。谢谢! |
|
相关推荐
9个回答
|
|
FPGA不知道您的50 MHz时钟输入,除非您实际使用代码中的时钟输入 - 也就是说,无论何时编写某些特定于时序的代码,DCM都不会自动使用它。
还记得VHDL语言的相当大部分仅在模拟期间工作,并且不能被合成(例如“等待10ns”语句)。 您可以使用适用于综合的代码版本: 实体模块是 端口(CLK_OUT:输出STD_LOGIC; CLK_IN:在STD_LOGIC中); 结束模块; 架构模块的行为是 开始 处理(CLK_IN) 变量dummy_var:STD_LOGIC:='0'; 开始if(rising_edge(CLK_IN))然后dummy_var:= not dummy_var; CLK_OUT结束if; 结束过程; 结束行为; 只需记住将CLK_IN信号分配给外部振荡器所连接的任何引脚;) 上面的代码在ModelSim中也可以正常工作,你只需要自己在CLK_IN上创建一个时钟激励(例如,在波形窗口中右键单击CLK_IN并选择'Clock',然后分配一个20 ns的周期来模拟50 MHz时钟)。 |
|
|
|
谢谢sonicwave,这很有帮助!
无论如何,还有一件我真的无法理解的事情:如果我有一个包含大量顺序指令的流程怎么办? 在每个顺序指令后,我是否必须等待时钟事件? 如果不是,每个实际执行之间的延迟是多少? 我相信流程语句实际上是使用sequantial状态机实现的。 如果这是真的,那么每条指令之间的实际延迟(好吧,比方说状态)应该是每个触发器的时钟输入的函数。 起初我认为FPGA中有一条硬连线时钟线,它驱动每个片的每个触发器的时钟输入。 无论如何这似乎是错误的,但仍然,我不明白:smileysad: |
|
|
|
正如您在前面发布的代码中所看到的,该进程有一个包含CLK_IN信号的敏感列表(“process(CLK_IN);”行)。
因此,只要该信号发生变化,它就会运行。 过程中的第一个语句“if(rising_edge(CLK_IN))then”表示无论语句内部是什么语句,只有在检测到上升沿时才会运行 - 这是描述上升的标准方法之一 - 边沿触发触发器,在CLK_IN上运行。 因此,每次执行过程之间的延迟完全取决于您在时钟信号上获得上升沿的频率。 对于其他标准结构,请尝试查看ISE中的语言模板(编辑 - >语言模板 - > VHDL - >综合构造 - >编码示例 - >触发器)。 你也可以使用任何其他时钟信号 - 来自另一个外部振荡器,来自DCM的派生时钟,或来自你自己的逻辑(虽然这通常不是一个好主意;)) - 而不是你的过程中的CLK_IN,而合成器应该 将所选信号路由到触发器的时钟端口。 因此,没有单个硬连线时钟线 - 而是有许多低偏移时钟线,可用于路由您选择用作时钟的任何信号。 FPGA只能完全按照您的要求进行操作! (大部分时间至少:P) |
|
|
|
顺便说一句,我可能会建议在学习时坚持信号而不是变量。
在时钟进程中分配的信号总是实现为触发器,而变量的实现取决于你如何使用它们(如果在分配变量之前读取变量,它实现为触发器,如果你是 在阅读之前分配它)。 因此,如果坚持信号,可以更容易地跟踪一切是如何工作的......当然,其他人可能对此有不同的看法;) |
|
|
|
再次感谢您的帮助和迅速:smileyhappy:
说实话,我仍然没有得到一些关于这个的东西......无论如何,我会试着考虑一下,并对时钟和过程事情进行一些进一步的测试。 我不应该理解一些事情,我会到这里寻求一些帮助:smileyhappy: |
|
|
|
猜猜看,我被困住了:smileysad:
好吧,起初我尝试合成以下内容: 库IEEE;使用IEEE.STD_LOGIC_1164.ALL;使用IEEE.STD_LOGIC_ARITH.ALL;使用IEEE.STD_LOGIC_UNSIGNED.ALL; ----如果在此代码中实例化----任何Xilinx原语,则取消注释以下库声明.-- library UNISIM ; - 使用UNISIM.VComponents.all;实体模块是端口(CLK_50MHZ:在STD_LOGIC中; CLK_OUT:输出STD_LOGIC);结束模块;体系结构模块的行为i***egin进程(CLK_50MHZ)变量dummy_var:STD_LOGIC:='0'; 如果CLK_50MHZ ='1'则开始,则dummy_var:= not dummy_var; CLK_OUT结束if; 结束过程;结束行为; 我期待CLK_OUT引脚上的25MHz方波输出。 相反,我得到了一个奇怪的25MHz波,看起来像是在通过低通滤波器后被破坏的方波,它需要很多想象力来说它是作为方波出生的。 此时我认为FPGA配置或电路板(Spartan 3AN入门套件)出了问题。 我还认为较低的频率输出会解决(至少减弱)问题。 因此,我尝试使用以下代码(我在modelsim上测试并且效果很好): 库IEEE;使用IEEE.STD_LOGIC_1164.ALL;使用IEEE.STD_LOGIC_ARITH.ALL;使用IEEE.STD_LOGIC_UNSIGNED.ALL; ----如果在此代码中实例化----任何Xilinx原语,则取消注释以下库声明.-- library UNISIM ; - 使用UNISIM.VComponents.all;实体模块是端口(CLK_50MHZ:在STD_LOGIC中; CLK_OUT:输出STD_LOGIC);结束模块;体系结构模块的行为i***egin进程(CLK_50MHZ)变量dummy_var:STD_LOGIC:='0'; 变量缩放器:整数:= 0; 如果CLK_50MHZ ='1'则开始,然后缩放器:=缩放器+ 1; 如果scaler = 20则dummy_var:= not dummy_var; CLK_OUT缩放器:= 0; 万一; 万一; 结束过程;结束行为; 好吧,有了上面的代码,所有我得到的CLK_OUT引脚都没有! 有人知道这里发生了什么吗? 顺便说一句,以下是我的UCF文件,我想其中也可能有问题: NET“CLK_50MHZ”LOC =“E12”| IOSTANDARD = LVCMOS33; NET“CLK_OUT”LOC =“AA21”| IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW =快; #定义50 MHz振荡器的时钟周期 NET“CLK_50MHZ”周期= 20.0ns高40%; |
|
|
|
没关系,问题是“if(CLK_50MHZ ='1')然后”,合成器因此产生透明锁存器。
使用“if(CLK_50MHZ'EVENT)和(CLK_50MHZ ='1')”或“sonicwave发布的代码解决问题。 无论如何我不明白两件事: 1)为什么透明锁扣对时间来说如此重要? 它出什么问题了? 2)为什么我必须明确地写“(CLK_50MHZ'EVENT)”呢? 这个过程不应该是事件触发的吗? |
|
|
|
透明锁存器实际上没有任何根本性的错误 - 只是你没有普通FPGA中的任何一个,所以创建功能需要ISE尝试将其与luts和触发器拼凑在一起;)(
这是丰富的) 使用“if(rising_edge(clk))then”或“if(clk'event和clk ='1')”的原因是“这是为任何被分配的信号描述触发器的既定方法 在'if'语句中。 此外,如果您正在描述具有异步复位的触发器,则代码将如下所示: 进程(clk,重置) 开始 if(reset ='1')然后 出 如果缺少“'事件”部分,并且每次在灵敏度列表中的一个信号上发生转换时,过程循环就会运行,当clk ='1'并且复位从'1'变为'0'时会发生什么? ;) |
|
|
|
嗨microrulez,
VHDL有时很棘手。 您已经了解到只有可用于合成的语言的子集(例如,不等待x ns)。 但还有更多。 大多数合成过程或多或少地将简单模式转换为预定义宏。 来自sonicwave的寄存器示例以及更多内容可以在ISE的语言模板浏览器中找到(单击灯泡图标)。 锁存器的问题在于,它们不仅在一次采样,而且在一段时间内打开一个门。 在此期间,信号变化被转发到锁存器的输出。 如今,路由延迟与逻辑延迟处于相同的范围内,因此在快速电路中,这意味着当您将一些逻辑,电线和锁存器放在一起时,会产生一个有趣的(几乎不可预测的)信号模式。 所以你在第一个锁存器示例中构建的是某种具有50 MHz使能的环形振荡器。 此外,忘记delta周期。 它们只是组织模拟的一种手段。 即使你足够聪明地编写在模拟过程中利用它的代码,它在综合(以及敏感性列表)中也毫无意义。 模拟器是基于事件的(以减少模拟时间),因此过程是事件的开始。 为了给出合成的含义,必须使用event-attribute。 无论是旧方式(clk'event和clk ='1')还是使用rising_edge函数的新方法。 该功能基本上做同样的事情,但更准确。 虽然旧条件将所有内容都用于边缘,然后变为'1'(例如'U' - >'1','X' - >'1'等),该函数只接受'0' - >'1'转换 作为寄存器的有效上升沿。 如果不是那样,每个进程都是同步的,这不是预期的。 流程也可以创建组合逻辑。 有一个很好的综合 Eilert |
|
|
|
只有小组成员才能发言,加入小组>>
2379 浏览 7 评论
2794 浏览 4 评论
Spartan 3-AN时钟和VHDL让ISE合成时出现错误该怎么办?
2261 浏览 9 评论
3335 浏览 0 评论
如何在RTL或xilinx spartan fpga的约束文件中插入1.56ns延迟缓冲区?
2427 浏览 15 评论
有输入,但是LVDS_25的FPGA内部接收不到数据,为什么?
754浏览 1评论
请问vc707的电源线是如何连接的,我这边可能出现了缺失元件的情况导致无法供电
542浏览 1评论
求一块XILINX开发板KC705,VC707,KC105和KCU1500
364浏览 1评论
1959浏览 0评论
681浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 18:42 , Processed in 1.631073 second(s), Total 93, Slave 76 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号