ISE仿真中需要注意的问题
2012-06-02
iamfrankie
标签: ISE仿真

在我们团队负责的项目光栅传感器系统高频并行解调算法的FPGA实现中,需要直接频率合成模块,因此我们想在FPGA上实现一个DDS芯片的功能,最近在BASYS板上调通了DDS模块,在功能仿真过程中我们发现在ISE环境下编写VHDL时对信号赋初值对仿真是十分必要的。

由于参数的要求模块中用到了一个三分频电路。程序如下:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating

---- any Xilinx primitives in this code.

--library UNISIM;

--use UNISIM.VComponents.all;

entity fredevider3 is

port

(clock:in std_logic;

clk:out std_logic

);

end fredevider3;

architecture Behavioral of fredevider3 is

signal counter:integer range 0 to 2;

signal temp1,temp2:std_logic;

begin

process(clock)

begin

if rising_edge(clock) then

if counter=2 then

counter<=0;

temp1<=not temp1;

else

counter<=counter+1;

end if;

end if;

if falling_edge(clock) then

if counter=1 then

temp2<=not temp2;

end if;

end if;

end process;

clk<=temp1 xor temp2;

end Behavioral;

可是行为仿真后却没有预期的信号输出,看了一下message也没有任何报错的信息。

把中间信号加进去又看了一下结果,发现counter变了,但是temp1和temp2没有反应,说明程序运行了,但为什么没反应呢?如图。这个程序我以前在QUARTUS II中跑过完全没有问题为什么这里没反应呢?

我又在QUARTUS II中把程序跑了一遍,完全没有问题,仿真有结果。

刚开始以为所用软件是ISE9.1i的评估版问题,后来换用ISE8.2i完全版,问题仍然如故,郁闷,开始胡思乱想。。。是不是ISE自带的仿真器有bug?我用换了Modelsim问题还是解决不了。

后来我突然想起在VHDL中有给变量赋初值的语句,而我的程序中变量未赋初值, U的出现是不是因为变量未赋初值,查了一下VHDL的语法书”STD_LOGIC”型数据可以有九种不同的值,其中’U’代表初始值。我改了一下程序,把原来的

signal temp1,temp2:std_logic;

改为

signal temp1:std_logic:='0';

signal temp2:std_logic:='0';

仿真,问题解决了。

仔细分析一下原因应该是这样的:QUARTUS II的仿真器能够自动为信号赋一个初值,而这里在ISE中我们通过Test Bench Waveform生成测试激励文件.vhw,信号赋初值工作需要我们编程人员在编写程序时加入。我们忽略了在程序中为temp1和temp2赋初值,使得Simulator不知道temp1和temp2是什么值,才造成这种结果。

可以说思维定势是产生这个问题的直接原因,所以我们学习新东西时要注意思维定势对我们的影响,不知道各位同仁是否也遇到类似的问题,希望我的这点提醒能让大家少走弯路。

可能会用到的工具/仪表
相关文章
推荐文章
热门文章
章节目录
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号